由mybatis学习(1)中我们了解到如何搭建mybatis工程,传统dao开发以及动态dao开发,本节主要讨论关系映射配置文件的具体配置。
1.输入映射与输出映射
1.1输入映射
1.1.1简单参数传递
包括String,Integer,Double,Float…
<select id="getUserByName" parameterType="String" resultType="pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name111} -->
<!-- 注意: ${}是字符串拼接符 目的是使我们传入的字符串不用每一次都带一个%String%,如何去掉百分号 !!!
如果你要传入的是基本类型【注:此时传入类型指的是parameterType】,括号里面一定要写value!!! 【注:''不能省,否则报错】-->
SELECT id,username,birthday,sex,address
FROM USER
WHERE username LIKE'%${value}%';
</select>
1.1.2传递pojo对象
<update id="updateUserName" parameterType="pojo.User">
update user set
username=#{username} where id=#{id}
</update>
1.1.3传递封装pojo对象
<!-- 输入参数为pojo的包装对象,即有一个成员是pojo类 -->
<select id="getByQueryUser" parameterType="QueryUser"
resultType="pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name111} -->
<!-- 注意: ${}是字符串拼接符 目的是使我们传入的字符串不用每一次都带一个%String%,如何去掉百分号 !!!如果你要传入的是基本类型,括号里面一定要写value!!! -->
SELECT id,username,birthday,sex,address FROM USER WHERE username LIKE
'%${user.username}%';
</select>
1.2输出映射
1.2.1输出简单类型
查询用户总记录数,演示返回简单类型
<select id="getUserCount" resultType="int">
SELECT COUNT(1) FROM USER
</select>
1.2.2输出pojo对象
根据id查询用户信息
<select id="getUserById" parameterType="int" resultType="pojo.User">
SELECT *
FROM USER WHERE id = #{id1}
</select>
1.2.3输出pojo列表
根据名字的姓进行查询,返回一个
List<User>
<!-- 如果你返回值是为集合(例如一个list),那么你只需要返回值类型填返回list中的类型就行 -->
<select id="getUserByName" parameterType="String" resultType="pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name111} -->
<!-- 注意: ${}是字符串拼接符 目的是使我们传入的字符串不用每一次都带一个%String%,如何去掉百分号 !!!如果你要传入的是基本类型,括号里面一定要写value!!! -->
SELECT id,username,birthday,sex,address FROM USER WHERE username LIKE
'%${value}%';
</select>
2.动态sql
2.1 if
多查询条件拼装引出if标签
if标签的使用:
注意:<if test="username!=null and username!=''">中间不是&&
<select id="getUserByNameSex" parameterType="user" resultType="user">
select *
from user
where 1=1
<if test="username!=null and username!=''">
and username like'%${username}%'
</if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
</if>
</select>
2.1 where
where标签的使用:
作用:添加where关键字,去掉多余的and
<select id="getUserByNameSex" parameterType="user" resultType="user">
select *
from user
<where>
<if test="username!=null and username!=''">
and username like'%${username}%'
<!-- 此处的可能多余的and会由where标签去掉 -->
</if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
</if>
</where>
</select>
2.1 foreach
foreach标签的使用:
- collection:要遍历的集合,来源入参,下面的例子的list—是QueryUser.list
- items:设置循环变量
- open:循环开始前输出的sql内容,其实不写直接放在foreach外面也是可行的
- separator:分隔符
- close:循环结束拼接的sql
需求:查询用户id在某一个范围内的用户信息数据
使用:由于mybatis不支持直接传递集合,所以需要在pojo中创建一个集合的属性,我们需要做的就是把(1,10,25,30,34)装入集合里面,再想办法把sql语句拼装出来
<select id="getUserByIds" parameterType="QueryUser" resultType="user">
<include refid="user_list"></include>
<where>
<!-- id IN (1,3,7,8,9) -->
<foreach collection="list" item="ids" open="id IN(" separator="," close=")">
#{ids}
</foreach>
</where>
</select>
2.1 SQL片段
作用:将公共的SQl片段抽取出来,有点相当于jsp中把公共页面包含起来。
抽取:
<sql id="user_list">
select *
from user
</sql>
使用:
<include refid="user_list"></include>
3.关联查询
在实际开发当中,我们往往需要对多张表进行关联查询,表与表之间有一对一与一对多的关系(多对多属于两个一对多)
3.1 一对一查询
从A表出发在B表当中只有唯一的数据行与之对应,结果最多返回一个数据集。
3.1.1 使用resultType
使用resultType接收,那么必须要有一个与之对应的pojo(因为查询结果有两张表的属性)。
需要:重新定义一个pojo,继承其中的一张表对应的pojo。
新建pojo
package pojo;
/**
* 为了实现多表连接查询
* 通过resultType返回
* @author rong
*
*/
public class UserOrder extends Order {
//这两个属性是来自于Order表,即B表中的属性
private String username;
private Integer id;
.
.
.(实现其get/set方法)
修改order的映射文件
<!-- ===================多表关联查询-1-1使用resultMap===================== -->
<select id="getOrderUser" resultType="pojo.UserOrder">
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>
测试
@Test
public void testGetOrderUser() {
SqlSession openSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
OrderMaper orderMaper = openSession.getMapper(OrderMaper.class);
List <UserOrder>orderList = orderMaper.getOrderUser();
for (UserOrder order: orderList) {
System.out.println(order);
}
openSession.close();
}
3.1.2 使用resultMap
基于面向对象的思想,我们直接对原有的pojo对象进行改造,使之能够接收到返回的属性(添加属性)。
添加一个User类型的属性(面向对象的思想)
public class Order {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
private User user1;
.
.
.(set/get方法)
修改关系映射文件
type:指定映射到哪一个pojo,就是返回的
定义普通属性
property:在pojo中的属性名
column:在数据库中的列名
association–配置一对一查询
property:绑定Order中的用户属性 即Order.user1
【注:为了区别pojo中的user对象,在Order中定义的是user1成员】
property对应的是需要你告知来自哪个pojo中的哪个属性【注:一定要与javaType(pojo类)中对应的属性名称相同,参考前面定义的user1】
javaType是property的数据类型,支持别名
<resultMap type="Order" id="order_user_map">
<id property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
<!-- association配置一对一查询
property:绑定Order中的用户属性 即Order.user1【注:为了区别pojo中的user对象,在Order中定义的是user1成员】
javaType:属性的数据类型 property的数据类型,支持别名
我感觉:
property对应的是需要你告知来自哪个pojo中的哪个属性
javaType是property的数据类型,支持别名
-->
<association property="user1" javaType="pojo.User">
<!--
感觉:每一个块块都要有一个主键,而user表中的主键就对应Order表中的user_id
-->
<id property="id" column="user_id"/>
<result property="username" column="username"/>
</association>
</resultMap>
sql语句
使用resultMap的名字使用前面定义的resultMap的名字。
<select id="getOrderUserByMap" resultMap="order_user_map">
SELECT
o.`id`,
o.`user_id`,
o.`number`,
o.`createtime`,
o.`note`,
u.`username`,
u.`address`
FROM `order` o
LEFT JOIN `user` u
ON u.id = o.`user_id`
</select>
3.2 一对多查询
当我们查询用户张三下了多少订单时,此时返回的是多个数据,基于一对多查询。
改造pojo
public class User {
private Integer id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
private String uuid2;//uuid
private List<Order> order123;
.
.
.
(Get/Set方法)
改造关系映射文件
property:在pojo中的属性名
column:在数据库中的列名
collection:配置一对多的关系
property:用户的Order属性【注:在pojo.user中的属性,为了以示区别,这里我定义的是一个order123的属性】
ofType:property的数据类型,支持别名
其余配置与一对一相同
<resultMap type="user" id="user_order_map">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<result property="address" column="address"/>
<!-- collection:配置一对多的关系
property:用户的Order属性【注:在pojo.user中的属性,为了以示区别,这里我定义的是一个order123的属性】
ofType:property的数据类型,支持别名
-->
<collection property="order123" ofType="pojo.Order">
<id property="userId" column="oid"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
</collection>
</resultMap>
SQL语句
<select id="getUserOrderByMap" resultMap="user_order_map">
SELECT
u.`id`,
u.`username`,
u.`birthday`,
u.`sex`,
u.`address`,
u.`uuid2`,
o.`id` oid,
o.`number`,
o.`createtime`
FROM `user` u
LEFT JOIN `order` o
ON o.`user_id` = u.`id`
</select>
3315

被折叠的 条评论
为什么被折叠?



