Mybatis_day02笔记.docx
1.输入参数之pojo包装
感觉没什么好写的,就一个包装类,然后再mapper.xml里面改一下就好了。
2.输出简单的类型
拿count(*) 举例,这也没什么,蛮简单的。
<select id="queryUserCount" resultType="Integer">select COUNT(*) from user;</select>
3.ResultMap 手动映射

假如表中的列名和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 语法错误
<!-- 根据条件查询用户 -->
<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 />
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集合。
测试的代码块
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类
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类
就直接加了一个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>
