Mybatis学习总结(二)
mybatis
传递包装的pojo
public class QueryVo {
private User user;
public User getUser(){
return user;
}
public void setUser(User user) {
this.user = user;
}
}
// 此处配置了别名
<select id="getUserByName" parameterType="queryVo“ resultType="com.mx.pojo.User">
select * from `user` where username like '%${user.userName}%'
</select>
ResultMap定义
回顾返回参数:
1.返回简单的类型
- 查询用户总记录数
<select id="getUserCount” resultType="int">
select count(1)from user;
2.返回pojo对象
3.输出pojo列表
resultType:如果返回的是集合,则设置每一个数据类型
<resultMap type="order" id="order_list_map">
<-- resultMap入门
type:映射成的pojo类型
id:resultMap唯一标识
-->
<--配置主键-->
<id proterty="id" column="id"/>
<--普通字段配置-->
<result proterty=“uerId" column="user_id">
.....省略
</resultMap>
// 此时使用resultMap属性引入定义好的映射关系
<select id="getUserByName" parameterType="queryVo“ resultMap="order_list_map">
select * from `user` where username like '%${user.userName}%'
</select>
动态sql
-
if标签
<select id="getUserByPojo" parameterType="User“ resultType="com.mx.pojo.User"> select * fromuserwhere 1=1 //如果username为空性别不为空,此时语法出先错误,多了一个and <if test="username != null and username != '' "> and username like '%${user.userName}%' </if> <if test="sex !=null and sex !='' "> and sex = #{name} </if> </select>
-
where标签
-
自动补全where,同时处理多余的and,用了where标签就不用手动的添加where
<select id="getUserByPojo" parameterType="User“ resultType="com.mx.pojo.User"> select * fromuser <where> //如果username为空性别不为空,此时语法出先错误,多了一个and <if test="username != null and username != '' "> username like '%${user.userName}%' </if> <if test="sex !=null and sex !='' "> and sex = #{name} </if> </where> </select>
-
sql片段
-
演示通过select * 不好引出查询字段名,抽取共用sql片段。
-
定义
<-- sql片段 定义,id:片段唯一标识 --> <sql id="user_column"> id, username, birthday, sex, address, uuid2 </sql>
-
使用
SELECT
<!-- sql片段的使用:include:引入sql片段,refid引入片段id -->
<include refid="user_column" />
FROM USER -
foreach标签
`<!-- 演示动态sql-foreach标签的使用情景 --> <select id="getUserByIds" parameterType="queryvo" resultType="com.mx.pojo.User"> SELECT * FROM USER <!-- where会自动加上where同处理多余的and --> <where> <!-- id IN(1,10,25,30,34) --> <!-- foreach循环标签 collection:要遍历的集合,来源入参 open:循环开始前的sql separator:分隔符 close:循环结束拼接的sql --> <foreach item="uid" collection="ids" open="id IN(" separator="," close=")"> #{uid} </foreach> </where> </select>`
关联查询
一堆同
- resultType
`<!-- 一对一关联查询,使用resultType -->
<select id="getOrderUser" resultType="orderuser">
SELECT
o.`id`,
o.`user_id` userId,
o.`number`,
o.`createtime`,
o.`note`,
u.`username`,
u.`address`
FROM `order` o
LEFT JOIN `user` u
ON u.id = o.`user_id`
</select>`
- resultMap
- 改造pojo 在User中添加User user 属性。
-
<-- 一对一关联查询-resultMap --> <resultMap type="order" id="order_user_map"> <!-- id标签用于绑定主键 --> <id property="id" column="id"/> <!-- 使用result绑定普通字段 --> <result property="userId" column="user_id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> <!-- association:配置一对一关联 property:绑定的用户属性 javaType:属性数据类型,支持别名 --> <association property="user" javaType="com.mx.pojo.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> <result property="sex" column="sex"/> </association> </resultMap> <!-- 一对一关联查询-使用resultMap --> <select id="getOrderUser2" resultMap="order_user_map"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address, u.sex FROMordero LEFT JOINuseru ON u.id = o.user_id </select>
一对多的关联查询
- 在用户类中添加private List list;
-
<!-- 一对多关联查询 --> <resultMap type="user" id="user_order_map"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="birthday" column="birthday" /> <result property="address" column="address" /> <result property="sex" column="sex" /> <result property="uuid2" column="uuid2" /> <!-- collection:配置一对多关系 property:用户下的order属性 ofType:property的数据类型,支持别名 --> <collection property="orders" ofType="order"> <!-- id标签用于绑定主键 --> <id property="id" column="oid"/> <!-- 使用result绑定普通字段 --> <result property="userId" column="id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> </collection> </resultMap> <!-- 一对多关联查询 --> <select id="getUserOrder" resultMap="user_order_map"> SELECT u.id, u.username, u.birthday, u.sex, u.address, u.uuid2, o.idoid, o.number, o.createtime FROMuseru LEFT JOINordero ON o.user_id= u.id </select>