一、本文章学习目标
1. 掌握SQL映射文件的常用元素
2. 掌握select完成(单/多)条件查询
二、SQL映射的XML文件
1. MyBatis真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单。
2. SQL映射文件的几个顶级元素(按照定义的顺序)
- mapper - namespace(接口的包名.接口名保持一致)
- cache - 配置给定命名空间的缓存
- cache-ref - 从其他命名空间引用缓存配置
- resultMap - 用来描述数据库结果集和对象的对应关系(重点)
- sql - 可以重用的SQL块,也可以被其他语句引用
- insert - 映射插入语句
- update - 映射更新语句
- delete - 映射删除语句
- select - 映射查询语句
详解:
mapper映射文件的根节点,只有一个属性namespace,通过namespace可以区分不同的mapper,做到全局的唯一,通过namespace绑定dao接口,实现面向接口编程。
三、mapper元素
1. mapper:只有一个属性namespace,命名空间。
2. namespace和子元素的id联合保证唯一,区别不同的mapper。
3. 绑定DAO接口:namespace的命名必须跟某个接口同名;接口中的方法与映射文件中SQL语句id一一对应。
四、select元素
1. select是MyBatis中最常用的元素之一。
2. select语句有很多属性可以详细配置每一条语句:
- id:命名空间中唯一的标识符。接口中的方法与映射文件中的SQL语句id一一对应
- parameterType:传入SQL语句的参数类型的完全限定名或别名
- resultType:SQL语句返回值类型的完整类名或别名
3. 案例:根据用户名称查询用户列表(模糊查询)
UserMapper.xml
<!-- 根据用户名查询用户列表(模糊查询) -->
<select id="getUserListByUserName" parameterType="string" resultType="user">
select * from smbms_user where userName like CONCAT('%',#{uName},'%')
</select>
UserMapper.java
public interface UserMapper {
public List<User> getUserList();
public List<User> getUserListByUserName(String uName);
}
UserMapperTest.java
@Test
public void testGetUserListByUserName() {
List<User> userList = null;
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(UserMapper.class).getUserListByUserName("a");
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for(User user : userList) {
logger.debug("testGetUserListByUserName userCode: " + user.getUserCode() + " userName: " + user.getUserName());
}
}
4. 按条件查询用户表,若多条件情况下如何处理?
parameterType:
- 基础数据类型
int、String、Date等
只能传入一个,通过#{参数名}即可获取传入的值
UserMapper.java
public interface UserMapper {
public List<User> getUserList();
public List<User> getUserListByUserName(String uName);
public List<User> getUserListByUser(User user);
}
UserMapper.xml
<!-- 多条件查询用户列表 -->
<select id="getUserListByUser" resultType="user" parameterType="user">
select * from smbms_user where userName like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
UserMapperTest.java
@Test
public void testGetUserListByUser() {
List<User> userList = null;
SqlSession sqlSession = null;
User user = new User();
user.setUserName("a");
user.setUserRole(1);
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(UserMapper.class).getUserListByUser(user);
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for(User u : userList) {
logger.debug("testGetUserListByUser userCode: " + u.getUserCode() + "userName: " + u.getUserName());
}
}
- 复杂数据类型
Java实体类、Map等
通过#{属性名}或者#{Map的key}即可获取传入值
UserMapper.java
public List<User> getUserListByMap(Map<String, String> userMap);
UserMapper.xml
<select id="getUserListByMap" resultType="user" parameterType="Map">
select * from smbms_user where userName like CONCAT('%',#{uName},'%') and userRole=#{uRole}
</select>
UserMapperTest.java
@Test
public void testGetUserListByMap() {
List<User> userList = null;
SqlSession sqlSession = null;
Map<String, String> userMap = new HashMap<String, String>();
userMap.put("uName", "a");
userMap.put("uRole","1");
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(UserMapper.class).getUserListByMap(userMap);
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for(User u : userList) {
logger.debug("testGetUserListByUser userCode: " + u.getUserCode() + "userName: " + u.getUserName());
}
}
总结:MyBatis入参:
(1)单参数入参:Java基础数据类型
(2)多参数入参:Java实体类或者封装成Map