映射文件
1.大致结构
1.根节点中命名空间=mapper接口全限名
2.子节点 二级缓存的启动
3.子节点 声明属性和列的对应
4.子节点 sql的语句
<mapper namespace="UserMapper的全限名">
<!--使用缓存-->
<cache/>
<!-- 声明属性和列的对应 -->
<resultMap/>
<!-- sql标签 -->
<insert/>+<select/>+<delete/>+<update/>
</mapper>
2.属性和列的对应
1.<resultMap>
标签的属性:
- rype:表示映射的domain类(本来用全限名,可在配置文件起别名,直接用简单名User)
- id:该标签的名字, 取为(user_mapping)
2.<resultMap>
标签的子标签:
<id>
:用于声明主键列和属性<result>
: 用于声明普通列和属性
3.子标签的属性:
- column:表示数据库的列名
- property:表示domain中的属性名
<!-- 声明属性和列的对应 -->
<resultMap type="User" id="user_mapping">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="birthday" property="birthday"/>
</resultMap>
<!-- 此处birthday的类型的Date 对应数据库的datetime,但会根据数据库的类型自动转换(比如数据库为time,最后保留时分秒) -->
3.sql标签
1 . 种类 :增删改查
<insert id="add"></insert>
<delete id="delete"></delete>
<select id="get"></select>
<update id="update"></update>
2.标签的属性
- keyColumn: 主键列 (添加时候使用)
- keyProperty: 主键对应的属性 (添加时候使用)
- useGeneratedKeys:是否数据库生成主键 (添加时候使用)
- parameterType: 对应Mapper接口方法的形参类型
- id: 对应Mapper接口方法的名字
- resultType : 每一行的返回类型(全限名或别名)
- resultMap :
<resultMap >
的id值,等价于resultType=resultMap中的type值 - 文本:sql语句,使用 #{key} 的方式,代替值,
<!-- sql语句 -->
<!--增-->
<insert id="add" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="User">
insert into user(name,age,birthday) values ( #{name},#{age},#{birthday})
</insert>
<!--删-->
<delete id="delete" parameterType="Long">
delete from user where id=#{id}
</delete>
<!--改-->
<update id="update" parameterType="User">
update user set name=#{name},age=#{age},birthday=#{birthday} where id=#{id}
</update>
<!--get查-->
<select id="get" parameterType="Long" resultMap="user_mapping">
select * from user where id=#{id}
</select>
<!--list查-->
<select id="list" resultMap="user_mapping">
select * from user
</select>
<!--计算总数-->
<select id="count" resultType="Integer">
select count(*) from user
</select>
动态sql
1. where标签:
当标签内有文本时候:添加where开头,代替文本中的and 或or
当标签中无文本时候:不做操作.
2. <if test="条件语">文本</if>
条件语句,一般会用于判断传递的参数是否为空.
高级查询时候使用
//高级查询类
public class UserQueryObject {
private String name;
private Integer min_age;
private Integer max_age;
}
<!--使用动态sql,免去拼接sql的麻烦-->
<select id="getPageList" parameterType="UserQueryObject" resultMap="user_mapping">
select * from user
<where>
<if test="name!=null">and name like #{name}</if>
<if test="max_age!=null">and age <= #{max_age}</if>
<if test="min_age!=null">and age >= #{min_age}</if>
</where>
</select>
2 . <choose>,<when>,<otherwise>
:相等于if +else if +else
<choose>
<when test="条件语">XXX</when>
<when test="条件语2">XXX</when>
<otherwise>XXX</otherwise>
</choose>
3.set标签:
在Hibernate中,更新一个对象前,需要用perpare拦截器提取取值,防止null覆盖不可编辑的列.在mybatis中,可以设置set标签,控制sql,将为null的属性,不写入sql.
作用:
当文本中有值时,添加set,并去掉最后一个逗号
当文本没值时,不做操作.
<update id="update" parameterType="User">
update user
<set>
<if test="name!=null">name=#{name},</if>
<if test="age!=null">age=#{age},</if>
<if test="birthday!=null">birthday=#{birthday} ,</if>
</set>
where id=#{id}
</update>
3.foreach标签
常用于批量删除
标签中的属性
- ollection:集合无视参数的名,只填list/array
- open:遍历前,需要添加的字符串
- close:遍历完,需要添加的字符串
- seprator,每次遍历完.需要添加的字符串
- index : 当前遍历的元素的索引 #{index值} ,输出索引
- item: 当前遍历到的元素 #{item值} ,输出元素
void delete(Long...ids);
<delete id="delete">
delete from user where id in
<foreach collection="array" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
</delete>
4.trim标签
该标签是where和set标签的底层
属性:
- prefix:在内容前加入的字符串
- suffix:在内容结尾加入的字符串
- prefixOverrides: 若开头有这个值,就删去
- suffixOverrides:若末尾有这个值,就删去这个值
<!--模拟where-->
<trim prefix="where" prefixOverrides="AND|OR">文本</trim>
<!--模拟set-->
<trim prefix="set" suffixOverrides=",">文本</trim>
5.提取通用的sql片段
高级查询中,需要查询结果的list,还要查询结果的count.但其条件语句是相同的,可以抽取出来
使用<sql id="myid">文本</sql>
抽取
使用<include refid="myid"/>
调用
<!--抽取sql判断-->
<sql id="user_condition">
<where>
<if test="name!=null">and name like #{name}</if>
<if test="max_age!=null">and age <= #{max_age}</if>
<if test="min_age!=null">and age >= #{min_age}</if>
</where>
<sql>
<!--查询list-->
<select id="getPageList" parameterType="UserQueryObject" resultMap="user_mapping">
select * from user
<include refid="user_condition"/>
</select>
<!--查询count-->
<select id="getPageCount" parameterType="UserQueryObject" resultMap="user_mapping">
select count(*) from user
<include refid="user_condition"/>
</select>
6.分页查询
currentPage:从前台获取当前页
pagesize:从前台获取每页个数
封装成高级查询对象
//高级查询类中 返回limit中的第一个参数(第二个参数就是pagesize)
public int getStart(){
return (currentPage-1)*pageSize;
}
<!--在sql语句之后添加-->
LIMIT #{start}, #{pageSize}