(六)Mybatis的注解开发

   Mybatis 的注解开发和 xml 配置在使用原理上是相同的,注解开发只是将在 xml 中配置的信息转移到注解上进行配置而已。

  • MyBatis 配置:可以直接引入接口类,也可以引入所在的包(MyBatis 会自动扫描包下的接口类)。
	<mappers>
		<!-- <mapper class="com.lyj.mapper.UserMapper"/>-->
        <package name="com.lyj.mapper"/>
    </mappers>

   注意,如果我们某个接口使用了注解开发,就不能再使用映射文件进行配置,即两种方式只能选择其中一种。

1、单表CRUD

1.1 查询所有数据
	// 查询User表全部信息
    @Select("SELECT * FROM user")
    public List<User> findAll();
1.2 根据id查询数据
	// 根据id查询表
    @Select("SELECT * FROM user WHERE id = #{id}")
    public User findById(Integer id);
1.3 模糊查询
	// 根据用户名模糊查询
    @Select("SELECT * FROM user WHERE username LIKE #{name}")
    public List<User> findByName(String name);
1.4 更新数据
	// 更新用户数据
    @Update("UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id}")
    public int updateUser(User user);
1.5 添加数据
	// 添加用户
    @Update("INSERT INTO user(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})")
    public void addUser(User user);
1.6 删除数据
	// 根据id删除用户
    @Delete("DELETE FROM user WHERE id = #{id}")
    public int deleteUser(Integer id);
1.7 查询用户总数
	// 查询用户总数
    @Select("SELECT count(id) FROM user")
    int countUser();
1.8 实体类属性与表列名的映射配置
	// 查询User表全部信息
    @Select("SELECT * FROM user")
    @Results(id = "userMap",value = {
            @Result(id = true,property = "my_id",column = "id"),
            @Result(property = "my_username",column = "username"),
            @Result(property = "my_birthday",column = "birthday"),
            @Result(property = "my_sex",column = "sex"),
            @Result(property = "my_address",column = "address"),
    })
    public List<MyUser> findMyAll();
  • @Results :定义映射结果集,id 属性为唯一标识,value 属性用于接收 @Result[] 注解类型的数组。
  • @Result:定义实体类属性和表列名的映射,id 属性为主键标识。
  • @ResultMap :用于引用 @Results 定义的映射结果集,避免了重复定义映射结果集。

2、复杂查询

2.1 多对一(一对一)查询实现
  • AccountMapper
public interface AccountMapper {

    // 查询账户表和每个账户关联的用户信息
    @Select("SELECT * FROM account")
    @Results(id = "AccountMap", value = {
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "uid", column = "uid"),
            @Result(property = "user", column = "uid",
                    one = @One(select = "com.lyj.mapper.UserMapper.findUserById", fetchType = FetchType.EAGER))
    })
    public List<Account> findAll();

    ...
}
  • @One:相当于标签 association ,用来指定子查询返回单一对象的语句。
  • select 属性:指定用于子查询的接口方法。
  • fetchType 属性:用于指定是立即加载(FetchType.EAGER)或延迟加载(FetchType.LAZY)。
  • UserMapper
public interface UserMapper {
    ...
    
    // 根据id查询单个用户
    @Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserById(Integer uid);
}

2.2 一对多查询实现
  • UserMapper
public interface UserMapper {

    // 查询User表和每个用户关联的账户信息
    @Select("SELECT * FROM user")
    @Results(id = "userMap", value = {
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "username", column = "username"),
            @Result(property = "birthday", column = "birthday"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "address", column = "address"),
            @Result(property = "accounts", column = "id",
                    many = @Many(select = "com.lyj.mapper.AccountMapper.findAccountsByUid", fetchType = FetchType.LAZY))
    })
    public List<User> findAll();

    ...
}
  • @Many:相当于标签 collection ,用来指定子查询返回对象集合的语句。
  • AccountMapper
public interface AccountMapper {

    ...

    // 根据uid查询账户信息
    @Select("SELECT * FROM account WHERE uid = #{uid}")
    public List<Account> findAccountsByUid(Integer uid);
}

2.3 二级缓存开启
  • MyBatis 配置:
	<settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
  • 映射接口中开启注解:
@CacheNamespace(blocking = true)
public interface UserMapper {
	...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值