mybatis注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
.mybatis注解开发
注意:
1.SqlMapConfig.xml该怎么写还怎么写,注解开发,只是用来替代mapper.xml映射文件的.
2.不要写mapper.xml映射文件
3.不同的sql语句,要对应不同的@Servlet,@Insert,@Update,@Delete注解
步骤:
1.不要写mapper.xml映射文件
2.在接口方法上直接写@Servlet,@Insert,@Update,@Delete配置sql语句就可以了.
案例:
@Select("select * from user")
List findAll();
mybatis注解基本实现CRUD
public interface UserDao{
// 查询所有用户
@Select("select * from user")
public List findAll();
// 根据id查询用户
@Select("select * from user where id = #{id}")
public User findById(int id);
// 删除
@Delete("delete from user where id = #{id}"")
public void delUser(int id);
// 添加
@Insert("insert into user(username,sex) values(#{username},#{sex}"")
public void save(User user);
// 更新
@Update("update user set username = #{username},sex=#{sex} where id = #{id}")
public void updateUser(User user);
}
mybatis注解开发-resultMap配置
分析:
当实体类属性名称与数据库列名不一致,又想成功封装数据,使用注解开发,就需要使用results注解来解决名称不一致的问题
使用方法与在mapper.xml中写法大致类似
位置:
在方法上使用Results注解配置映射
案例:
@Results(id="userMap",value={
@Result(id=true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "address",property = "userAddress"),
@Result(column = "sex",property = "userSex"),
@Result(column = "birthday",property = "userBirthday")
})
注意:
1. Results中的 id="userMap" 是唯一标识,用来方便其他方法引用该"Results"的配置
2. Result中的 id 表示是否是主键,默认false,如果是主键,可以添加上"id=true"
3. 其他方法在引用该"Results"时,使用 @ResultMap("id值") 来引用配置
mybatis使用注解实现复杂映射关系开发
实现复杂关系映射之前我们可以在映射文件中通过配置来实现,在使用注解开发时我们需要借助@Results 注解, @Result 注解, @One 注解, @Many 注解。
@Results 注解
代替的是标签
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(), @Result() })或@Results(@Result())
@Resutl 注解
代替了 标签和标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))
@One 注解(一对一)
代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式:
@Result(column=" ",property="",one=@One(select=""))
@Many 注解(多对一)
代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select=""))
mybatis注解开发-多表查询
使用:
1.实体类的定义,使用xml时,没有区别
2.sql语句的编写,和使用xml并且使用延迟加载时的sql也一样(也就是说,sql语句只写操作单表的sql语句)
3.使用@Result配置属性和数据库列名映射时,添加one(从类为一),或many(从类为多)
案例:
/**
* 多表查询,从表为一. (一对一,多对一)
*
* 查询所有账户,并且,获取每个账户所属的用户信息
* 主表为"Account"
* 从表为"User"
*/
@Select("select * from account")
@Results(id="accountMap",value = {
// Account类的普通属性的映射和原来一样
@Result(id=true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
// Account类中"从表"user属性的映射,要加上one(对一)
@Result(column = "uid",property = "user",
one=@One(
select="com.huyang.dao.UserDao.findById", //获取"从表"的数据时,调用的方法来获取
fetchType= FetchType.EAGER //使用"EAGER",表示立即加载
)
)
})
List findAll();
/**
* 多表查询,从表为多. (一对多,多对多)
*
* 查询所有用户,同时,查询用户所拥有的账户
* 主表为"User"
* 从表为"Account"
*/
@Select("select * from user")
@Results(id="userMap",value={
// User类的普通属性的映射和原来一样
@Result(id=true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "address",property = "userAddress"),
@Result(column = "sex",property = "userSex"),
@Result(column = "birthday",property = "userBirthday"),
// User类中"从表"accounts属性的映射,要加上many(对多)
@Result(property = "accounts",column = "id",
many = @Many(
select = "com.huyang.dao.AccountDao.findAccountByUid", //获取"从表"的数据时,调用的方法来获取
fetchType = FetchType.LAZY //使用"LAZY",表示延迟加载
)
)
})
List findAll();