使用MyBatis实现条件查询
1. SQL映射文件
MyBatis真正强大之处就在于SQL映射语句,也是它的魅力所在。经过简单的对比SQL映射配置和JDBC代码,发现使用SQL映射文件配置可减少50%以上的代码量。并且MyBatis专注于SQL,对于开发人员来说,也可极大限度的进行SQL调优,以保证性能。下面是关于SQL映射文件的几个顶级元素配置:
- mapper:映射文件的根元素节点,只有一个属性manespace(命名空间),其作用是为了区分不同的mapper,全局唯一还有就是绑定DAO接口。
- cache:配置给定命名空间的缓存
- cache-ref:从其他命名空间引用的缓存配置
- resultMap:用来描述数据库结果集和对象的对应关系
- sql:可以重用的SQL块,也可以被其他语句引用
- insert: 映射插入语句
- update:映射更新语句
- delete:映射删除语句
- select:映射查询语句
2. 使用select完成条件查询
<select id="getBranchesByBusinessNo" resultType="pojo.Branches" parameterType="pojo.Branches">
SELECT * FROM branches WHERE businessNo LIKE CONCAT('%',#{businessNo},'%')
</select>
- id:命名空间中唯一的标识符,可以被用来引用这个语句
- parameterType:表示查询语句传入参数的类型的完全限定名或别名
- resultType:查询语句返回结果类型的完全限定名或别名。
3. 使用resultMap完成查询结果的展示
修改POJO(User.java),增加userRoleName属性和getAge()方法
通过resultMap来映射自定义结果。
resultMap元素的属性值和子节点:
- id属性:唯一标识,此id值用于select元素resultMap属性的引用;
- type属性:表示该resultMap的映射结果类型;
- result子节点:用于标识一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的值赋给实体对象的哪个属性。
- resultType:resultType直接表示返回类型,包括基础数据类型和复杂数据类型。
- resultMap:resultMap则是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上。
它的应用场景一般是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果。 - resultType和resultMap的关联:在MyBatis进行查询映射的时候,其实查询出来的每个字段值都放在一个对应的Map里面,其中键是字段名,值则是其对应的值。
- resultMap的自动映射级别:默认的映射级别为PARTIAL。
注意:在MyBatis的select元素中,resultType和resultMap本质上是一样的,都是Map数据结构。
但需要明确一点:resultType属性和resultMap属性绝对不能同时存在,只能二者选其一使用。
使用MyBatis实现增删改操作
1. 使用insert完成增加操作
注意:该类型的操作本身默认返回执行sql影响的行数,所以dao层的接口方法的返回值一般设置为int类型,最好不要返回boolean类型
Insert/update/delete元素中均没有resultType属性,只有查询操作需要对返回结果类型(resultType/resultMap)进行相应的指定
Factory.openSession(false);//自动提交事务
2. 使用update完成修改操作
增加uptateBranches(int id)方法
public int updateBranches(int id);
要修改的Branches对象作为入参,返回值为int类型,即返回执行收影响的行数
<update id="updateBranches" parameterType="pojo.Branches">
UPDATE branches SET businessNo = #{businessNo}
, name = #{name}
, cityArea = #{cityArea}
, telephone = #{telephone}
, summary = #{summary}
WHERE id = #{id}
</update>
接下来编写测试类
/**
* 修改网点信息
*/
public static void testUpdateBranches() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.createSqlSession();
Branches branches = new Branches();
branches.setId(1);
Branches branches1 = sqlSession.getMapper(BranchesMapper.class).getBranchesById(branches.getId());
branches1.setName("郴州支行");
int res = sqlSession.getMapper(BranchesMapper.class).updateBranches(branches1);
System.out.println(res>0?"修改成功!":"修改失败");
sqlSession.commit();
} catch (Exception e) {
// TODO: handle exception
sqlSession.rollback();
}finally {
MyBatisUtil.colseSqlSession(sqlSession);
}
}
3. 使用@Param注解实现多参数入参
直接进行多参数入参,代码可读性高,可清晰的看出这个接口方法所需的参数是什么
public int updatePwd(@Param("id") Integer id, @Param("userPwd") String pwd);
如果不使用@Param注解提出使用多参数入参的方式进行订单列表的查询操作,则会报错!
使用resultMap实现高级结果映射
1. 使用delete完成删除操作
MyBatis实现删除操作,是使用delete元素来映射删除语句。
/**
* 删除网点信息
* @param id
* @return
*/
public int delBranches(int id);
resultMap的基本配置项:
- 属性:
id:resultMap的唯一标识
type:表示该resultMap的映射结果类型(通常是java实体类) - 子节点:
id:一般对应数据库中该行的主键id,设置此项可以提升mtBatis性能
result:映射到JavaBean的某个“简单类型”属性,如基础数据类型、包装等
字节的和result均实现最基本的结果集映射,将列映射到简单数据类型的属性。
2. association
映射到javaBean的某个复杂属性,比如javaBean类,即内部嵌套一个复杂数据类型属性,这种情况就属于复杂类型的关联,但是注意:assoiction仅处理一对一的关系
3. collection
Collection元素作用和assoication元素作用差不多一样,也是映射到javaBean的某个复杂类型属性,只不过这个属性是一个集合列表,即javaBean内部嵌套一个复杂数据类型(集合)
resultMap自动映射级别和MyBatis缓存
1. resultMap自动映射级别
- NONE:禁止自动匹配
- PARTIAL(默认):自动匹配所有属性,有内部嵌套(association、collection)的除外
- FULL:自动匹配所有
2. MyBatis缓存
一级缓存:
基于PerpetualCache的hashMap本地缓存,作用范围为session域内。当session flush或者close之后,该session中所有的cache就会被清空
二级缓存:
二级缓存就是global caching超出session范围之外,可以被所有sqlSession共享,开启它只需要在myBatis的核心配置文件(config.xml)setting中设置即可