您的位置:首页 > 数据库

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

2018-01-04 18:21 639 查看
输入映射

通过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);<
4000
br />
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: