Mybatis_day02笔记.docx

1.输入参数之pojo包装

感觉没什么好写的,就一个包装类,然后再mapper.xml里面改一下就好了。

2.输出简单的类型

拿count(*) 举例,这也没什么,蛮简单的。

  1. <select id="queryUserCount" resultType="Integer">
  2. select COUNT(*) from user;
  3. </select>

3.ResultMap 手动映射

image.png
假如表中的列名和pojo的属性名不一样的话,就用resultMap手动映射。

<!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
    <!-- id:设置ResultMap的id -->
    <resultMap type="order" id="orderResultMap">
        <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
        <!-- property:主键在pojo中的属性名 -->
        <!-- column:主键在数据库中的列名 -->
        <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" />
    </resultMap>

    <!-- 查询所有的订单数据 -->
    <select id="queryOrderAll" resultMap="orderResultMap">
        SELECT id, user_id,
        number,
        createtime, note FROM `order`
    </select>

4.动态sql 语句 if 和where

如果不加where 标签的话,在判断里面,可能会有没有sex和name的时候,不然第一个and 字符字 不能被处理 就会出现sql 语法错误
image.png

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
    SELECT id, username, birthday, sex, address FROM `user`
<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
    <where>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
        <if test="username != null and username != ''">
            AND username LIKE
            '%${username}%'
        </if>
    </where>

5.提取Sql片段

<!-- 声明sql片段 -->
<sql id="userFields">
    id, username, birthday, sex, address
</sql>
SELECT<include refid=_"userFields"_/> FROM `user`<br />导入的话就 就直接用 <include refid=""><br />如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace<br />例如下图<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1917322/1599393627392-873f6ec3-8a45-4c0e-9188-7d2aacaf8e85.png#align=left&display=inline&height=93&margin=%5Bobject%20Object%5D&name=image.png&originHeight=185&originWidth=553&size=40001&status=done&style=none&width=276.5)

6.foreach标签

如果要根据id查询多个用户的信息
select * from user where id in (1,2,3,10,12);

<!-- 根据ids查询用户 -->
<select id="queryUserByIds" parameterType="queryVo" resultType="user">
    SELECT * FROM `user`
    <where>
        <!-- foreach标签,进行遍历 -->
        <!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
        <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
        <!-- open:在前面添加的sql片段 -->
        <!-- close:在结尾处添加的sql片段 -->
        <!-- separator:指定遍历的元素之间使用的分隔符 -->
        <foreach collection="ids" item="item" open="id IN (" close=")"
            separator=",">
            #{item}
        </foreach>
    </where>
</select>

在QueryV.java里面修改,添加一个id的list集合。
image.png
测试的代码块

    public void queryUserByIds(){
        SqlSession sqlSession= this.sqlSessionFactory.openSession();
        UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
        QueryVo queryVo = new QueryVo();
        List<Integer> list= new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(10);
        queryVo.setIds(list);
        System.out.println(userMapper.queryUserByIds(queryVo));
    }

然后还有数组的,还有list的。
首先看数组的,

 Integer[] ids = new Integer[3];
        ids[0] =1;
        ids[1] =2;
        ids[2] =10;
        System.out.println(userMapper.queryUserByIds(ids));
<select id="queryUserByIds" parameterType="Integer[]" resultType="user">
        SELECT * FROM `user`
        <where>
            <foreach collection="array" item="item" open="id IN (" close=")"
                     separator=",">
                #{item}
            </foreach>
        </where>
    </select>

就是collection那里要改成array,如果是list的话,那就是要改成list。蛮神奇的,只有传过去自己的类采用类里面的名字。
更神奇的是,我那个parameterType不加好像也没什么关系,就是基础随便填好像也没关系,但是乱填就不行。我也不知道为什么,这视频里面说,Mybatis 将传过来的 根本就没用,直接它自己创建了一个map,把那些数值存进去。

7.一对一关联(我感觉蛮重要的)

方法一:使用resultType,改进polo类

这个是继承polo类,然后把要的对象再加进去。

public class OrderUser extends Order {
    private String username;
    private String address;
}
    <!-- 查询订单,同时包含用户数据 -->
    <select id="queryOrderUser" resultType="orderUser">
SELECT
    o.id,
    o.user_id,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
    FROM
    `orders` o
    LEFT JOIN `user` u ON o.user_id = u.id
</select>

方法二:使用resultMap

这个是直接改版polo类
image.png就直接加了一个user

<resultMap type="Order" id="orderUserResultMap">
        <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里面的User属性名 -->
        <!-- javaType:属性类型 -->
        <association property="user" javaType="user">
            <!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
            <id property="id" column="user_id" />
            <result property="username" column="username" />
            <result property="address" column="address" />
        </association>

    </resultMap>

    <!-- 一对一关联,查询订单,订单内部包含用户属性 -->
    <select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
SELECT
    o.id,
    o.user_id,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
    FROM
    `orders` o
    LEFT JOIN `user` u ON o.user_id = u.id
</select>

8.一对多,反正都在文档里面 懒得写了。