1、SQL映射器Mapper接口
1.1、UserMapper.java
public interface UserMapper {
User getUser(Long id);
@Select("select * from t_user")
List<User> getList();
}
1.2、UserMapper.xml
<mapper namespace="cn.itsource.mybatis.mapper.UserMapper">
<select id="getUser" parameterType="long" resultType="cn.itsource.mybatis.mapper.User">
select
u.id,u.name,u.password
from t_user u where id=#{id}
</select>
</mapper>
1.3、测试
@Test
public void getUser() {
SqlSession session = null;
session = SqlSessionUtil.getSession();
UserMapper mapper= session.getMapper(UserMapper.class);
User user=mapper.getUser(14L);
System.out.println(user);
session.close();
}
2、Mybatis的批量操作
2.1、Xml中的批量添加
foreach
collection : 源
item : 元素
separator : 分隔符
open : 以哪个字符串开始
close : 以哪个字符串结束
3、Mybatis的动态SQL
3.1、If
3.2、Choose
如果username有值,则根据username查,
如果state有值,则根据state查,
如果都没有值,则查所有
choose是多分支,多个条件只会进一个
和java的if else if else语法一致
if(username!=null){
and username like '%${username}%'
}else if(state!=null){
and state = #{state}
}else{
.....
}
3.3、Where和trim
where会自动重写第一个条件的and(如果有则去掉)
不会为条件添加and,
使用where的时候,建议为每个条件前面都加and
Trim将结果前面添加一个where,如果结果最开始有and,则重写and(去掉)
3.4、Set
set 用法与where类似
set可以重写最后一个条件后面的,(如果有,则去掉)
3.5、抽取公共标签和引用
4、(多对一)关联映射
4.1、第一种方式
Xml:
<mapper namespace="cn.itsource.mybatis._05_many2one.mapper.UserMapper"> <resultMap type="cn.itsource.mybatis._05_many2one.domain.User" id="UserMap"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="password" column="password"/> <!-- 映射一个对象类型,不适用result --> <!-- 使用association映射对象类型 --> <!-- 如果使用了association,其他的属性必须也要手动映射 --> <association property="dept" javaType="cn.itsource.mybatis._05_many2one.domain.Dept"> <id property="id" column="dept_id"/> <result property="name" column="dname"/> </association> </resultMap> <!-- 查询并返回所有的用户信息 --> <select id="selectAll" resultMap="UserMap"> <!-- select * from t_user --> SELECT u.*, d. NAME AS dname FROM t_user u LEFT JOIN t_dept d ON u.dept_id = d.id </select> </mapper>
4.2、第二种方式
UserMapper.xml
<mapper namespace="cn.itsource.mybatis._05_many2one.mapper.UserMapper"> <resultMap type="cn.itsource.mybatis._05_many2one.domain.User" id="UserMap"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="password" column="password"/> <!-- 使用第一次查询所有员工信息的结果,继续进行第二次查询,根据部门编号查部门信息 select 第二次查询的sql语句 namesapce+.id column 将第一次查询结果的哪一个列作为第二次查询的条件 property 将第二次查询的结果封装成对为哪个属性赋值 --> <association property="dept" column="dept_id" select="cn.itsource.mybatis._05_many2one.mapper.DeptMapper.selectByPrimaryKey"></association> </resultMap> <!-- 查询并返回所有的用户信息 --> <select id="selectAll" resultMap="UserMap"> select * from t_user </select> </mapper> DeptMapper.xml <mapper namespace="cn.itsource.mybatis._05_many2one.mapper.DeptMapper"> <!-- 根据编号查询并返回部门信息 --> <select id="selectByPrimaryKey" parameterType="long" resultType="cn.itsource.mybatis._05_many2one.domain.Dept"> select * from t_dept where id=#{id} </select> </mapper>
4.3、第三种方式
<?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.itsource.mybatis._05_many2one.mapper.UserMapper"> <resultMap type="cn.itsource.mybatis._05_many2one.domain.User" id="UserMap"> <!-- 多对一嵌套结果的变种:第三种方式 --> <result property="dept.id" column="dept_id"/> <result property="dept.name" column="dname"/> </resultMap> <!-- 查询并返回所有的用户信息 --> <select id="selectAll" resultMap="UserMap"> SELECT u.*, d. NAME AS dname FROM t_user u LEFT JOIN t_dept d ON u.dept_id = d.id </select> </mapper>
5、(一对多)集合映射
5.1、第一种方式
<?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.itsource.mybatis._06_one2many.mapper.DeptMapper"> <resultMap type="cn.itsource.mybatis._06_one2many.domain.Dept" id="DeptMap"> <id property="id" column="did"/> <result property="name" column="dname"/> <!-- 只要用了collection,其他的所有的属性都必须手动映射 collection 用来映射集合 property (集合)对象的属性值 ofType 集合的泛型类型,集合中每一个元素的类型 --> <collection property="users" ofType="cn.itsource.mybatis._06_one2many.domain.User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="password" column="password"/> </collection> </resultMap> <!-- 查询并返回所有的部门信息 --> <select id="selectAll" resultMap="DeptMap"> <!-- select * from t_dept --> <!-- sql查询所有部门以及对应的用户信息 --> SELECT d.id AS did, d. NAME AS dname, u.* FROM t_dept d LEFT JOIN t_user u ON d.id = u.dept_id </select> </mapper>
5.2、第二种方式
<?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.itsource.mybatis._06_one2many.mapper.DeptMapper"> <!-- 手动映射没有找到映射的列,继续进行自动映射 --> <resultMap type="cn.itsource.mybatis._06_one2many.domain.Dept" id="DeptMap"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="users" select="selectUserByDeptId" column="id"></collection> </resultMap> <!-- 查询并返回所有的部门信息 --> <select id="selectAll" resultMap="DeptMap"> select * from t_dept </select> <!-- 嵌套查询的sql,根据部门编号查询用户信息 --> <select id="selectUserByDeptId" parameterType="long" resultType="cn.itsource.mybatis._06_one2many.domain.User"> select * from t_user where dept_id = #{dept_id} </select> </mapper>
6、缓存
6.1、一级缓存
SqlSession级别缓存,缓存对象存储周期为第一次获取,到sqlsession被销毁掉,或是sqlSession().clearCache()的时候销毁。在嵌套查询中已经看到。
6.2、二级缓存
SqlSessionFactory级别缓存,缓存对象存储周期为第一次获取,到SqlSessionFactory被销毁掉(应用停止了);
6.3、注意事项:
1、默认情况下,只开启一级缓存,如果需要开启二级缓存我们需要在DomainMapper.xml添加一个<cache/>标签。:开启二级缓存
2、 需要缓存的对象,domain对象.应该实现java.io.Serializable;