mybatis是持久层框架,封装了JDBC,开发时只需要关注SQL语句本身,是半ORM(对象映射)框架
原始的使用步骤:
1.POM.XML文件添加相关依赖
2.创建实体类,映射数据库的字段
3.创建dao持久层接口,编写方法
4.同dao层目录下创建mapper文件,名字同接口.xml,编写SQL语句,映射接口方法
5.创建主配置文件(resource目录下)mybatis.xml,连接数据库和映射mapper文件
6.创建测试类,固定三步,获取sqlsession对象,执行SQL语句
获取sqlsession固定三大步,封装成工具类:
public class MybatisUtil {
static SqlSessionFactory build = null;
static {
//获取核心xml配置文件
InputStream ra = null;
try {
ra = Resources.getResourceAsStream("mybatis.xml");
//通过方法,获取SqlSessionFactory实例
build = new SqlSessionFactoryBuilder().build(ra);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
//通过SqlSessionFactory实例,获取sqlSession对象
return build.openSession();
}
}
mybatis动态代理,底层创建dao层接口实现类,完成SQL语句的执行:
//通过sqlSession对象调用getMapper方法传入dao层接口字节码,获取动态代理的接口实现类对象 UserDao mapper = sqlSession.getMapper(UserDao.class); //通过实现类对象调用接口方法即可 User result = mapper.selectUserById(1);
使用mybatis动态代理的要求:
1.mapper文件的namespace必须写全接口名
2.id必须写方法名
这样框架才能动态找到对应的SQL语句并执行
对比:以前是用的sqlSession对象的SQL方法,方法需要传入全接口名加id名,现在底层实现类执行SQL语句,我们只需要调用方法就行了,怎么找到mapper文件的sql定位不需要我们关心了
----------------------------------------------------------
参数类型parameterType:
mybatis会自动识别,一般不需要我们写
手动写有两种方式:
1.全类名,比如java.lang.String
2.别名:mybatis官网制定好的别名,比如Integet类型对应的是integer
参数命名:
接口方法参数是基本数据类型或者String类型,属于简单参数
1.如果参数只有一个,是简单参数,那么mapper文件使用#{}接收参数
2.如果参数有多个,是简单参数,那么接口方法的形参类型前面需要加注解@Param(value="…"),value是给参数取名可以省略,对应的mapper文件#{参数名},这个参数名必须是新取的名字
3.当参数有太多个了,可以使用对象传参,要求对象可以是任意自定义的,但是属性必须有get和set方法,比如使用现成的实体类,对应的mapper文件#{属性},只要是对象的属性就行,只是个接收器而已
4.位置参数,mybatis3.4版本新特性,mapper文件#{arg0},#{arg1}对应着dao层接口方法的形参,从左往右一一对应
5.参数可以是Map集合,对应的mapper文件#{Map集合的key},key是从Java代码里存储的元素获取
一般参数有两三个的用2方式,有四五个的用3方式,能解决全部问题了!!!
#{} 和 ${}的区别:
#{}:使用PrepareStatement作为对象执行SQL语句,效率高,可以防止SQL注入,#{}常作为列值使用,位于等号右边,可以区分数据类型,会自动加单字符串
-------------------------------------------------------------------------
${}:使用Statement作为对象执行SQL语句,效率低,使用字符串拼接方式传入SQL语句,有SQL注入风险,数据是原样使用的,不会区分数据类型,不会自动加单字符串,${}常用作列名或表名,在保证数据安全情况下使用!!!
---------------------------------------
resultType可以写三种方式:
实际上resultType对应的就是接口方法的返回值类型,只是要写全类名而已
1.全类名
2.简单类型
3.Map
resultType返回结果的过程:
resultType = “全类名”(推荐) 或者 resultType = “自定义别名”(不推荐)
查询的过程是:传入查询条件给SQL语句,mybatis执行SQL,创建实体类对象,调用set方法为属性赋值,对象的属性对应着表中列名
增加的过程是:创建实体类,为属性赋值传入SQL,mybatis执行SQL语句
删除的过程:直接传入条件给SQL语句,mybatis执行SQL
修改的过程:创建实体类通过主键ID唯一性为属性赋值,传入修改条件给SQL语句,mybatis执行SQL,ID相同的列值将被修改
给resultType取别名的步骤:
要求:必须在主配置文件配置,点进configuration标签可以看到标签顺序
resultType可以是简单类型全类名:
比如: 接口方法是 Long selectById();
对应的resultType=“java.lang.Long”
resultType可以是Map:
列名是map的key,列值是map的value,map只能查一条数据,不能查多条
比如:接口方法 Map
resultMap结果映射:
列名和属性名不对应的情况下使用,相同也能使用
用法:
1.在mapper文件定义resultMap标签,指定列名和属性名称的对应关系
2.在select标签使用属性resultMap = “resultMap标签的ID值”
------------------------------------------------------
动态SQL常用标签:
多条件查询时使用动态SQL,接口方法的参数用java对象,主要是where部分有变化,掌握if,where,foreach,sql
if:
if例子:
where:
foreach:
例子1:循环简单类型list
第二种方式:
sql:
--------------------------------------
主配置文件属性描述:
------------------------------------------------------
使用分页插件pageHelper
------------------------------------------------------------------------
简化mybatis,操作流程:
1.添加mybatis-plus相关依赖
2.创建pojo实体类,创建dao层接口,继承baseMapper类
3.baseMapper类帮我们写了CRUD方法和SQL
配置日志:
SQL是mybatis-plus完成的,是不可见的,所以我们要配置日志
在properties属性配置文件,配置相关日志
主键生成策略:
要求:数据库主键字段自增,实体类对应主键的字段加注解@IdType
自动更新时间,实现步骤:
1.删除数据库的自动更新操作
2.实体类字段上加注解
3.编写处理器



