ssm之路(7)输出映射+动态sql语句

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值