Mybatis注解开发
# Mybatis注解开发
# 1.Mybatis的注解开发
# 1.1Mybatis常用注解
这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper
映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
@Insert
:实现新增
@Update
:实现更新
@Delete
:实现删除
@Select
:实现查询
@Result
:实现结果集封装
@Results
:可以与@Result 一起使用,封装多个结果集
@One
:实现一对一结果集封装
@Many
:实现一对多结果集封装
# 1.2 Mybatis的增删改查
1.创建接口使用注解的方式编写Sql语句
public interface UserMapper {
// 注解的方式对数据库CURD操作
/*
private Integer id;
private String username;
private String password;
private Date birthday;
*/
@Select("select * from user where id = #{id}")
public User select(int id);
@Update("update user set username = 'zhujietest' where id = 3")
public void update(int id);
@Delete("delete from user where id = #{id}")
public void delete(int id);
@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
public void insert(User user);
@Select("select * from user")
public List<User> selectAll();
}
2.修改Mybatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可
<!--扫描使用注解的类所在的包-->
<mappers>
<package name="com.example.dao"/>
</mappers>
3.创建测试类测试
@Test
public void test8() throws Exception{
SqlSession sqlSession = getSqlSession(); // 使用了方法提取
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 创建一个User对象
User user = new User();
user.setBirthday(null);
user.setUsername("test9");
user.setPassword("0000000");
userMapper.insert(user);
// 释放资源
sqlSession.close();
}
# 1.3 Mybatis的高级注解
MyBatis的注解实现复杂映射开发
实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>
来实现,使用注解开发后,我们可以使用@Results
注解,@Result
注解,@One
注解,@Many
注解组合完成复杂关系的配置
# 1.4 注解实现一对一查询
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
注意: 也就是说把之前的xml的配置大量信息,全部删除到,直接配置注解。使用之前的数据库表单以及三个实体类,需要在Dao包下面新建一个RoleMapper,一共三个实体类的代理接口,然后配置注解即可。
一对一查询的语句
对应的sql如下:
select * from orders;
select * from user where id=查询出订单的uid;
使用注解配置Mapper
使用注解配置OrderMapper接口的方法,在OrderMapper的接口方法中调用UserMapper的注解方法。
public interface OrderMapper {
// 第一种注解的方式并不能完全获取到想要的数据所以使用第二中细化
/*@Select("select *,o.id oid from orders o,user u where o.uuid = u.id")
@Results({
@Result(column = "oid",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(column = "uuid",property = "user.id"),
@Result(column = "username",property = "user.username"),
@Result(column = "password",property = "user.password"),
@Result(column = "birthday",property = "user.birthday")
})
public List<Order> findAll();*/
@Select("select *,o.id oid from orders o,user u where o.uuid = u.id")
@Results({
@Result(column = "oid",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(column = "uuid",property = "user.id"),
@Result(
property = "user", // 要封装的属性名称
column = "uid", // 根据那个字段去查询user表的数据
javaType = User.class, // 要封装的实体类型
// select属性: 代表查询那个接口的方法获得数据
one = @One(select="com.example.dao.UserMapper.findById")
)
})
public List<Order> findAll();
@Select("select * from orders where uuid = #{uuid}")
public List<Order> findByUid(int uid);
}
public interface UserMapper{
@Select("select * from user where id = #{id}")
public User findById(int id);
}
# 1.6 注解实现一对多查询
一对多查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
一对多查询的语句
对应的sql语句:
select * from user;
select * from orders where uid=查询出用户的id;
使用注解配置Mapper
- 在OrderMapper接口中创建findByUid的方法,使用注解的方式配置查询语句
- 在UserMapper接口中配置Results注解,调用OrderMapper的方法。
- 在Order实体类添加User实体类
- 在User实体类添加Order实体类作为订单数量的集合
public interface UserMapper {
public List<User> findUserAndOrder();
@Select("select * from user")
@Results({
@Result(id = true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(
property = "orderList",
column = "id",
javaType = List.class,
many = @Many(select = "com.example.dao.OrderMapper.findByUid")
)
})
public List<User> findUserAndOrderAll();
}
public interface OrderMapper {
@Select("select * from orders where uuid = #{uuid}")
public List<Order> findByUid(int uid);
}
# 1.7 注解实现多对多查询
多对多查询的模型
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
对应的sql语句:
select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id
使用注解配置Mapper
- 在User的实体类中要添加Role实体类的集合
- 在RoleMapper接口下面创建一个
findByUid()
的方法 - 使用UserMapper接口创建查询所有用户和每个用户的角色使用
@Results
注解 ,调用RoleMapper下的方法。
public interface RoleMapper {
@Select("select * from user_role ur,role r where ur.roleId = r.id and ur.userId = #{uid}")
public List<Role> findByUid(int uid);
}
public interface UserMapper{
@Select("select * from user")
@Results({
@Result(id = true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(
property = "roleList",
column = "id",
javaType = List.class,
many = @Many(select = "com.example.dao.RoleMapper.findByUid")
)
})
public List<User> findUserAndRoleAll();
}