8. MyBatis的注解使用

简介

  • 本质是反射机制
  • 底层是动态代理

UserMapper.java

public interface UserMapper {
    @Select("select * from user")
    List<User> getUserList();
}

mybatis-config.xml

    <mappers>
        <mapper class="com.indi.dao.UserMapper"/>
    </mappers>

UserMapperTest.java

    @Test
    public void getUserList(){
        userMapper.getUserList().forEach(System.out::println);
    }

CRUD

BaseUtils.java

    public static SqlSession getSqlSession() {
        //设置自动提交事务
        return sqlSessionFactory.openSession(true);
    }

UserMapper.java

public interface UserMapper {

    @Select("select * from user")
    List<User> getUserList();

    //方法存在多个参数,所有的参数前面必须加上@param("id")注解,具体使用以@param()内的值为准
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") int id);

    @Insert("insert into user(id,name,pwd) values(#{id},#{name},#{password})")
    int addUser(User user);

    @Update("update user set name=#{name},pwd=#{password} where id=#{id}")
    int updateUser(User user);

    @Delete("delete from user where id = #{id}")
    int deleteUserById(@Param("id") int id);
}

UserMapperTest.java

	//直接调用对应方法传参即可

@Param()注解

  • 基本类型的参数或者String类型,需要加上
  • 引用类型不用加
  • 如果只有一个基本类型的话,可以忽略,但是建议加上
  • 在SQL中引用的就是@Param()中设定的属性名

注解实现复杂映射

	@Results注解
		代替了xml中的<resultMap>标签
		该注解中可以使用单个@Result注解,也可以使用@Result集合
		@Results的属性:
			id 为当前Results设置一个唯一标识,可供其它接口引用
			value 就是多个@Result组成的集合
		
	@Result注解
		代替了<id>标签和<result>标签
		@Result的属性:
			id 是否是主键字段
			column 数据库的列名
			property 需要装配的属性名


	@ResultMap注解
		引用设置好的@Results注解
		@ResultMap的属性:
			value 需要使用的Results的id标识

	PS: value只有一个属性的时候,可以省略value={}

举例:解决数据库字段与实体类中不一致的问题

    @Select("select * from user")
    @Results(id = "userMap", value = {
            @Result(id = true, column = "id", property = "userID"),
            @Result(column = "username", property = "userName")
    })
    List<User> findAll();

    @Select("select * from user where id = #{id}")
    @ResultMap("userMap")
    User findByID(int id);

注解实现一对一*

设置Result的one属性的select与fetchType实现一对一
在一对一中,etchType通常使用EAGER

AccountMapper.java

public interface AccountMapper {
    @Results(id = "accountMap", value = {
            @Result(property = "user", column = "uID", one = @One(select = "com.indi.dao.UserMapper.findByID", fetchType = FetchType.EAGER))
    })
    List<Account> findAll();
}

UserMapper.java

public interface UserMapper {
    @Select("select * from user where id = #{id}")
    @ResultMap("userMap")
    User findByID(int id);
}

注解实现一对多*

设置Result的one属性的select与fetchType实现一对多
在一对多中,etchType通常使用LAZY

UserMapper.java

public interface UserMapper {
    @Select("select * from user")
    @Results(id = "userMap", value = {
            @Result(property = "accounts",column = "id",many = @Many(select = "com.indi.dao.AccountMapper.findAcountByUID",
                    fetchType = FetchType.LAZY))
    })
    List<User> findAll();
}

AccountMapper.java

public interface AccountMapper {
    @Select("select * from account where uid = #{userID}")
    List<Account> findAcountByUID(Integer userID);
}

注解使用二级缓存

/**
 * 在需要使用二级缓存的接口类上添加引用
 */
@CacheNamespace(blocking = true)
public interface UserMapper {

}
使用 tk.mybatis 框架时,可以通过使用 @Column 注解来处理 JSON 字段。@Column 注解是 tk.mybatis 提供的一个用于指定数据库表字段的注解,可以用于指定字段名、类型、长度等属性。 对于 JSON 类型的字段,可以使用 @Column 注解的 type 属性来指定数据库字段的类型为 JSON。例如: ```java @Column(name = "json_field", type = "json") private String jsonField; ``` 在上述示例中,`jsonField` 字段被标记为 JSON 类型,对应的数据库字段名为 `json_field`。 此外,如果你想要在使用 tk.mybatis 时自动将 JSON 字符串转换为对象,可以使用 tk.mybatis 的自定义类型处理器(TypeHandler)来实现。你可以创建一个继承自 tk.mybatis.mapper.common.BaseTypeHandler<T> 的类型处理器,并在其中实现 JSON 字符串与对象之间的转换逻辑。 以下是一个示例: ```java @MappedTypes(value = YourJsonClass.class) public class JsonTypeHandler extends BaseTypeHandler<YourJsonClass> { private final ObjectMapper objectMapper; public JsonTypeHandler() { objectMapper = new ObjectMapper(); } @Override public void setNonNullParameter(PreparedStatement ps, int i, YourJsonClass parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, objectMapper.writeValueAsString(parameter)); } @Override public YourJsonClass getNullableResult(ResultSet rs, String columnName) throws SQLException { String json = rs.getString(columnName); if (json != null) { try { return objectMapper.readValue(json, YourJsonClass.class); } catch (IOException e) { throw new SQLException("Failed to convert JSON string to object", e); } } return null; } // 其他方法省略... } ``` 在上述示例中,`YourJsonClass` 是你自定义的表示 JSON 字段的类。通过重写 `setNonNullParameter` 和 `getNullableResult` 方法,可以实现将 JSON 字符串转换为对象以及将对象转换为 JSON 字符串的逻辑。 最后,你需要在 MyBatis 的配置文件中注册该类型处理器,以便 tk.mybatis 在处理 JSON 类型字段时能够正确地进行转换。具体的配置方式可以参考 MyBatis 的官方文档或 tk.mybatis 的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值