一.结果集映射resultMap
resultType可以指定将查询结果映射为持久化类,但需要持久化类的属性名和sql查询的列名一致才能映射成功。如果数据库中的表的字段名和持久化类的属性名不一致,则需要通过resultMap将字段名和属性名建立起对应关系
例如:
数据库表bbs_employee
持久化类BbsEmployee
public class BbsEmployee {private String username;private String password;private String degree;private String email;private Boolean gender;private String imgUrl;private String phone;private String realName;private String school;.......
需要在mapper.xml文件中添加配置:
<!-- type指定映射到哪一个持久化类--><resultMap id="BaseResultMap" type="com.sandking.mybatis.pojo.BbsEmployee" ><id column="username" property="username" jdbcType="VARCHAR" /><!-- property:对应持久化类中的属性 --><!-- column:对应数据库表中的字段 --><result column="password" property="password" jdbcType="VARCHAR" /><result column="degree" property="degree" jdbcType="VARCHAR" /><result column="email" property="email" jdbcType="VARCHAR" /><result column="gender" property="gender" jdbcType="BIT" />......<result column="is_del" property="isDel" jdbcType="BIT" /></resultMap>
< resultMap >标签与< select >< insert >等标签同级
二.动态SQL
通过Mybatis为mapper映射文件提供的几种标签,实现动态**拼接**SQL,即SQL不是写死的而是根据传入的参数可以发生变化的
1.if标签
为参数设定条件,当条件满足才会将if标签内的内容拼接到向数据库发送的SQL中
if标签的使用案例:
mapper.xml文件
<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"resultType="com.sandking.mybatis.pojo.BbsEmployee">SELECT * FROM `bbs_employee`WHERE 1=1<!--添加if标签,test属性是if的条件--><if test="username != null and username !=''">AND username LIKE #{username}</if><if test="password != null and password !=''">AND password LIKE #{password}</if></select>
测试程序:
@Testpublic void testQuery(){SqlSession sqlSession = sqlSessionFactory.openSession();BbsEmployee employee = new BbsEmployee();employee.setUsername("%ad%");//传入查询参数,password的值不为空employee.setPassword("%1%");BbsEmployee bbsEmployee = sqlSession.selectOne("queryTest",employee);System.out.println(bbsEmployee);sqlSession.close();}
查询结果:
Mybatis向数据库发送的查询语句中有两个限定范围的条件,username和password
更改测试程序传入的查询参数值
@Testpublic void testQuery(){SqlSession sqlSession = sqlSessionFactory.openSession();BbsEmployee employee = new BbsEmployee();employee.setUsername("%ad%");//设置传入参数password的值为空employee.setPassword("");BbsEmployee bbsEmployee = sqlSession.selectOne("queryTest",employee);System.out.println(bbsEmployee);sqlSession.close();}
查询结果:
可以看到,因为password的值为null,不符合if标签的条件,if标签内的内容就没有拼接到向数据库发送的SQL中
2.foreach标签
如果SQL的参数是一个数组,例如:
SELECT * FROM `bbs_employee` WHERE id IN ( ? , ? , ? , ? )
需要传递id的值,而且不确定到底有多少个id值(即SQL需要根据参数的数量做相应更改),这是就需要用到foreach标签
foreach标签的使用案例:
在BbsEmployee持久化类中增加一个字符串数组
private List<String> ids;
mapper映射文件:
<select id="query3" parameterType="com.sandking.mybatis.pojo.BbsEmployee"resultType="com.sandking.mybatis.pojo.BbsEmployee">SELECT * FROM `bbs_employee`WHERE<!-- foreach标签遍历集合或数组 --><!-- collection:遍历的集合,这里是的ids属性 --><!-- item:定义被遍历的元素的名称,需要和后面的#{}中的名称对应 --><!-- open:在前面添加的sql片段 --><!-- close:在结尾处添加的sql片段 --><!-- separator:指定遍历的元素之间使用的分隔符 --><foreach collection="ids" item="id" open="id IN (" close=")"separator=",">#{id}</foreach></select>
测试程序:
@Testpublic void query3(){SqlSession sqlSession = sqlSessionFactory.openSession();BbsEmployee employee = new BbsEmployee();List<String> list = new ArrayList<String>();list.add("1");list.add("2");list.add("4");list.add("5");employee.setIds(list);List<BbsEmployee> list1 = sqlSession.selectList("query3",employee);for (BbsEmployee e:list1) {System.out.println(e);}sqlSession.close();}
查询结果:
3.include标签
用于抽取相同的SQL片段,增加重用性,减少书写量
include标签的使用案例:
<select id="query3" parameterType="com.sandking.mybatis.pojo.BbsEmployee"resultType="com.sandking.mybatis.pojo.BbsEmployee"><include refid="select"/>WHERE<foreach collection="ids" item="id" open="id IN (" close=")"separator=",">#{id}</foreach></select><sql id="select">SELECT * FROM `bbs_employee`</sql>
4.where标签
用于代替传统SQL语句中的“where 1=1”
where标签的使用案例:
传统方式:
<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"resultType="com.sandking.mybatis.pojo.BbsEmployee">SELECT * FROM `bbs_employee`WHERE 1=1<if test="username != null and username !=''">AND username LIKE #{username}</if><if test="password != null and password !=''">AND password LIKE #{password}</if></select>
使用where标签:
<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"resultType="com.sandking.mybatis.pojo.BbsEmployee">SELECT * FROM `bbs_employee`<where><if test="username != null and username !=''">AND username LIKE #{username}</if><if test="password != null and password !=''">AND password LIKE #{password}</if></where></select>
查询结果:
可以看出where标签自动去掉了username的前的AND关键字