MyBatis 高级查询
`ResultMap` 属性
resultType
- 如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中resutlMap
- 如果实体的属性名与表中字段名不一致,可以使用resutlMap
实现手动封装到实体类中
编写 UserMapper
接口
List findAllResultMap();
编写 UserMapper.xml
<resultMap id="userResultMap" type="com.renda.domain.User">
<id property="id" column="id">id>
<result property="username" column="username">result>
<result property="birthday" column="birthday">result>
<result property="sex" column="sex">result>
<result property="address" column="address">result>
resultMap>
<select id="findAllResultMap" resultMap="userResultMap">
select * from `user`
select>
代码测试
@Before
public void init() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("sqlMapConfig.xml"));
sqlSession = sqlSessionFactory.openSession();
mapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void close() {
sqlSession.close();
}
@Test
public void testFindAllResultMap() {
List allResultMap = mapper.findAllResultMap();for (User user : allResultMap) {
System.out.println(user);
}
}
多条件查询
方式一
使用 #{arg0}-#{argn}
或者 #{param1}-#{paramn}
获取参数
UserMapper
接口
List findByIdAndUsername1(int id, String username);
UserMapper.xml
<select id="findByIdAndUsername1" resultMap="userResultMap">
select * from `user` where id = #{param1} and username = #{param2}
select>
测试
@Test
public void test3() throws IOException {
mapper = sqlSession.getMapper(UserMapper.class);
List users = mapper.findByIdAndUsername1(3, "Renda");for (User user : users) {
System.out.println(user);
}
}
方式二
使用注解,引入 @Param()
注解获取参数
UserMapper
接口
public List findByIdAndUsername2(@Param("id") int id, @Param("username") String username);
UserMapper.xml
<select id="findByIdAndUsername2" resultMap="userResultMap" >
select * from `user` where id = #{id} and username = #{username}
select>
测试
@Test
public void test4() throws IOException {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List users = mapper.findByIdAndUsername2(4, "Renda");for (User user : users) {
System.out.println(user);
}
}
方式三(推荐)
使用 POJO 对象传递参数
UserMapper
接口
List findByIdAndUsername3(User user);
UserMapper.xml
<select id="findByIdAndUsername3" resultMap="userResultMap" parameterType="com.renda.domain.User">
select * from `user` where id = #{id} and username = #{username}
select>
测试
@Test
public void test5() throws IOException {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = new User();
user1.setId(1);
user1.setUsername("Renda");
List users = mapper.findByIdAndUsername3(user1);for (User user : users) {
System.out.println(user);
}
}
模糊查询
方式一
UserMapper
接口
public List findByUsername1(String username);
UserMapper.xml
<select id="findByUsername1" resultMap="userResultMap" parameterType="string">
select * from `user` where username like #{username}
select>
测试
@Test
public void test6() throws IOException {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List users = mapper.findByUsername1("%Renda%");for (User user : users) {
System.out.println(user);
}
}
方式二
UserMapper
接口
List findByUsername2(String username);
UserMapper.xml
<select id="findByUsername2" resultMap="userResultMap" parameterType="string">
select * from `user` where username like '${value}'
select>
测试
@Test
public void test7() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List users = mapper.findByUsername2("%Renda%");for (User user : users) {
System.out.println(user);
}
}
`${}` 与 `#{}` 区别
#{}
表示一个占位符号
通过
#{}
可以实现preparedStatement
向占位符中设置值,自动进行 Java 类型和 JDBC 类型转换,#{}
可以有效防止 SQL 注入。#{}
可以接收简单类型值或 POJO 属性值。如果
parameterType
传输单个简单类型值,#{}
括号中名称随便写。
${}
表示拼接 SQL 串
通过
${}
可以将parameterType
传入的内容拼接在 SQL 中且不进行 JDBC 类型转换,会出现 SQL 注入问题。${}
可以接收简单类型值或 POJO 属性值。如果
parameterType
传输单个简单类型值,${}
括号中只能是 value。
MyBatis 映射文件深入
返回主键
应用场景:向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的主键值。
`useGeneratedKeys`
注意:只适用于主键自增的数据库,MySQL 和 SQL Server 支持,Oracle 不行。
UserMapper
接口
void saveUser1(User user);
UserMapper.xml
<insert id="saveUser1" parameterType="user" useGeneratedKeys="true" keyPr