MyBatis框架学习2
程序员文章站
2022-05-24 20:21:38
...
MyBatis的基础学
- 掌握通过Sql映射XML文件进行增删查改
- 掌握参数的使用
- 掌握动态sql语句
- 掌握esultMap
- 了解Cache的使用
MyBatis 真正的力量是在映射语句中,专注于SQL,功能强大,SQL映射的配置却是相当简单
- SQL映射文件的几个*元素(按照定义的顺序)
- cache 配置给定命名空间的缓存
- cache-ref 从其他命名空间引用缓存配置
- resultMap 用来描述数据库结果集和对象的对应关系
- sql 可以重用的SQL块,也可以被其它语句引用
- insert 映射插入语句
- update 映射更新语句
- detele 映射删除语句
- select 映射查询语句
Select是MyBatis中最常用的元素之一
Select语句有很多属性可以详细配置每一条语句
<mapper namespace="cn.dao.UserMapper">
<!-- id在命名空间中唯一的标识符 parameterType将会传入这条语句的参数类的完整类名或别名 resultType语句返回值类型的完整类名或别名-->
<select id="getUser" parameterType="int" resultType="User" >
select * from user where id=#{id}
</select>
</mapper>
<!-- 这个语句被称作为:getUser,使用一个int类型的参数, 并返回一个User类型的对象,其中键是列名,值是对应列的值-->
User user = session.selectOne("cn.dao,UserMapper.getUser",3);
String userName = user.getUserName();
需求说明
- 用户表与角色表的关联关系(多对一)
- 获取指定角色下的用户表数据列表(resultMap)
- 完成对角色表的增、删、改操作
- resultType:直接表示返回类型
- resultMap:对外部的resultMap的引用(resultType与resultType不能同时存在)
- resultMap 描述如何将结果集映射到Java对象
- resultMap 属性(id,type)
-
resultMap 子元素(id,result,association,collection)
<!-- 当数据库字段信息与对象的属性不一致的时候,使用resultMap来进行映射 --> <resultMap type="User" id="userMap"> <!-- property表示查询出来的属性对应的值赋给实体对象的哪个属性 column 从数据库中查询的属性 --> <result property="userName" column="userName"/> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userRoleName" column="roleName"/> </resultMap> <!-- map key : 列名value:列对应的值 一个外部resultMap的id,表示返回结果映射到哪一个resultMap上--> <select id="getUserListByRoleId" parameterType="Role" resultMap="userMap"> SELECT u.*,r.roleName FROM USER u,role r WHERE u.userRoleId = r.id and r.id=#{id} </select>
select的属性说明
javabean中含有对象使用association进行映射
<!-- 根据roleId获取用户列表association start-->
<resultMap type="User" id="userMap">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="userRoleName" column="roleName"/>
<!-- <association property="role" javaType="Role">
<result property="id" column="r_id"/>
<result property="roleCode" column="roleCode"/>
<result property="roleName" column="roleName"/>
</association> -->
<association property="role" javaType="Role" resultMap="roleMap"/>
</resultMap>
<!-- 将查询的值映射到role的属性中 -->
<resultMap type="Role" id="roleMap">
<result property="id" column="r_id"/>
<result property="roleCode" column="roleCode"/>
<result property="roleName" column="roleName"/>
</resultMap>
<select id="getUserListByRoleId" parameterType="Role" resultMap="userMap">
SELECT u.*,r.id as r_id,r.roleCode,r.roleName FROM USER u,role r WHERE u.userRoleId = r.id and r.id=#{id}
</select>
<!-- association end -->
javabean中含有集合对象时使用collection进行映射
<!-- 获取指定用户的地址列表collection -->
<resultMap type="User" id="searchMap">
<result property="id" column="id"/>
<collection property="addressList" ofType="Address">
<result property="id" column="a_id"/>
<result property="postCode" column="postCode"/>
<result property="addressContent" column="addressContent"/>
<result property="userId" column="userId"/>
</collection>
</resultMap>
<select id="getUserListByAddressId" parameterType="User" resultMap="searchMap">
select *,a.id as a_id from user u,address a where u.id=a.userId and u.id=#{id}
</select>
动态SQL
- MyBatis 最强大的特性之一就是它的动态语句功能,使用动态SQL完成多条件查询
-
用于实现动态SQL的元素主要有
- if
- choose、 when、otherwise
- trim、where、set
- foreach
-
通过if判断是否非空添加sql后的条件语句
<resultMap type="User" id="userMap2"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="userRoleName" column="roleName"/> </resultMap> <select id="getSearchUserList" parameterType="User" resultMap="userMap2" > select u.*,r.roleName from user u,role r <!-- 用户表与角色表关联 --> where u.userRoleId = r.id <!-- 属性不为空时执行 --> <if test="userRoleId != null"> and u.userRoleId=#{userRoleId} </if> <if test="userCode != null"> <!-- 防sql注入 模糊查询--> and u.userCode like concat('%',#{userCode},'%') </if> <if test="userName != null"> and u.userName like concat('%',#{userName},'%') </if> </select>
-
使用where和trim的控制条件
<select id="getRoleList" resultType="Role" parameterType="Role"> select * from role <!-- prefix 控制条件 prefixOverrides 第一个执行if下有and|or会自动去掉 --> <trim prefix="where" prefixOverrides="and | or"> <if test="roleCode != null"> and roleCode like concat('%',#{roleCode},'%') </if> <if test="roleName != null"> and roleName like concat('%',#{roleName},'%') </if> </trim> <!-- where下的第一个执行的if自动去掉前缀and|or --> <!-- <where> <if test="roleCode != null"> and roleCode like concat('%',#{roleCode},'%') </if> <if test="roleName != null"> and roleName like concat('%',#{roleName},'%') </if> </where> --> </select>
-
使用choose、 when、otherwise执行where控制条件
<select id="getRoleList" resultType="Role" parameterType="Role"> select * from role <where> <!-- 跟switch相似 执行了when条件后剩余的不执行 --> <choose> <when test="roleCode != null"> and roleCode like concat('%',#{roleCode},'%') </when> <when test="roleName != null"> and roleName like concat('%',#{roleName},'%') </when> <!-- 当你以上条件都不成立时默认值行otherwise --> <otherwise> </otherwise> </choose> </where> </select>
-
使用set if判断条件更改字段值
<update id="update" parameterType="User"> update user <set> <if test="userCode != null and userCode =! ''"> userCode=#{userCode}, </if> <if test="userName != null"> userName=#{userName}, </if> <if test="userPassword != null"> userPassword=#{userPassword}, </if> <if test="userRoleId != null"> userRoleId=#{userRoleId} </if> </set> where id=#{id} <!-- update user <trim prefix="set" suffixOverrides=","> <if test="userCode != null and userCode =! ''"> userCode=#{userCode}, </if> <if test="userName != null"> userName=#{userName}, </if> <if test="userPassword != null"> userPassword=#{userPassword}, </if> <if test="userRoleId != null"> userRoleId=#{userRoleId} </if> </trim> where id=#{id} --> <!--update user set userCode=#{userCode},userName=#{userName}, userPassword=#{userPassword},userRoleId=#{userRoleId} where id=#{id} --> </update>
-
foreach使用
<resultMap type="User" id="userMapRole"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> </resultMap> <!-- key:array mybatis 自动将array和list封装成map array和list为key --> <select id="getUserByUserRoleId" resultMap="userMapRole" > select * from user where userRoleId in <!-- 传过来的是数组 collection为 array,List的集合 collection 为list 实参传给roleIds --> <foreach collection="list" item="roleIds" open="(" separator="," close=")"> #{roleIds} </foreach> </select>
MyBatis缓存
一级缓存
二级缓存
二级缓存的配置
-
Mybatis的全局cache配置
<settings><setting name="cacheEnabled" value="true"/></settings>
-
在Mapper XML文件中设置缓存,默认情况下是没有开启缓存的
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
-
在Mapper XML文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache
<select id="selectAll" resultType="Emp" useCache="true">
上一篇: 屏幕适配