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 {

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值