-
Mybatis简介
- 优秀的持久层框架(ORM框架(object relation mapping):半自动持久框架)
- 它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
- 完成表和实体类的一个映射
- Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回
-
框架与内库
-
框架:半成品,我们根据业务需求在框架上进行扩展或者修改。(就比如像填空题)。使用框架:1.导包2.对象3.方法,框架中使用技术:1:XML解析 2:反射
-
内库:封装一些功能。(就像选择题)
-
Mybatis使用及环境搭建
- 导包
- 配置全局配置文件mybatis.xml,
transactionManager---配置事务管理 JDBC---事务使用原生JDBC管 MANAGED---不使用事务 dataSource:unpooled---不使用数据库连接 pooled---使用数据库连接. 也可以引入本地dtd:window—pre—搜Xml—xmlcatalog—add—systemID—loaction(本机dtd文件路径)—key(http://mybatis.org/dtd/mybatis-3-config.dtd)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="cn.gok.entity"/><!-- 配置包名,可以直接使用类名 --> </typeAliases> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/students"/> <property name="username" value="root"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/gok/mapper/Stu-mapper.xml"/> </mappers> </configuration>
3 .建立实体类和数据表(类名和实体类的属性名)
package cn.gok.entity;
/**
* 实体类
* @author HS
*/
public class Stu {
private int s_no;
private String s_name;
private String s_password;
public int getS_no() {
return s_no;
}
public void setS_no(int s_no) {
this.s_no = s_no;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public String getS_password() {
return s_password;
}
public void setS_password(String s_password) {
this.s_password = s_password;
}
public Stu(int s_no, String s_name, String s_password) {
super();
this.s_no = s_no;
this.s_name = s_name;
this.s_password = s_password;
}
public Stu() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Stu [s_no=" + s_no + ", s_name=" + s_name + ", s_password=" + s_password + "]";
}
}
4.新建一个mapper包专门用来存放映射XML,新建Stu-mapper.xml,里面书写基本的操作。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.gok.dao.StuDao">
<select id="findAllStu" resultType="Stu">
select * from stu
</select>
<!-- 此处不设置参数类型也可以用 -->
<select id="findOneStu" resultType="Stu">
select * from stu where s_no=#{s_no} and s_name=#{s_name}
</select>
<select id="countAll" resultType="int">
select count(*) from stu
</select>
<update id="updateOne">
update stu
<set>
s_no=#{s_no},s_name=#{s_name},s_password=#{s_password}
</set>
<where>s_no=#{s_no}</where>
</update>
<insert id="insertOne" parameterType="Stu">
insert into stu values(s_no,#{s_name},#{s_password})
</insert>
</mapper>
5.编写测试类,在测试类里面获取sqlsession,对数据库操作。
package cn.gok.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.gok.entity.Stu;
public class MainTest {
public static void main(String[] args) throws FileNotFoundException {
SqlSessionFactory ssf=null;
SqlSession ss=null;
InputStream in=new FileInputStream(new File("src/mybatis.xml"));
//sqlsession工厂从sqlsession工厂建造者获取得到
ssf=new SqlSessionFactoryBuilder().build(in);
//sqlsession从工厂得到
ss=ssf.openSession();
//用来设定操作对应的类名,方便后面直接拼字符串就好
String statement="cn.gok.dao.StuDao";
//此部分测试返回对象构成的list
List<Stu> list=ss.selectList(statement+".findAllStu");
for (Stu stu : list) {
System.out.println(stu);
}
//此部分测试查询单个的对象,不指定参数类型,可以传对象也可以map
Stu stu1=new Stu(1, "chen","");
Stu stu=ss.selectOne(statement+".findOneStu", stu1);
System.out.println(stu);
Map map = new HashMap<>();
map.put("s_no", 2);
map.put("s_name","shu");
Stu stu2=ss.selectOne(statement+".findOneStu", map);
System.out.println(stu2);
//此部分测试查询返回int类型
int count =ss.selectOne(statement+".countAll");
System.out.println(count);
//此部分测试更新update,返回值是匹配到的个数,而不是改变的个数
Stu stu3= new Stu(2, "shushu", "888888");
int update_num=ss.update(statement+".updateOne", stu3);
ss.commit();
System.out.println("更新"+update_num+"条数据");
//测试insert
Stu stu4= new Stu(5, "shushu", "888888");
int insert_num=ss.insert(statement+".insertOne", stu4);
ss.commit();
System.out.println("插入"+insert_num+"条数据");
//因为mybatis把事务抽象到了TransactionManager中,而事务默认开启,
//所以我们只需要使用sqlSession.commit()和rollback()方法,因为在sqlSession中,
//实际上调用的是transactionManager来完成的具体的事务提交和回滚操作。
}
}
结果:
参数传递
1.#{}
a)index:按照下标来给值。注意:下标从0
b)param1
#和$区别
1.#使用的?占位符来设置参数---可以防止SQL注入
2.$通过拼接SQL来实现。
别名:
Configuation---typeAils---pakecage 对整个包取别名
引用是可以直接应用实体类。
附一个Mybatis新手使用博客地址: