mybatis自动将mysql的json类型转换为对象_MyBatis:复杂映射,配置深入

2fae75345ee3f60859b55204cd59d8b8.png

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值