1.Mapper映射文件和接口的关系
2.typeAliases
1.MyBatis Sql节点和ResultMap
1.1sql节点
通常用来定义局部的sql片段,达到重用的效果,通过在其它的sql中包含,例如:
<sql id="columns">
leixing_id,ming, yanyuan, daoyan, piaojia, tupianlujing
</sql>
<insert id="insertDianYing" parameterType="DianYingXinXi">
insert into dian_ying(<include refid="columns"></include>)
values(#{leixingId},#{ming},#{yanYuan},#{daoYan},#{piaoJia},#{tuPianLuJing})
</insert>
<insert id="insertDianYing" parameterType="DianYingXinXi" useGeneratedKeys="true"
keyProperty="id">
使用useGeneratedKeys,对于自增长的id值,插入成功后,数据库自增id值会返回到实体类的keyProperty所设置的属性中
//观察执行结果
DianYingXinXi dy = new DianYingXinXi();
dy.setDaoYan("张艺谋xx");
dy.setLeixingId(2);
dy.setMing("红高粱呵呵xx");
dy.setPiaoJia(110f);
dy.setYanYuan("巩俐章子怡xxx");
System.out.println("插入数据库之前访问实体类id: "+dy.getId());
dao.insertDianYing(dy);
System.out.println("插入数据库之后访问实体类id:"+dy.getId());
.......
sequence …了解
1.2ResultMap
如果sql语句的列名和实体类属性名不同名,那么可以用resultMap代替resultType.resultMap更加灵活
<resultMap type="DianYingXinXi" id="result">
<id property="id" column="id"/>
<result property="leiXingId" column="leixing_id"/>
<result property="ming" column="ming"/>
<result property="yanYuan" column="yanYuan"/>
<result property="daoYan" column="daoYan"/>
<result property="piaoJia" column="piaoJia"/>
</resultMap>
<select id="chaDianYing" resultMap="result">
select id, leixing_id, ming, yanyuan, daoyan, piaojia from dian_ying
</select>
映射说明:
<resultMap id="result 结果映射id" type="结果映射的实体类(或别名)">
<id property="id" column="id"/>
<result property="leiXingId 属性名" column=" leixing_id 列名"/>
<result property="ming" column="ming"/>
<result property="yanYuan" column="yanYuan"/>
<result property="daoYan" column="daoYan"/>
<result property="piaoJia" column="piaoJia"/>
</resultMap>
<!--select节点映射查询-->
<select id="chaDianYing 查询语句的id" resultMap="result 返回的结果集使用的结果映射id">
select id, leixing_id, ming, yanyuan, daoyan, piaojia from dian_ying
</select>
提示:默认情况下MyBatis的自动映射是开启的(和列名同名的属性自动映射),所以,resultMap节点的映射,对于列名和实体类属性名同名的那些result可以省略,resultMap中列名找不到相应的result节点或者id节点,会自动根据列名找实体类中的同名属性(不区分大小写)
2.动态Sql
2.1if
if :test 中表达式是true 就会拼接上 之间的sql片段, 这个表达式操作数来自于实体类属性值
<select id="selectByEntity" parameterType="DianYingXinXi" resultMap="result">
select * from dian_ying where 1=1
<if test="属性名的关系 逻辑 运算 "> and id=#{id}</if>
<if test="leixingId != null"> and leixingId=#{leixingId}</if>
......
</select>
2.2 choose
节点的test表达式 从上往下依次判断 出现一个表达式为ture 的 就将之间的sql片段拼接 ,下面的when不再执行.
select * from dian_ying where 1=1
<choose>
<when test="属性名的关系 逻辑 运算">and sql 片段</when>
<when test="属性名的关系 逻辑 运算">and sql 片段</when>
<when test="属性名的关系 逻辑 运算">and sql 片段</when>
<otherwise>sql 片段</otherwise>
</choose>
2.3 where
自动生成where子句 其中根据if test 为true的 拼接,不需要自己编写where子句,sql中不带where关键字,if中的条件都带and,动态处理时会自动去掉第一个and.
<select id="selectByEntity" parameterType="DianYingXinXi" resultMap="result">
select * from dian_ying
<where>
<if test="属性名的关系 逻辑 运算 "> and id=#{id}</if>
<if test="leixingId != null"> and leixingId=#{leixingId}</if>
......
</where>
</select>
2.4 set
自动生成set子句 根据If test 为true的拼接上,set节点会自动去掉set子句中最后一个表达式后面的逗号,使得set子句合法
<update id="updateDianYingDynamic" parameterType="DianYingXinXi" >
update dian_ying
<set>
<if test="daoyan != null">
DAOYAN=#{daoyan},
</if>
<if test="leiXingId != null">
leixing_id=#{leiXingId},
</if>
<if test="ming != null">
ming=#{ming},
</if>
<if test="yanyuan != null">
yanyuan=#{yanyuan},
</if>
<if test="piaojia != null">
piaojia=#{piaojia},
</if>
</set>
where id=#{id}
</update>
2.5 foreach 了解
另外一个动态 SQL 通用的必要操作是迭代一个集合, 通常是构建在 IN 条件中的。 比如:
<select id="dynamicForeach" parameterType="TiaoJian" resultMap="result">
select * from dian_ying
where leixing_id in
<foreach collection="leiXingIds" item="lx" open="(" close=")" separator=",">
#{lx}
</foreach>
</select>
foreach元素的属性主要有item,index,collection,open,separator,close。
item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")“合用。常用在in(),values()时。该参数可选
separator:元素之间的分隔符,例如在in()的时候,separator=”,“会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
close: foreach代码的关闭符号,一般是)和open=”("合用。常用在in(),values()时。该参数可选。
collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。如上例.
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
2.6 trim
可以为包含的sql拼接前缀 和后缀
一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
以下是trim标签中涉及到的属性:
属性 描述
prefix 给sql语句(trim包起来的sql片段)拼接的前缀
suffix 给sql语句(trim包起来的sql片段)拼接的后缀
prefixOverrides 去除sql语句(trim包起来的sql片段)前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
suffixOverrides 去除sql语句(trim包起来的sql片段)后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定
<insert id="insertDianYing" parameterType="DianYingXinXi">
insert into dian_ying
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="leiXingId!=null">
leixing_id,
</if>
<if test="ming!=null">
ming,
</if>
<if test="yanyuan!=null">
yanyuan,
</if>
<if test="daoyan!=null">
daoyan,
</if>
<if test="piaojia!=null">
piaojia,
</if>
</trim>
<trim prefix="values(" suffix=")" suffixOverrides=",">
<if test="leiXingId!=null">
#{leiXingId},
</if>
<if test="ming!=null">
#{ming},
</if>
<if test="yanyuan!=null">
#{yanyuan},
</if>
<if test="daoyan!=null">
#{daoyan},
</if>
<if test="piaojia!=null">
#{piaojia},
</if>
</trim>
</insert>
2.7 bind 了解
bind绑定可以将ognl表达式的值绑定到一个变量中,后面可以引用这个变量的值,尤其sql语句拼接字符串时常用
例如:
<select id="chaDianYingLike" parameterType="DianYingXinXi">
<bind name="mingHaHa" value="'%'+ming+'%'"/>
select * from dian_ying where ming like #{mingHaha}
</select>