Mybatis (五)输入映射 HashMap输出 传递pojo包装 resultType resultMap 动态sql

本文介绍 MyBatis 中的输入映射和输出映射技术,包括如何使用 parameterType 指定输入参数类型,如何利用 resultMap 实现复杂的数据映射,并探讨动态 SQL 的实现方法。
输入映射
通过parameterType指定输入参数的类型,类型可以是简单、hashmap、pojo的包装类型。


传递HashMap输出
将输出的字段名称作为map的key,value为字段值。
Sql映射文件定义如下:

<!--传递hashmap综合查询用户信息

hashmap和user一样为别名-->

<select id="findUserByHashmap" parameterType="hashmap" resultType="user" >
select * from user where id=#{id} and username like '%${username}%'
</select>
上标注id和username是hashmap的key。
测试
Public void testFindUserByHashmap()throws Exception{


}


===========================================================================================
传递pojo包装对象
User.java
UserCustom.java
public class UserCustom extends User{


}
UserQueryVo.java
public class UserQueryVo {


//在这里包装

//用户的查询条件
private UserCustom userCustom;


public UserCustom getUserCustom() {
return userCustom;
}


public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}

//包装其他的查询条件,订单、商品
//可以继续包装类型...
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
 
<!-- namespace的命名空间,对sql进行分类管理,mapper代理时,特殊作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">


<!-- 用户信息的综合查询 -->
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" 


resultType="cn.itcast.mybatis.po.UserCustom">
select * from user where user.usex = #{userCustom.usex} and user.uusername like 


'%${userCustom.uusername}%'
</select>
UserMapper.java
public interface UserMapper {

//用户信息的综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo)throws Exception;




//用户信息的综合查询
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setUsex("1");
userCustom.setUusername("张三丰");
userQueryVo.setUserCustom(userCustom);

List<UserCustom> list = userMapper.findUserList(userQueryVo);

sqlSession.close();

System.out.println(list);

}
不管输出pojo单个对象还是多个对象,一个列表,在mapper.xml中resultType指定类型一样,返回类型不一


样。
=====================================================================================
resultType
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo不一致,没有创建pojo。
如果查询出来的列名和pojo有一个一致,就会创建pojo。


resultType输出简单类型(分页)
只有一行一列,可以使用简单。


UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
 
<!-- namespace的命名空间,对sql进行分类管理,mapper代理时,特殊作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">


<!-- 用户信息的综合查询 -->
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" 


resultType="cn.itcast.mybatis.po.UserCustom">
select * from user where user.usex = #{userCustom.usex} and user.uusername like 


'%${userCustom.uusername}%'
</select>

<!-- 用户信息综合查询的总数 和上面是一对,一样的查询 -->
<select id="findUserCount" parameterType="cn.itcast.mybatis.po.UserQueryVo" 


resultType="int">
select count(*) from user where user.usex = #{userCustom.usex} and 


user.uusername like '%${userCustom.uusername}%'
</select>


UserMapper.java
public interface UserMapper {

//用户信息的综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo)throws Exception;
//用户信息综合查询的总数
public int findUserCount(UserQueryVo userQueryVo)throws Exception;


//用户信息的综合查询的总数
@Test
public void testFindUserCount() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setUsex("1");
userCustom.setUusername("张三丰");
userQueryVo.setUserCustom(userCustom);

int count = userMapper.findUserCount(userQueryVo);

sqlSession.close();

System.out.println(count);

}
======================================================================================
resultMap
高级输出结果映射。一对多。多对多。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关


系。
1.定义resultMap
2.使用resultMap作为statement的输出映射类型
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
 
<!-- namespace的命名空间,对sql进行分类管理,mapper代理时,特殊作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">


<!-- 定义resultMap 
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识-->
<resultMap type="user" id="userResultMap">
<!-- id表示查询结果集中唯一标识
column:查询出来的列名
propert:pojo指定的列名
result:是普通名的映射
-->
<id column="id_" property="uid"/>
<result column="username_" property="uusername"/>
</resultMap>
.........................................

<!-- 使用resultMap进行输出映射  resultMap如果不在一个mapper.xml内,需要添加namespace名


称-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
SELECT uid id_,uusername username_ FROM USER WHERE uid=#{value}
</select>


UserMapper.java
public interface UserMapper {

//用户信息的综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo)throws Exception;
//用户信息综合查询的总数
public int findUserCount(UserQueryVo userQueryVo)throws Exception;
//根据id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id)throws Exception;




//resultMap测试
@Test
public void testFindUserByIdResultMap() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user = userMapper.findUserByIdResultMap(1);

sqlSession.close();

System.out.println(user);

}

=============================================================================================

动态sql
对sql进行灵活操作,可以拼接
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
 
<!-- namespace的命名空间,对sql进行分类管理,mapper代理时,特殊作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">


<!-- 定义sql片段
id:sql片段唯一标识

经验:是基于单表来定义sql片段,这样话这个sql片段可重用性高
sql片段中不要包括where -->
<sql id="query_user_where">
<!-- where可以自动去掉if中的第一个and 
<where>-->
<if test="userCustom!=null">
<if test="userCustom.usex!=null and userCustom.usex!=''">
and user.usex = #{userCustom.usex}
</if>
<if test="userCustom.uusername!=null and userCustom.uusername!=''">
and user.uusername like '%${userCustom.uusername}%' 
</if>
</if>
<!-- </where>
where user.usex = #{userCustom.usex} and user.uusername like '%


${userCustom.uusername}%' -->

</sql>
.................
<!-- 用户信息的综合查询 -->
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" 


resultType="cn.itcast.mybatis.po.UserCustom">
select * from user 
<!-- where可以自动去掉if中的第一个and -->
<where>
<!-- 引用sql片段的id,如果refid指定的id不在mapper文件中,需要前面加


namespace -->
<include refid="query_user_where"></include>
<!-- 还可以增加其他sql片段 -->
</where>
<!-- where user.usex = #{userCustom.usex} and user.uusername like '%


${userCustom.uusername}%' -->
</select>
....................


====================================================================================
foreach


向sql传递数组或List,mybatis使用foreach解析
两种方法sql查询方法:
SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
SELECT * FROM USER WHERE id IN(1,10,16)


在输入参数类型中添加List<Integer>ids传入多个id
在UserQueryVo.java
public class UserQueryVo {

//传入多个id
private List<Integer> uids;
public List<Integer> getUids() {
return uids;
}


public void setUids(List<Integer> uids) {
this.uids = uids;
}


UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
 
<!-- namespace的命名空间,对sql进行分类管理,mapper代理时,特殊作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">


<!-- 定义sql片段
id:sql片段唯一标识

经验:是基于单表来定义sql片段,这样话这个sql片段可重用性高
sql片段中不要包括where -->
<sql id="query_user_where">
<!-- where可以自动去掉if中的第一个and 
<where>-->
<if test="userCustom!=null">
<if test="userCustom.usex!=null and userCustom.usex!=''">
and user.usex = #{userCustom.usex}
</if>
<if test="userCustom.uusername!=null and userCustom.uusername!=''">
and user.uusername like '%${userCustom.uusername}%' 
</if>
<if test="uids!=null">
<!-- 使用foreach遍历传入ids
collection:指定输入对象中集合属性
item:每个遍历生成对象中
open:开始遍历需要拼接的串
close:结束遍历需要拼接的串
separator:两个对象中间需要拼接的串
select * from user WHERE user.usex = ? and user.uusername like '%小明%' AND ( uid=? OR uid=? OR uid=? )
AND (uid=1 OR uid=10 OR uid=16)
-->
<foreach collection="uids" item="user_uid" open="AND (" close=")" separator="OR">
<!-- 每次遍历所需要拼接的串 -->
uid=#{user_uid}
</foreach>
<!-- 实现 AND uid IN (1,10,16) 
<foreach collection="uids" item="user_uid" open="and uid IN(" close=")" separator=",">
#{user_uid}
</foreach>-->
</if>
</if>
<!-- </where>
where user.usex = #{userCustom.usex} and user.uusername like '%${userCustom.uusername}%' -->

</sql>


//用户信息的综合查询
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
//由于这里使用了动态sql 如果不设置某个值,不会拼接在sql中
userCustom.setUsex("1");
userCustom.setUusername("小明");
//传入多个id
List<Integer> uids = new ArrayList<Integer>();
uids.add(1);
uids.add(10);
uids.add(16);
//传入userQueryVo
userQueryVo.setUids(uids);
userQueryVo.setUserCustom(userCustom);

List<UserCustom> list = userMapper.findUserList(userQueryVo);

sqlSession.close();

System.out.println(list);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值