一、输入映射
1.parameterType
指定输入参数的Java类,可以使用别名或者类的全限定名。它也可以接受基本数据类型、POJO对象、HashMap。
(1)基本数据类型
(2)POJO对象
(3)传递POJO包装对象
开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
UserQueryVo.java
public class UserQueryVO{ // 用户信息 private User user; public User getUser(){ return user; } public void setUser(User user){ this.user = user; } }
UserMapper.xml
UserMapper.java
Test.java
(4)传递HashMap
map的key相当于POJO的属性。
UserMapper.xml
UserMapper.java
Test.java
结果:
User [id=25, username=陈小明, sex=2, birthday=Fri Jul 01 00:00:00 GMT+08:00 2016, address=长春市]
二、SQL标签
通过Mybatis提供的各种动态标签实现动态拼接sql,使得mapper映射文件在编写SQL时更加灵活,方便。常用动态SQL标签有:if、where、foreach。
1.if和where标签
if: 作为判断入参来使用的,如果符合条件,则把if标签体内SQL拼接上。注意:用if 标签判断是否为空时,不仅要判断null,也有判断空串""。
where: 会去掉条件中的第一个And符号。
案例一: 根据用户名和性别查询
UserMapper.xml
<!-- 标签的使用 --> <select id="findUsersByNameAndSex" parameterType="userQueryVo" resultType="user"> SELECT * FROM user <!--wher标签:将后面第一个AND去掉,如果没有条件则把自己去掉 --> <where> <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username LIKE '%${user.username}%' </if> <if test="user.sex != null and user.sex != ''"> AND sex = #{user.sex} </if> </if> </where> </select>
UserMapper.java
public interface UserMapper{ public User findUserById(int id); public void saveUser(User user); public List<User> findUserList(UserQueryVO uq); public List<User> findUserByNameAndSex(HashMap hashMap); public List<User> findUsersByNameAndSex(UserQueryVO vo); }
Test.java
@Test public void testFindUsersByNameAndSex(){ SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserQueryVO vo = new UserQueryVO(); User u = new User(); // u.setUsername("小明"); // u.setSex("1"); vo.setUser(u); List<User> list = mapper.findUsersByNameAndSex(vo); for(User user : list){ System.out.println(user); } sqlSession.close(); }
此时发出的Sql语句: SELECT * FROM user
去掉注释发出的Sql语句是:
Preparing: SELECT * FROM user WHERE username LIKE '%小明%' AND sex = ?
Parameters: 1(String)
2.sql片段
SQL片段的功能可以提高Sql的可重用性。
(1)定义
<!-- Sql片段: 可以将sql中任何部分放到sql片段中 建议: 不要将sql中的关键字放进去,比如 select where --> <sql id="whereClause"> <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username LIKE '%${user.username}%' </if> <if test="user.sex != null and user.sex != ''"> AND sex = #{user.sex} </if> </if> </sql>
(2)引用SQL片段
<!-- 标签的使用 --> <select id="findUsersByNameAndSex" parameterType="userQueryVo" resultType="user"> SELECT * FROM user <!--wher标签:将后面第一个AND去掉,如果没有条件则把自己去掉 --> <where> <!-- refid: Sql片段的ID --> <include refid="whereClause"></include> </where> </select>
3.foreach标签
向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到Sql中。
UserMapper.xml
UserMapper.java
Test.java
输出的sql语句:
Preparing: SELECT * FROM user WHERE id IN ( ? , ? , ? , ? )
Parameters: 29(Integer), 31(Integer), 32(Integer), 33(Integer)