Mybatis基础学习(三)—映射文件

时间:2023-11-12 22:17:20

一、输入映射

1.parameterType

    指定输入参数的Java类,可以使用别名或者类的全限定名。它也可以接受基本数据类型、POJO对象、HashMap。

 

(1)基本数据类型

Mybatis基础学习(三)—映射文件

 

(2)POJO对象

Mybatis基础学习(三)—映射文件

 

(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

Mybatis基础学习(三)—映射文件

 

UserMapper.java

Mybatis基础学习(三)—映射文件

 

Test.java

Mybatis基础学习(三)—映射文件

 

(4)传递HashMap

    map的key相当于POJO的属性。

 

UserMapper.xml

Mybatis基础学习(三)—映射文件

 

UserMapper.java

Mybatis基础学习(三)—映射文件

 

Test.java

Mybatis基础学习(三)—映射文件

结果:

     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

Mybatis基础学习(三)—映射文件

 

UserMapper.java

Mybatis基础学习(三)—映射文件

 

Test.java

Mybatis基础学习(三)—映射文件

输出的sql语句:

Preparing: SELECT * FROM user WHERE id IN ( ? , ? , ? , ? )

Parameters: 29(Integer), 31(Integer), 32(Integer), 33(Integer)