1.输出类型有resultType和resultMap,对象属性名和与数据库表字段名相同,用resultType作输出映射,
对象属性名和与数据库表字段名不同时,用结果映射作输出映射。
2.看两张表:
查询结果表:
数据库查询结果表:
在陈述:resultType
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功,如果查询出来的列名和pojo中的属性名全部不一致,则不会创建pojo对象,只要查询出来的列名和POJO中的属性有一个一致,就会创建POJO对象,映射失败的列,在对象属性的值中为0
结果映射
如果查询出来的列名状语从句:POJO的属性名不一致,通过结果映射对列名和属性名之间作一个映射关系
代码演示:
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">
<mapper namespace="com.lmj.ssm.mapper.UserMapper">
<!--type="User"表示resultMap最终映射的java对象类型,-->
<resultMap id="UserResultMap" type="UserCustom">
<!-- column表示查询出来的列名,property表示type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系
这里的id表:对主键的映射-->
<id column="id" property="id"></id>
<!-- result表示对普通字段的映射-->
<result column="别名name" property="name"></result>
</resultMap>
<!--用户信息的综合查询-->
<select id="findUserList" parameterType="UserQueryVo" resultMap="UserResultMap">
select name 别名name,age from user where name like '%${userCustom.name}%' and age=#{userCustom.age}
</select>
</mapper>
测试代码:
public class Test {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
public Test() throws IOException {
}
@org.junit.Test
public void findUserList() throws Exception {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setAge(24);
userCustom.setName("李");
userQueryVo.setUserCustom(userCustom);
List<UserCustom> user= userMapper.findUserList(userQueryVo);
System.out.println(user);
}
}
查询结果如下:(可以发现对查出来的字段成功的映射成了POJO对象中的属性)
动态SQL-IF语句:
每次进行查询时需对查询条件进行判空处理,不为空,才进行查询。
<!--用户信息的综合查询-->
动态sql,可通过表达式对sql进行灵活的拼接,判值
name like '%${userCustom.name}%'和 and name like '%${userCustom.name}%'都可以,若是后者,mybatis会自动去掉where中的第一个and
<select id="findUserList" parameterType="UserQueryVo" resultMap="UserResultMap">
select name 别名name,age from user
<where>
<if test="userCustom.name!=null">name like '%${userCustom.name}%'</if>
<if test="userCustom.age!=null">and age=#{userCustom.age}</if>
</where>
</select>
SQL片段:
定义SQL是基于单表查询来定义的,SQL片段不要包含其中,订单表,商品表,就建3个SQL片段如果REFID的ID不在映射文件中,需要加的命名空间限定,用法如下:
<?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">
<mapper namespace="com.lmj.ssm.mapper.UserMapper">
<!--type="User"表示resultMap最终映射的java对象类型,-->
<resultMap id="UserResultMap" type="UserCustom">
<!-- column表示查询出来的列名,property表示type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系
这里的id表:对主键的映射-->
<id column="id" property="id"></id>
<!-- result表示对普通字段的映射-->
<result column="别名name" property="name"></result>
</resultMap>
<!--这里定义的是sql片段-->
<sql id="userQuery">
<if test="userCustom.name!=null"> name like '%${userCustom.name}%'</if>
<if test="userCustom.age!=null">and age=#{userCustom.age}</if>
</sql>
<!--用户信息的综合查询-->
<select id="findUserList" parameterType="UserQueryVo" resultMap="UserResultMap">
select name 别名name,age from user
<where>
<include refid="userQuery"/>
</where>
</select>
</mapper>
SQL-的foreach语句:
向SQL传递数组,列表...的foreach进行解析
多组查询select * from user where id = 1或id = 3或id = 5
或select * from user where where in(1,3,5)
代码如下: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">
<mapper namespace="com.lmj.ssm.mapper.UserMapper">
<!--type="User"表示resultMap最终映射的java对象类型,-->
<resultMap id="UserResultMap" type="UserCustom">
<!-- column表示查询出来的列名,property表示type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系
这里的id表:对主键的映射-->
<id column="id" property="id"></id>
<!-- result表示对普通字段的映射-->
<result column="别名name" property="name"></result>
</resultMap>
<!--这里定义的是sql片段-->
<sql id="userQuery">
<if test="ids!=null">
<foreach collection="ids" item="user_id" open="and id in(" close=")" separator=",">
<!-- colletion指定输入对象集合属性(fir in....jsxl)
item 每个遍历生成对象中
open:开始遍历时拼接字符串
close 结束遍历时拼接字符串
separator便利的两个对象中间需要拼接的串
id=#{user_id} -->
#{user_id}
</foreach>
</if>
</sql>
<!--用户信息的综合查询-->
<select id="findUserList" parameterType="UserQueryVo" resultMap="UserResultMap">
select name 别名name,age from user
<where>
<include refid="userQuery"/>
</where>
</select>
</mapper>
userQueryVo.xml
//传入多个id,然后修改mapper.xml,修改sql片段,where中的条件
private List<Integer> ids;
测试代码如下:
@org.junit.Test
public void findUserList() throws Exception {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
List<Integer>ids= new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(3);
// 将ids通过userQueryVo传入statement
userQueryVo .setIds(ids);
userCustom.setAge(24);
userCustom.setName("李");
userQueryVo.setUserCustom(userCustom);
List<UserCustom> user= userMapper.findUserList(userQueryVo);
System.out.println(user);
}
运行结果 :
更多参考:https://www.jianshu.com/p/0eff22b712f9