6-Mybatis注解开发
6.1 MyBatis的常用注解
这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
6.2 MyBatis的增删改查
我们完成简单的user表的增删改查的操作:
6.2.1 添加UserMapper接口方法
@Insert("insert into user values(#{id}, #{username}, #{password}, #{birthday})") public void addUser(User user);
@Update("update user set username = #{username} where id = #{id}") public void updateUser(User user);
@Select("select * from user") public List<User> selectUser();
@Delete("delete from user where id = #{id}") public void deleteUser(Integer id);
@Select({"select * from user where id = #{id}"}) public User findUserById(Integer id);
|
6.2.2 测试
private IUserMapper userMapper; private IOrderMapper orderMapper;
@Before public void before() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(true); userMapper = sqlSession.getMapper(IUserMapper.class); orderMapper = sqlSession.getMapper(IOrderMapper.class); }
@Test public void addUser(){ User user = new User(); user.setId(3); user.setUsername("testName"); user.setPassword("123"); user.setBirthday(new Date());
userMapper.addUser(user); }
@Test public void updateUser(){ User user = new User(); user.setId(3); user.setUsername("updateTestName");
userMapper.updateUser(user);
}
@Test public void selectUser(){ List<User> users = userMapper.selectUser(); for (User user : users) { System.out.println(user); } }
@Test public void deleteUser(){ userMapper.deleteUser(3); }
|
修改MyBatis的核⼼配置⽂件,我们使⽤了注解替代的映射⽂件,所以我们只需要加载使⽤了注解Mapper接⼝即可:
<mappers> <mapper class="com.lagou.mapper.UserMapper" </mapper> </mappers>
|
或者指定扫描包含映射关系的接口所在的包也可以
<mappers> <package name="com.lagou.mapper"></package> </mappers>
|
6.3 MyBatis的注解实现复杂映射开发
实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results
注解,@Result
注解,@One
注解,@Many
注解组合完成复杂关系的配置。

6.4 一对一查询
6.4.1 一对一查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

6.4.2 一对一查询的语句
对应的sql语句:
select * from orders; select * from user where id=查询出订单的uid;
|
查询的结果如下:

6.4.3 创建Order和User实体
public class Order { private int id; private Date ordertime; private double total; private User user; }
public class User { private int id; private String username; private String password; private Date birthday; }
|
6.4.4 创建OrderMapper接口
public interface IOrderMapper { public List<Order> findOrderAndUser(); }
|
6.4.5 使⽤注解配置Mapper
public interface IOrderMapper {
@Results({ @Result(property = "id", column = "id"), @Result(property = "orderTime", column = "ordertime"), @Result(property = "total", column = "total"), @Result(property = "user", column = "uid", javaType = User.class, one = @One(select = "com.lemon.mapper.IUserMapper.findUserById")), }) @Select("select * from orders") public List<Order> findOrderAndUser(); }
|
@Select({"select * from user where id = #{id}"}) public User findUserById(Integer id);
|
6.4.6 测试结果
@Test public void oneToOne(){ List<Order> orderAndUser = orderMapper.findOrderAndUser(); for (Order order : orderAndUser) { System.out.println(order); } }
|

6.5 一对多查询
6.5.1 一对多查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

6.5.2 ⼀对多查询的语句
对应的sql语句:
select * from user; select * from orders where uid=查询出⽤户的id;
|
查询的结果如下:

6.5.3 修改User实体
public class User {
private int id; private String username; private String password; private Date birthday; private List<Order> orderList; }
|
6.5.4 创建UserMapper接⼝
public interface IUserMapper { public List<User> findAll(); }
|
6.5.5 使⽤注解配置Mapper
@Results({ @Result(property = "id", column = "id"), @Result(property = "username", column = "username"), @Result(property = "password", column = "password"), @Result(property = "birthday", column = "birthday"), @Result(property = "orderList", column = "id", javaType = List.class, many = @Many(select = "com.lemon.mapper.IOrderMapper.findOrderByUid")) }) @Select("select * from user") public List<User> findAll();
|
6.5.6 测试结果
@Test public void oneToMany(){ List<User> all = userMapper.findAll(); for (User user : all) { System.out.println(user); } }
|

6.6 多对多查询
6.6.1 多对多查询的模型
⽤户表和⻆⾊表的关系为,⼀个⽤户有多个⻆⾊,⼀个⻆⾊被多个⽤户使⽤
多对多查询的需求:查询⽤户同时查询出该⽤户的所有⻆⾊

6.6.2 多对多查询的语句
对应的sql语句:
select * from user; select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=⽤户的id
|
查询的结果如下:

6.6.3 创建Role实体,修改User实体
public class User { private int id; private String username; private String password; private Date birthday; private List<Order> orderList; private List<Role> roleList; }
public class Role { private int id; private String rolename; }
|
6.6.4 添加UserMapper接⼝⽅法
public List<User> findAllUserAndRole();
|
6.6.5 使⽤注解配置Mapper
@Results({ @Result(property = "id", column = "id"), @Result(property = "username", column = "username"), @Result(property = "password", column = "password"), @Result(property = "birthday", column = "birthday"), @Result(property = "roleList", column = "id", javaType = List.class, many = @Many(select = "com.lemon.mapper.IRoleMapper.findRoleByUid")) }) @Select("select * from user") public List<User> findAllUserAndRole();
|
6.6.6 测试结果
@Test public void ManyToMany(){ List<User> all = userMapper.findAllUserAndRole(); for (User user : all) { System.out.println(user); } }
|
