Mybatis 映射文件标签详解

1.1 Mybatis映射文件(核心)
1.1.1 输入映射
1.1.1.1 ParameterType
指定输入参数的java类型,可以使用别名或者类的全限定名。它可以接收简单类型、POJO、HashMap。
1.1.1.1.1 传递简单类型
参考需求:根据用户ID查询用户信息。

1.1.1.1.2 传递POJO对象
1.1.1.1.2.1 需求
根据用户性别和用户名称来查询用户信息
1.1.1.1.2.2 编写mapper接口
//根据用户性别和用户名称来查询用户信息
public List findUserByUser(User user);
1.1.1.1.2.3 编写mapper映射文件

<select id="findUserByUser"parameterType=“user” resultType=“user”>
SELECT * FROM USER WHERE sex=#{sex} AND username LIKE '% u s e r n a m e &lt; / s e l e c t &gt; M y b a t i s 获 取 入 参 的 值 是 通 过 O G N L 表 达 式 从 对 象 中 获 取 的 。 该 案 例 中 , s e x 和 u s e r n a m e 都 是 u s e r 对 象 的 属 性 , 而 且 必 须 完 全 一 致 。 而 且 在 使 用 {username}%&#x27; &lt;/select&gt; Mybatis获取入参的值是通过OGNL表达式从对象中获取的。 该案例中,sex和username都是user对象的属性,而且必须完全一致。而且在使用 username</select>MybatisOGNLsexusernameuser使{}时传入的不是value,而是具体的属性名称
1.1.1.1.2.4 编写测试代码

@Test
publicvoid findUserByUserTest(){
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 构造User对象
User user = new User();
user.setSex("1");
user.setUsername("小明");

// 调用mapper对象的方法
List<User> list = userMapper.findUserByUser(user);

System.out.println(list);
// 关闭SqlSession
sqlSession.close();

}

1.1.1.1.3 传递POJO包装对象
1.1.1.1.3.1 需求
完成用户信息的综合查询,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息)。

1.1.1.1.3.2 创建包装对象

针对需求,建议使用自定义的包装类型pojo。在包装类中将复杂的查询字段包装进去。

先定义下用户扩展类UserExt.java(一般User.java类要和数据表表字段一致,最好不要在这里面添加其他字段)

定义复杂查询的POJO包装类:

1.1.1.1.3.3 编写Mapper接口
//通过包装类来进行复杂的用户信息综合查询
public List findUserList(UserQueryVOuserQueryVO);
1.1.1.1.3.4 编写mapper映射文件

<select id="findUserList"parameterType=“userQueryVO” resultType=“userExt”>
SELECT * FROM USER WHERE sex=#{userExt.sex} AND usernameLIKE ‘%${userExt.username}%’

注意:入参的类型变为UserQueryVO、出参的类型变为UserExt,#{}里面的参数变为UserQueryVO对象中的userExt属性的sex和username子属性。

1.1.1.1.3.5 编写测试代码

@Test
publicvoid findUserListTest() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//构造userQueryVO对象
UserQueryVO userQueryVO = new UserQueryVO();
  
// 构造UserExt对象
UserExt userExt= new UserExt();
userExt.setSex("1");
userExt.setUsername("小明");
  
userQueryVO.setUserExt(userExt);

// 调用mapper对象的方法
List<UserExt> list = userMapper.findUserList(userQueryVO);

System.out.println(list);
// 关闭SqlSession
sqlSession.close();

}

1.1.1.1.4 传递HashMap
同传递POJO对象一样,只是map的key要和#{}里面的参数名称一致。
1.1.2 输出映射
1.1.2.1 resultType
1.1.2.1.1 要求
使用resultType进行结果映射时,查询的列名和映射的pojo属性名完全一致,该列才能映射成功。
如果查询的列名和映射的pojo属性名全部不一致,则不会创建pojo对象;
如果查询的列名和映射的pojo属性名有一个一致,就会创建pojo对象。

1.1.2.1.2 输出简单类型
当输出结果只有一列时,可以使用简单类型作为输出结果类型。

1.1.2.1.2.1 Mapper映射文件

<select id="findIdFromUser"resultType=“int”>
SELECT id FROM USER

1.1.2.1.2.2 Mapper接口
//学习:resultType输出简单类型
public List findIdFromUser();
1.1.2.1.2.3 测试代码
@Test
publicvoid findIdFromUserTest() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 调用mapper对象的方法
List<Integer> list = userMapper.findIdFromUser();

System.out.println(list);
// 关闭SqlSession
sqlSession.close();

}

1.1.2.1.3 输出POJO单个对象和列表
注意:输出单个pojo对象和pojo列表(盛放pojo对象)时,mapper映射文件中的resultType的类型是一样的,mapper接口的方法返回值不同。

1.1.2.1.3.1 Mapper映射文件
Mapper映射文件是同一个。

SELECT * FROM USER WHERE username LIKE ‘%${value}%’

1.1.2.1.3.2 Mapper接口
下面看下mapper接口的不同之处
1、 输出单个pojo对象
//根据用户名称来模糊查询用户信息
public UserfindUsersByName(String username);
2、 输出pojo列表

//根据用户名称来模糊查询用户信息列表
public List findUsersByName(String username);

总结:同样的mapper映射文件,返回单个对象和对象列表时,mapper接口在生成动态代理的时候,会根据返回值的类型,决定调用selectOne方法还是selectList方法。

1.1.2.2 resultMap
resultMap可以进行高级结果映射(一对一、一对多映射,第二天讲解)。

1.1.2.2.1 要求
使用resultMap进行输出映射时,查询的列名和对应的pojo属性不需要一致,只需要在mapper映射文件中定义一个resultMap,把列名和属性名做一个映射关系即可,但是这列名和属性名都要是正确的。

1.1.2.2.2 Mapper映射文件
注意:使用resultMap的时候,mapper映射文件中要编辑两块内容:定义resultMap和定义statement;

定义statement:

<select id="findUserByIdResultMap"parameterType=“int” resultMap=“userResultMap”>
SELECT id id_,usernameusername_,sex sex_ FROM USER WHERE id = #{id}

定义resultMap:

<resultMap type="user"id=“userResultMap”>



1.1.2.2.3 Mapper接口定义
//根据ID查询用户信息(学习resultMap)
public User findUserByIdResultMap(int id);

定义Statement使用resultMap映射结果集时,Mapper接口定义方法的返回值类型为mapper映射文件中resultMap的type类型。
1.1.2.2.4 测试代码
@Test
publicvoid findUserByIdResultMapTest() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 调用mapper对象的方法
User user = userMapper.findUserByIdResultMap(1);

System.out.println(user);
// 关闭SqlSession
sqlSession.close();

}
1.1.3 SQL片段
Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。
1.1.3.1 定义SQL片段
使用sql标签来定义一个SQL片段:

id,username,sex,birthday,address

1.1.3.2 引用SQL片段
使用 来引用SQL片段:

<select id="findUserByIdSql"parameterType=“int” resultType=“user”>
SELECT FROM USER WHEREid=#{id}

1.1.4 动态SQL(重点)
通过Mybatis提供的各种标签方法实现动态拼接sql,使得mapper映射文件在编写SQL时更加灵活,方便。动态标签有:if、where、foreach、set等

1.1.4.1 需求
根据性别或者再加上用户名称来查询用户信息。
1.1.4.2 If
If标签作为判断入参来使用的,如果符合条件,则把if标签体内的SQL拼接上。
注意:用if进行判断是否为空时,不仅要判断null,也要判断空字符串‘’;
1.1.4.2.1 映射文件

<select id="findUser4If"parameterType=“user” resultType=“user”>
SELECT * FROM USER WHERE sex=#{sex}

AND username LIKE ‘%${username}%’


1.1.4.2.2 Mapper接口
//根据性别或者再加上用户名称来查询用户信息(学习动态SQL之IF标签)
public List findUser4If(User user);
1.1.4.2.3 测试代码
不传用户名:

输出的SQL如下(也不包含用户名):

传用户名:

输出SQL如下(查询条件包含用户名):

通过测试可以得知,打印出的SQL语句确实会随着条件的满足情况而不一样。
1.1.4.3 Where
Where标签可以自动处理它后面的第一个and
1.1.4.3.1 需求
根据查询条件来查询用户信息,查询条件可能会有性别或者用户名称,有可能什么没有。

1.1.4.3.2 映射文件
根据需求,我们为了保证SQL的正确性,可以在where后面使用无意义的1=1。

<select id="findUser4If"parameterType=“user” resultType=“user”>
SELECT * FROM USER WHERE 1=1

AND sex=#{sex}


AND username LIKE ‘%${username}%’

如果不加1=1,则where后面的条件是错误的。当然还有一种更好的方式来处理这种问题,那就是where标签,修改如下:

<select id="findUser4Where"parameterType=“user” resultType=“user”>
SELECT * FROM USER


AND sex=#{sex}


AND username LIKE ‘%${username}%’


1.1.4.4 Foreach
向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到SQL中。

1.1.4.4.1 需求
根据用户id的集合查询用户列表。
1.1.4.4.2 直接传递List集合
1.1.4.4.2.1 映射文件

<select id=“findUsersByIdListForEach"parameterType=“list” resultType=“user”>
SELECT * FROM USER


<foreach collection=“list"item=“id” open=“AND id IN(” close=”)“separator=”,”>
#{id}



1.1.4.4.2.2 Mapper接口
//根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合)
public ListfindUsersByIdListForEach(List idList);
1.1.4.4.2.3 测试代码
@Test
publicvoid findUsersByIdListForEachTest(){
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 构造List<Integer>集合
List<Integer> idList = new ArrayList<Integer>();
idList.add(1);
idList.add(10);

// 调用mapper对象的方法
List<User> list =userMapper.findUsersByIdListForEach(idList);

System.out.println(list);
// 关闭SqlSession
sqlSession.close();

}

1.1.4.4.3 传递pojo对象中的List集合
1.1.4.4.3.1 定义pojo中的List属性

1.1.4.4.3.2 映射文件

<select id=“findUsersByIdListForEach"parameterType=“UserQueryVO” resultType=“user”>
SELECT * FROM USER


<foreach collection=“idList"item=“id” open=“AND id IN(” close=”)“separator=”,”>
#{id}




1.1.4.4.3.3 Mapper接口
//根据用户ID的集合查询用户列表(学习foreach标签之通过POJO对象传ID集合)
public ListfindUsersByIdListForEachPojo(UserQueryVO userQueryVO);
1.1.4.4.3.4 测试代码
@Test
publicvoid findUsersByIdListForEachPojoTest(){
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 构造UserQueryVO对象
UserQueryVO userQueryVO = new UserQueryVO();
  
// 构造List<Integer>集合
List<Integer> idList = new ArrayList<Integer>();
idList.add(1);
idList.add(10);
  
userQueryVO.setIdList(idList);

// 调用mapper对象的方法
List<User> list =userMapper.findUsersByIdListForEachPojo(userQueryVO);

System.out.println(list);
// 关闭SqlSession
sqlSession.close();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以将数据库操作与Java对象之间的映射关系进行配置,提供了一种简单且灵活的方式来访问数据库。 在MyBatis中,映射文件是用于定义SQL语句和结果映射的配置文件。下面是映射文件详解: 1. 命名空间(namespace):映射文件中的命名空间用于对SQL语句进行分类和管理,可以通过命名空间来引用映射文件中定义的SQL语句。 2. 结果映射(resultMap):结果映射用于将查询结果映射Java对象上。可以通过resultMap标签定义结果映射,指定查询结果与Java对象之间的对应关系。 3. SQL语句(select、insert、update、delete):映射文件中可以定义各种SQL语句,包括查询、插入、更新和删除等操作。可以通过标签(如select、insert、update、delete)来定义SQL语句,并在其中编写具体的SQL语句。 4. 参数映射(parameterType):参数映射用于将Java对象作为参数传递给SQL语句。可以通过parameterType属性指定参数类型,也可以通过parameterMap标签定义参数映射。 5. 返回值映射(resultType):返回值映射用于将查询结果转换为Java对象。可以通过resultType属性指定返回值类型,也可以通过resultMap标签引用已定义的结果映射。 6. 动态SQL:MyBatis支持动态SQL,可以根据条件动态生成SQL语句。可以使用if、choose、when、otherwise等标签来实现动态SQL的编写。 7. 参数传递:映射文件中可以使用#{}或者${}来传递参数。#{}会将参数转义后传递给数据库,${}会直接将参数拼接到SQL语句中。 8. 引用其他映射文件映射文件可以通过include标签引用其他映射文件,可以将一些通用的SQL语句定义在公共的映射文件中,然后在需要的地方引用。 以上是对MyBatis映射文件详解,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值