目录
2.1 法一:使用 #{arg0}、#{argn} 或者 #{param1}、#{paramn} 获取参数
2.2 法二:使用注解,引入 @Param() 注解获取参数
一、ResultMap属性
1.1 resultType 与 ResultMap
- resultType :实体的属性名与表中字段名一致,将查询结果自动封装到实体类中;
- ResultMap:实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中;
1.2 编写UserMapper接口
ublic interface UserMapper {
/*
查询所有用户
*/
public List<User> findAllResultMap();
}
1.3 编写UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lagou.mapper.UserMapper">
<!--id : 标签的唯一标识
type: 封装后实体类型-->
<resultMap id="userResultMap" type="com.lagou.domain.User">
<!--手动配置映射关系-->
<!--id: 用来配置主键-->
<id property="id" column="id"></id>
<!-- result: 表中普通字段的封装-->
<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>
<!--查询所有用户-->
<!--resultMap:手动配置实体属性与表中字段的映射关系,完成手动封装-->
<select id="findAllResultMap" resultMap="userResultMap">
select * from user
</select>
</mapper>
二、多条件查询
根据用户id和用户名查询
2.1 法一:使用 #{arg0}、#{argn} 或者 #{param1}、#{paramn} 获取参数
public interface UserMapper {
public List<User> findByIdAndUsername1(Integer id, String username);
}
<?xml version="1.0" encoding="utf-8"?>
<mapper namespace="com.lagou.mapper.UserMapper">
<select id="findByIdAndUsername1" resultType="user">
<!-- select * from user where id = #{arg0} and username = #{arg1} -->
select * from user where id = #{param1} and username = #{param2}
</select>
</mapper>
2.2 法二:使用注解,引入 @Param() 注解获取参数
public interface UserMapper {
public List<User> findByIdAndUsername2(
@Param("id") Integer id,
@Param("username") String username
);
}
<?xml version="1.0" encoding="utf-8"?>
<mapper namespace="com.lagou.mapper.UserMapper">
<select id="findByIdAndUsername2" resultType="user">
select * from user where id = #{id} and username = #{username}
</select>
</mapper>
2.3 法三:使用POJO(推荐)
public interface UserMapper {
public List<User> findByIdAndUsername3(User user);
}
<?xml version="1.0" encoding="utf-8"?>
<mapper namespace="com.lagou.mapper.UserMapper">
<select id="findByIdAndUsername3"
parameterType="com.lagou.domain.User"
resultType="com.lagou.domain.User">
select * from user where id = #{id} and username = #{username}
</select>
</mapper>
三、模糊查询
方式一:
public interface UserMapper {
public List<User> findByUsername1(String username);
}
<?xml version="1.0" encoding="utf-8"?>
<mapper namespace="com.lagou.mapper.UserMapper">
<select id="findByUsername1" parameterType="string" resultType="user">
select * from user where username like #{username}
</select>
</mapper>
<!-- ---------------------- -->
<mapper namespace="com.lagou.mapper.UserMapper">
<select id="findByUsername1" parameterType="string" resultType="user">
select * from user
<where>
<if test="username != null and username != ''">
and username like concat ('%', #{username}, '%')
</if>
</where>
</select>
</mapper>
@Test
public void testFindByUsername() throws Exception {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findByUsername1("%王%");
for (User user : list) {
System.out.println(user);
}
}
方式二:不推荐,可能会出现sql注入
<?xml version="1.0" encoding="utf-8"?>
<mapper namespace="com.lagou.mapper.UserMapper">
<!--不推荐使用,因为会出现sql注入问题-->
<select id="findByUsername2" parameterType="string" resultType="user">
select * from user where username like '${value}'
</select>
</mapper>
@Test
public void testFindByUsername() throws Exception {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findByUsername2("%王%");
for (User user : list) {
System.out.println(user);
}
}
PS :#{} 与 ${} 的区别!
#{} 表示的是个占位符
通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换, # {}可以有效防止 sql 注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果parameterType 传输单个简单类型值, #{} 括号中名称随便写。${} 表示的是拼接字符串
通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,会出现 sql 注入问题。 ${} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值, ${} 括号中只能是 value。( TextSqlNode.java 源码可以证明 )