目录
一.parametertype 输入类型
1.1 传递简单类型
参考 https://blog.csdn.net/qq_30162219/article/details/87522219
1.2 传递pojo对象
参考 https://blog.csdn.net/qq_30162219/article/details/87522219
1.3 传递pojo包装对象
新建包装类
public class QueryVo {
//用户对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
需求:根据user对象中的name属性查询对应的user集合
配置xml文件
<!-- 1、resultType:如果要返回数据集合,只需设定为每一个元素的数据类型
2、 包装的pojo取值通过 "."来获取
-->
<select id="getUserByQueryVo" parameterType="queryvo" resultType="mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name} -->
SELECT * FROM USER WHERE username LIKE '%${user.username}%'
</select>
测试类
@Test
public void testGetUserByQueryVo() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
//获取接口的代理人实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
QueryVo vo = new QueryVo();
User user2 = new User();
user2.setUsername("张");
vo.setUser(user2);
List<User> list = userMapper.getUserByQueryVo(vo);
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
二.输出类型
2.1 输出简单类型
<!-- 查询用户总记录数,演示返回简单类型 -->
<select id="getUserCount" resultType="int">
SELECT COUNT(1) FROM USER
</select>
2.2 输出pojo对象
参考 https://blog.csdn.net/qq_30162219/article/details/87522219
2.3 输出pojo列表
参考 https://blog.csdn.net/qq_30162219/article/details/87522219
三.resultMap
使用情形:当数据库中的字段与实体类的属性字段不一致。
演示基于完成订单列表的查询,由user_id字段与pojo属性不一致时引出的resultMap。
<!-- resultMap入门
type:映射成的pojo类型
id:resultMap唯一标识
-->
<resultMap type="order" id="orderMap">
<!-- id标签用于绑定主键 -->
<id property="id" column="id"/>
<!-- 使用result绑定普通字段 -->
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
</resultMap>
<!-- 使用resultMap -->
<select id="getOrderListResultMap" resultMap="orderMap">
SELECT * FROM `order`
</select>
四.动态SQL
4.1 if标签的使用
演示基于完成用户列表查询功能,由多查询条件拼装引出if标签。
<!-- 演示动态sql-if标签的使用情景 查询条件id 和 username可能为空-->
<select id="getUserByWhere" parameterType="user" resultType="mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE '%${username}%' and id = #{id} -->
SELECT * FROM USER where 1 = 1
<!-- if标签的使用 -->
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and username LIKE '%${username}%'
</if>
</select>
4.2 Where 标签的使用
<!-- 演示动态sql-where标签的使用情景 -->
<select id="getUserByWhere2" parameterType="user"
resultType="com.itheima.mybatis.pojo.User">
<!-- include:引入sql片段,refid引入片段id -->
SELECT
*
FROM USER
<!-- where会自动加上where同处理多余的and -->
<where>
<!-- if标签的使用 -->
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and username LIKE '%${username}%'
</if>
</where>
</select>
4.3 sql片段
<!--
演示通过select * 不好引出查询字段名,抽取共用sql片段。
sql片段 定义,id:片段唯一标识 -->
<sql id="user_column">
`id`,
`username`,
`birthday`,
`sex`,
`address`,
`uuid2`
</sql>
SELECT
<!-- sql片段的使用:include:引入sql片段,refid引入片段id -->
<include refid="user_column" />
FROM USER
4.4 Foreach
当查询条件为多个相同类型的值 例如 xxxx in (x,x,x,x);可以使用该标签
修改包装类添加参数集合
public class QueryVo {
private User user;
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
<!-- 演示动态sql-foreach标签的使用情景 -->
<select id="getUserByIds" parameterType="queryvo"
resultType="com.itheima.mybatis.pojo.User">
SELECT
*
FROM USER
<!-- where会自动加上where同处理多余的and -->
<where>
<!-- id IN(1,10,25,30,34) -->
<!-- foreach循环标签
collection:要遍历的集合,来源入参
open:循环开始前的sql
separator:分隔符
close:循环结束拼接的sql
-->
<foreach item="uid" collection="ids" open="id IN(" separator=","
close=")">
#{uid}
</foreach> </where>
</select>