07.MyBatis配置文件深入
1.ResutlMap属性
作用:建立对象关系映射。
resultTyp和resultMap的区别:
-
resultMap:
可以防止实体属性与数据库字段不一致时,重新绑定实体属性和数据库字段,从而将查询结果手动封装到实体类中。
-
ResultMap:
如果实体属性名与表中字段名一致,将查询结果自动封装到实体类中。
(1)) 编写UserMapper接口
public interface UserMapper {
public List<User> findAllResultMap();
}
(2)编写UserMapper.xml
// 补充:如果有查询结果有 字段与属性是对应的,可以省略手动封装 【了解】
<resultMap id="userResultMap" type="user">
<id column="uid" property="id"></id>
<result column="NAME" property="username"></result>
<result column="PASSWORD" property="username"> </result>
</resultMap>
<select id="findAllResultMap" resultMap="userResultMap">
SELECT id AS uid,username AS NAME,password AS PASSWORD FROM USER
</select>
2.多条件查询(三种)
需求:根据id和username查询user表
(1)方式一:在编写sql的xml文件中,使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数。
(2)方式二:在接口类中使用注解,引入@Param()注解获取参数。
(3)使用pojo对象传递参数
3. 模糊查询
需求:根据username模糊查询user表
原生sql:
select * from user where username like ‘%张三%’
(1)方式1:
- UserMapper接口
public interface UserMapper {
public List<User> findByUsername1(String username);
}
- UserMapper.xml
<mapper namespace="com.lagou.mapper.UserMapper">
<select id="findByUsername1" parameterType="string" resultType="user">
select * from user where username like #{username}
</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); } }
(2)方式二
- UserMapper接口:
public interface UserMapper {
public List<User> findByUsername2(String username);
}
- UserMapper.xml
<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);
}
}
3.1${}和#{}的区别
#{}:表示个占位符号
- 通过#{}可以实现pararedStatement向占位符设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
- #{}可以接收简单类型值或pojo属性值。
- 如果parameterType传输单个简单类型值,#{}括号中名称随便写。
${}:表示拼接sql串
- 通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc的类型转换,会出现sql注入问题。
- ${}可以接收简单类型或pojo属性值。
- 如果parameterType传输单个简单类型值,${}括号中只能是value。