目录
1、核心配置文件
核心配置文件包含了Mybatis最核心的设置和属性信息,如数据库连接、事务、连接信息等
- <configuration>:核心根标签
- <properties>:引入数据库连接信息配置文件标签
- <typeAliases>:起别名标签
- <environments>:配置数据库环境标签
- <environment>:配置数据库信息标签
- <transactionManager>:事务管理标签
- <dataSource>:数据源标签
- <property>:数据库连接信息标签
- <mappers>:引入映射配置文件标签
2、MyBatis接口代理实现Dao层
- 传统方式实现Dao层,既要写接口,还要写实现类,而MyBatis框架可以帮助省略编写Dao层接口的实现步骤,程序只要编写接口,由Mybatis框架根据接口的定义来创建该接口的动态代理对象。
- 实现规则:
- 映射文件中的名称空间必须和Dao层接口的全类名相同
- 映射配置文件中的增删改查标签的id属性必须和Dao层接口的方法名相同
- 映射配置文件中的增删改查标签的parameterType属性必须和Dao层接口方法的参数相同
- 映射配置文件中的增删改查标签的resultType属性必须和Dao层接口方法的返回值相同
- 分析动态代理对象如何生成:通过动态代理开发模式,只编写一个接口,不实现类,通过getMapper()方法最终获取到org.apache.ibatis.binging.MapperProxy代理对象,然后执行功能,而这个代理对象正是MyBatis使用了JDK的动态代理技术,帮助我们生成了代理实现类对象,从而可以进行相关持久化操作。
- 分析方法如何执行的:动态代理实现类对象在执行方法的时候最终调用了mapperMethod.execute()方法,这个方法中通过switch语句根据操作类型来判断是新增、修改、删除、查询操作,最后一步返回到了MyBatis最原生的SqlSession方式来执行增删改查。
2.1 @Param注解
作用是给参数起名字的
当我们的SQL语句中有多个参数,而且没有封装到一个具体对象时,就可以借助这个注解来给每一个参数起不同的名字
参数命名之后就能根据名字得到参数值,正确得将参数传入到SQL语句中
3、动态SQL
MyBatis映射配置文件中,当业务比较复杂时,SQL就是动态变化的,此时简单的SQL就不能满足要求了
例如:
1、id:3 name:王五 age:25
SELECT * FROM student WHERE id = ? AND name=? AND age = ?
2、id:3 name:王五
SELECT * FROM student WHERE id = ? AND name=?
3.1 动态SQL标签
<if>:条件判断标签
<foreach>:循环遍历标签
3.1.1 <if>标签
例如:上面两个例子,传入的参数不同,分别为三个和两个,那么需要写两次sql语句,但是动态只需写入一次,如下:
<select id="selectCondition" resultType="student" paramterType="student">
SELECT * FROM student
<where>
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="id != null">
AND age = #{age}
</if>
</where>
</select>
3.1.2 <foreach>标签
- <foreach>:循环遍历标签,适用于多个参数或者的关系
<foreach collection="" open="" close="" item="" separator="">
获取参数
</foreach>
属性:
collection:参数容器类型,(list-集合,array-数组)
open:开始的SQL语句
close:结束的SQL语句
item:参数变量名
separator:分隔符
例如:获取id为1或者2或者3的学生
<select id="selectByIds" resultType="student" parapmeterType="list">
SELECT * FROM student WHERE id IN (1,2,3)
</select>
使用动态SQL语句则为
<select id="selectByIds" resultType="student" parapmeterType="list">
SELECT * FROM student
<where>
<foreach collection="list" open="id IN (" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
3.2、SQL片段抽取
可以将重复性的SQL语句进行抽取,以达到复用的效果
- <sql>:抽取SQL语句标签
<sql id="片段唯一标记"> 抽取的sql语句</sql>
- <include>:引入SQL片段标签
<include refid="片段唯一标识" />
3.3 动态SQL
- 动态SQL指的就是SQL语句可以根据条件或者参数的不同进行动态的变化
- <where>:条件标签
- <if>:条件判断标签
- <foreach>:循环遍历的标签
- <sql>:抽取SQL片段的标签
- <include>:引入SQL片段的标签
4、分页插件介绍
在企业级开发中,分页也是一种常见的技术,而目前使用的MyBatis是不带分页功能的,如果想实现分页的功能,需要手动编写LIMIT语句。但是不同的数据库实现分页的SQL语句也是不同的,所以手写分页成本较高。这个时候可以借助分页插件来帮助我们实现分页的功能
- PageHelper:第三方页助手,将复杂的分页操作进行封装,从而使分页功能变得非常简单
4.1 分页
- 分页:可以将很多结果进行分页显示
- 分页插件jar包:pagehelpher-5.1.10.jar jsqlparser-3.1.jar
- <plugins>:集成插件标签
- 分页助手相关API
- PageHelper:分页助手功能类
- startPage():设置分页参数
- PageInfo:分页相关参数功能类
- getTotal():获取总条数
- getPages():获取总页数
- getPageNum():获取当前页
- getPageSize():获取每页显示条数
- getPrePage():获取上一页
- getNextPage():获取下一页
- isIsFirstPage():获取是否是第一页
- isIsLastPage():获取是否是最后一页
5、MyBatis多表操作
多表模型分类:
- 一对一:在任意一方建立外键,关联对方的主键
- 一对多:在多的一方建立外键,关联一的一方的主键
- 多对多:借助中间表,中间表至少两个字段,分别关联两张表的主键
5.1 一对一
- <resultMap>:配置字段和对象属性的映射关系标签
id属性:唯一标识
type属性:实体对象类型
- <id>:配置主键映射关系标签
- <result>:配置非主键映射关系标签
column:表中字段名称
property属性:实体对象变量名称
- <association>配置被包含对象的映射关系标签
property属性:被包含对象的变量名
javaType:被包含对象的数据类型
pubilc class Card{
private Integer id;
private String number;
private Person p;
}
pubilc class Person{
private Integer id;
private String name;
private Integer age;
}
<resultMap id="oneToOne" type="card">
<id column="cid" property="id"/>
<result column="number" property="number"/>
<!--
association:配置包含对象的映射关系
property:被包含对象的变量名
javaType:被包含对象的数据类型
-->
<assocation property="p" javaType="person">
<id column="pid" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</assocation>
<resultMap>
<select id="selectAll" resultMap="oneToOne">
SELECT c.id cid, number, pid ,NAME, age FROM card c, person p WHERE c.pid = p.id
</select>
5.2 一对多
- <resultMap>:配置字段和对象属性的映射关系标签
id属性:唯一标识
type属性:实体对象类型
- <id>:配置主键映射关系标签
- <result>:配置非主键映射关系标签
column:表中字段名称
property属性:实体对象变量名称
- <collection>配置被集合对象的映射关系标签
property属性:被包含对象的变量名
ofType:被包含对象的数据类型
pubilc class Student{
private Integer id;
private String name;
private Integer age;
}
pubilc class Classes{
private Integer id;
private String name;
private List<Student> students;
}
<resultMap id="oneToMany" type="classes">
<id column="cid" property="id"/>
<result column="cname" property="name"/>
<!--
association:配置包含对象的映射关系
property:被包含对象的变量名
ofType:被包含对象的数据类型
-->
<collection property="students" ofType="student">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="sage" property="age"/>
</collection>
<resultMap>
<select id="selectAll" resultMap="oneToMany">
SELECT c.id cid, c.name cname,s.id sid, s.name sname, s.age age FROM classes c, student s WHERE c.id = s.cid
</select>
5.3 多对多
- <resultMap>:配置字段和对象属性的映射关系标签
id属性:唯一标识
type属性:实体对象类型
- <id>:配置主键映射关系标签
- <result>:配置非主键映射关系标签
column:表中字段名称
property属性:实体对象变量名称
- <association>配置被包含对象的映射关系标签
property属性:被包含对象的变量名
ofType:被包含对象的数据类型
5.4 多表操作总结
- <resultMap>:配置字段和对象属性的映射关系标签
id属性:唯一标识
type属性:实体对象类型
- <id>:配置主键映射关系标签
- <result>:配置非主键映射关系标签
column:表中字段名称
property属性:实体对象变量名称
- <association>配置被包含对象的映射关系标签
property属性:被包含对象的变量名
javaType:被包含对象的数据类型
- <collection>配置被集合对象的映射关系标签
property属性:被包含对象的变量名
javaType:被包含对象的数据类型
6、MyBatis注解实现多表操作
6.1 一对多
- @Results:封装映射关系的父注解
- Result[] value():定义了Result数组
- @Result:封装映射关系的子注解
- column属性:查询出的表中字段名称
- property属性:实体对象中的属性名称
- javaType属性:被包含对象的数据类型
- many属性:一对多查询固定的属性
- @Many:一对多查询的注解
- select属性:指定调用某个接口中的方法
例如:一个班级对应多个学生
public class Classes{
private Integer id;
private String name;
private List<Student> students;
}
@select("SELECT * FROM classes")
@Results({
@Result(column="id", property="id"),
@Result(column="name", property="name"),
@Result(
property="students", //被包含对象的变量名
javaType=List.class, //被包含对象的实际数据类型
column="id", //根据查询出的classes表的id字段来查询student表
/*
many,@many一对多查询的固定写法
select属性:指定调用哪个接口中的多个查询方法
*/
many = @Many(select="com.one_to_many.StudentMapper.selectByCid")
)
})
6.2 多对多
- @Result:封装映射关系的父注解
- Result[] value():定义了Result数组
- @Result:封装映射关系的子注解
- column属性:查询出的表中字段的名称
- property:实体对象中的属性名称
- javaType属性:被包含对象的数据类型
- many属性:一对多查询固定属性
- @Many:一对多查询的注解
- select属性:指定调用某个接口中
例如:多个学生对应多个课程,(其中有个中间表stu_cr,sid为学生表的外键,cid为课程的外键)
public class Student{
private Integer id;
private String name;
private Integer age;
private List<Course> courses;
}
public interface CourseMapper{
//根据学生id查询所选课程
@select("SELECT c.id, c.name FROM stu_cr sc, course c WHERE sc.cid = c.id AND sc.sid=#{id}*)
public abstract List<Course> selectBySid(Integer id);
}
@select("SELECT * FROM Student")
@Results({
@Result(column="id", property="id"),
@Result(column="name", property="name"),
@Result(column="age", property="age"),
@Result(
property="courses", //被包含对象的变量名
javaType=List.class, //被包含对象的实际数据类型
column="id", //根据查询出的classes表的id字段来查询student表
/*
many,@many一对多查询的固定写法
select属性:指定调用哪个接口中的多个查询方法
*/
many = @Many(select="com.many_to_many.CourseMapper.selectBySid")
)
})
6.3、注解多表操作小结
- @Results:封装映射关系的父注解
- Result[] value():定义了Result数组
- @Result:封装映射关系的子注解
- column属性:查询出的表中字段名称
- property属性:实体对象中的属性名称
- javaType属性:被包含对象的数据类型
- one属性:一对一查询固定属性
- many属性:一对多查询固定属性
- @One:一对一查询的注解
- select属性:指定调用某个接口中的方法
- @Many:一对多查询的注解
- select属性:指定调用某个接口中的方法
7、MyBatis构建SQL语句
- Org.apache.ibatis.jdbcSQL:构建SQL语句的功能类,通过一些方法来代替SQL语句的关键字
SELECT()
FROM()
WHERE()
INSERT_INTO()
VALUES()
UPDATE()
DELETE_FROM()
- @SelectProvider:生成查询用的SQL语句注解
- @InsertProvider:生成新增用的SQL语句注解
- @UpdateProvider:生成修改用的SQL语句注解
- @DeleteProvider:生成删除用的SQL语句注解
type属性:生成SQL语句功能类对象
method属性:指定调用的方法