MyBatis框架学习笔记二
MyBatis的映射文件
除了四个常用的增删改查外<insert><delete><update><select>外还有<resultMap><sql><include>特殊字符处理。
resultMap
resultMap标签的作用的自定义映射关系。 MyBatis可以将数据库结果集封装到对象中,是因为结果集的列名和对象属性名相同. 当POJO属性名和数据库列名不一致时,MyBatis无法自动完成映射关系。
<!--第一种解决方法就是将查询的数据库列名as 实体的属性名,这样就可以绑定了--><select id="">select uid as id,uname as name from user;</select><!--第二种就是使用resultMap自定义映射关系--><!--id是自定义映射名 type 是自定义映射类型--><resultMap id="zidingyi" type="com.cueb.entity.User"><!--id是定义主键列 property代表实体类的属性名 column是数据库的列名--><id property="id" column="uid "></id><!--result是定义普通列 property代表实体类的属性名 column是数据库的列名--><result property="name" column="uname"></result></resultMap><select id="findAll" resultMap="zidingyi">select * from user;</select>
映射文件中的<sql>和<include>
<sql>用来定义可重用的Sql片段,通过<include>引入该片段。如:Sql 语句的查询字段起与POJO属性相同的别名,该Sql片段就可以重用。
<sql id="selectAllField">select tid as id,tname as teacherName
</sql>
<select id="findAll"
resultType="com.itbaizhan.pojo.Teacher"><include refid="selectAllField"></include>from teacher;
</select>
<select id="findById"
resultType="com.itbaizhan.pojo.Teacher"><include refid="selectAllField"></include>from teacher where tid = #{id}
</select>
MyBatis映射文件中特殊字符处理
在Mybatis映射文件中尽量不要使用一些特殊字符,如: < , > 等。 我们可以使用符号的实体来表示:
符号 | 实体 |
< | < |
> | > |
& | & |
‘ | ' |
“ | " |
<!--查询id大于某个值的老师--><select id="findById2"resultType="com.cueb.entity.User"><include refid="selectAllField"></include>from user where tid > #{id}</select>
MyBatis的动态sql
<if>
<if>标签内的Sql片段在满足条件后才会添加,用法为:<if test="条件"> 。
<select id="findByCondition" parameterType="User" resultType="User">select * from user where 1 = 1<if test="username != null and username.length() != 0">and username like #{username}</if><if test="sex != null and sex.length()!= 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if></select>
1 if中的条件不能使用&&/||,而应该使用and/or
2 if中的条件可以直接通过属性名获取参数POJO的属性值,并 且该值可以调用方法。
3 where后为什么要加1=1?
任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可。
<where>
<where>可以代替sql中的where 1=1 和第一个and,更符合程序员的开发习惯,使用<where>后的映射文件如下:
<select id="findByCondition" parameterType="User" resultType="User">select * from user<where><if test="username != null and username.length() != 0">and username like #{username}</if><if test="sex != null and sex.length()!= 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if></where></select>
<set>
<set>标签用在update语句中。借助<if> ,可以只对有具体值的字段进行更新。 <set>会自动添加set关键字,并去掉最后一个if语句中多余的逗号。
<update id="update" parameterType="User">update user<set><if test="username != null and username.length() > 0">username = #{username},</if><if test="sex != null and sex.length() > 0">sex = #{sex},</if></set><where>id = #{id}</where></update>
<choose><when><otherwise>
这些标签表示多条件分支,类似JAVA中的 switch...case 。<choose> 类似 switch ,<when>类似 case ,<otherwise> 类似 default 。
<select id="findByCondition" resultType="User" parameterType="User">select * from user<where><choose><when test="username.length() < 5"><bind name="likename" value="'%'+username+'%'"/>username like #{likename}</when><when test="username.length() < 10">username = #{username}</when><otherwise>id = 1</otherwise></choose></where></select>
这段代码的含义为:用户名=5并且 <10时使用精确查询,否则查询id为1的用户
<foreach>
<foreach>类似JAVA中的for循环,可以遍历集合或数组。 <foreach>有如 下属性:
- collection:遍历的对象类型
- open:开始的sql语句
- close:结束的sql语句
- separator:遍历每项间的分隔符
- item:表示本次遍历获取的元素,遍历List、Set、数组时表示每项元素,遍历map时表示键值对的值。
- index:遍历List、数组时表示遍历的索引,遍历map时表示键值对的键。
<!--遍历数组collection 是 array--><delete id="deleteBatch" parameterType="int">delete from user<where><foreach open="id in(" close=")" separator="," collection="array" item="id" >#{id}</foreach></where></delete>
<foreach>遍历集合List和Set的方法是一样的,我们使用<foreach>遍历List进行批量添加。
<!--遍历集合--><insert id="insertBatch" parameterType="User">insert into user values<foreach collection="list" item="user" separator=",">(null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})</foreach></insert>
使用<foreach> 遍历Map进行多条件查询。
<select id="findUser" parameterType="map" resultType="User">select * from user<where><foreach collection="queryMap" separator="and" index="key" item="value">${key} = #{value}</foreach></where></select>
MyBatis框架学习笔记二
MyBatis的映射文件
除了四个常用的增删改查外<insert><delete><update><select>外还有<resultMap><sql><include>特殊字符处理。
resultMap
resultMap标签的作用的自定义映射关系。 MyBatis可以将数据库结果集封装到对象中,是因为结果集的列名和对象属性名相同. 当POJO属性名和数据库列名不一致时,MyBatis无法自动完成映射关系。
<!--第一种解决方法就是将查询的数据库列名as 实体的属性名,这样就可以绑定了--><select id="">select uid as id,uname as name from user;</select><!--第二种就是使用resultMap自定义映射关系--><!--id是自定义映射名 type 是自定义映射类型--><resultMap id="zidingyi" type="com.cueb.entity.User"><!--id是定义主键列 property代表实体类的属性名 column是数据库的列名--><id property="id" column="uid "></id><!--result是定义普通列 property代表实体类的属性名 column是数据库的列名--><result property="name" column="uname"></result></resultMap><select id="findAll" resultMap="zidingyi">select * from user;</select>
映射文件中的<sql>和<include>
<sql>用来定义可重用的Sql片段,通过<include>引入该片段。如:Sql 语句的查询字段起与POJO属性相同的别名,该Sql片段就可以重用。
<sql id="selectAllField">select tid as id,tname as teacherName
</sql>
<select id="findAll"
resultType="com.itbaizhan.pojo.Teacher"><include refid="selectAllField"></include>from teacher;
</select>
<select id="findById"
resultType="com.itbaizhan.pojo.Teacher"><include refid="selectAllField"></include>from teacher where tid = #{id}
</select>
MyBatis映射文件中特殊字符处理
在Mybatis映射文件中尽量不要使用一些特殊字符,如: < , > 等。 我们可以使用符号的实体来表示:
符号 | 实体 |
< | < |
> | > |
& | & |
‘ | ' |
“ | " |
<!--查询id大于某个值的老师--><select id="findById2"resultType="com.cueb.entity.User"><include refid="selectAllField"></include>from user where tid > #{id}</select>
MyBatis的动态sql
<if>
<if>标签内的Sql片段在满足条件后才会添加,用法为:<if test="条件"> 。
<select id="findByCondition" parameterType="User" resultType="User">select * from user where 1 = 1<if test="username != null and username.length() != 0">and username like #{username}</if><if test="sex != null and sex.length()!= 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if></select>
1 if中的条件不能使用&&/||,而应该使用and/or
2 if中的条件可以直接通过属性名获取参数POJO的属性值,并 且该值可以调用方法。
3 where后为什么要加1=1?
任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可。
<where>
<where>可以代替sql中的where 1=1 和第一个and,更符合程序员的开发习惯,使用<where>后的映射文件如下:
<select id="findByCondition" parameterType="User" resultType="User">select * from user<where><if test="username != null and username.length() != 0">and username like #{username}</if><if test="sex != null and sex.length()!= 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if></where></select>
<set>
<set>标签用在update语句中。借助<if> ,可以只对有具体值的字段进行更新。 <set>会自动添加set关键字,并去掉最后一个if语句中多余的逗号。
<update id="update" parameterType="User">update user<set><if test="username != null and username.length() > 0">username = #{username},</if><if test="sex != null and sex.length() > 0">sex = #{sex},</if></set><where>id = #{id}</where></update>
<choose><when><otherwise>
这些标签表示多条件分支,类似JAVA中的 switch...case 。<choose> 类似 switch ,<when>类似 case ,<otherwise> 类似 default 。
<select id="findByCondition" resultType="User" parameterType="User">select * from user<where><choose><when test="username.length() < 5"><bind name="likename" value="'%'+username+'%'"/>username like #{likename}</when><when test="username.length() < 10">username = #{username}</when><otherwise>id = 1</otherwise></choose></where></select>
这段代码的含义为:用户名=5并且 <10时使用精确查询,否则查询id为1的用户
<foreach>
<foreach>类似JAVA中的for循环,可以遍历集合或数组。 <foreach>有如 下属性:
- collection:遍历的对象类型
- open:开始的sql语句
- close:结束的sql语句
- separator:遍历每项间的分隔符
- item:表示本次遍历获取的元素,遍历List、Set、数组时表示每项元素,遍历map时表示键值对的值。
- index:遍历List、数组时表示遍历的索引,遍历map时表示键值对的键。
<!--遍历数组collection 是 array--><delete id="deleteBatch" parameterType="int">delete from user<where><foreach open="id in(" close=")" separator="," collection="array" item="id" >#{id}</foreach></where></delete>
<foreach>遍历集合List和Set的方法是一样的,我们使用<foreach>遍历List进行批量添加。
<!--遍历集合--><insert id="insertBatch" parameterType="User">insert into user values<foreach collection="list" item="user" separator=",">(null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})</foreach></insert>
使用<foreach> 遍历Map进行多条件查询。
<select id="findUser" parameterType="map" resultType="User">select * from user<where><foreach collection="queryMap" separator="and" index="key" item="value">${key} = #{value}</foreach></where></select>
发布评论