MyBatis常用注解
-
Mybatis可以使用注解开发方式,可以减少编写Mapper映射文件了。
* @Insert:实现新增,代替了<insert></insert> * @Delete:实现删除,代替了<delete></delete> * @Update:实现更新,代替了<update></update> * @Select:实现查询,代替了<select></select> * @Result:实现结果集封装,代替了<result></result> * @Results:可以与@Result 一起使用,封装多个结果集,代替了<resultMap></resultMap> * @One:实现一对一结果集封装,代替了<association></association> * @Many:实现一对多结果集封装,代替了<collection></collection>
MyBatis注解的增删改查
-
UserMapper接口
/** * 查询用户 * @return */ @Select("select * from user") public List<User> findAll(); /** * 添加用户 * @param user */ @Insert("insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})") public void save(User user); /** * 更新用户 * @param user */ @Update("update user set username = #{username},birthday=#{birthday} where id = #{id}") public void update(User user); /** * 删除用户 * @param id */ @Delete("delete from user where id = #{id}") public void delete(Integer id);
-
编写核心配置文件
<!--我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可--> <!--<mappers> <!–扫描使用注解的Mapper类–> <mapper class="com.code.mapper.UserMapper"></mapper> </mappers>--> <!--或者指定扫描包含映射关系的接口所在的包也可以--> <mappers> <!--扫描使用注解的Mapper类所在的包--> <package name="com.code.mapper"></package> </mappers>
-
编写测试方法
private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; /** * 在 @Test方法标注的方法执行之前来执行 * * @throws IOException */ @Before public void before() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); sqlSession = sqlSessionFactory.openSession(); } /** * 在 @Test方法标注的方法执行之后来执行 */ @After public void after() { sqlSession.commit(); sqlSession.close(); } /** * 测试查询方法 * * @throws IOException */ @Test public void testSelect() throws IOException { UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> all = mapper.findAll(); for (User user : all) { System.out.println(user); } } /** * 测试添加方法 */ @Test public void testInsert() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("汤唯"); user.setSex("女"); user.setBirthday(new Date()); user.setAddress("北京"); mapper.save(user); } /** * 测试更新方法 */ @Test public void testUpdate() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("柳岩真美"); user.setBirthday(new Date()); user.setId(9); mapper.update(user); } /** * 测试删除方法 */ @Test public void testDelete() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.delete(9); }
使用注解实现复杂映射开发
- 使用注解开发后,我们可以使用 @Results、@Result,@One、@Many 注解组合完成复杂关系的配置。
一对一查询(注解)
需求:查询一个订单,与此同时查询出该订单所属的用户
-
OrderMapper接口
/** * 查询所有订单,同时查询订单所属的用户信息 * @return */ @Select("select * from orders") @Results({ // 代替的就是resultMap标签 id标签 result标签 @Result(property = "id", column = "id", id = true), @Result(property = "ordertime", column = "ordertime"), @Result(property = "total", column = "total"), @Result(property = "uid", column = "uid"), @Result(property = "user", javaType = User.class, column = "uid", one = @One(select = "com.code.mapper.UserMapper.findById", fetchType = FetchType.EAGER)) }) public List<Orders> findAllWithUser();
-
UserMapper接口
/** * 根据id查询用户 * @param uid * @return */ @Select("select * from user where id = #{uid}") public User findById(Integer uid);
-
测试代码
/** * 一对一查询(注解方式):查询一个订单,与此同时查询出该订单所属的用户 */ @Test public void testOneToOne() { OrderMapper mapper = sqlSession.getMapper(OrderMapper.class); List<Orders> allWithUser = mapper.findAllWithUser(); for (Orders orders : allWithUser) { System.out.println(orders); } }
一对多查询(注解)
查询一个用户,与此同时查询出该用户具有的订单
-
UserMapper接口
/** * 一对多查询:查询所有用户,及关联的订单信息 * @return */ @Select("select * from user") @Results({ @Result(property = "id",column = "id",id = true), @Result(property = "username",column = "username"), @Result(property = "birthday",column = "birthday"), @Result(property = "sex",column = "sex"), @Result(property = "address",column = "address"), @Result(property = "ordersList",javaType = List.class,column = "id",many = @Many(select = "com.code.mapper.OrderMapper.findOrderByUid",fetchType = FetchType.LAZY)) }) public List<User> findAllWithOrder();
-
OrderMapper接口
/** * 查询一个用户,与此同时查询出该用户具有的订单:根据传递过来的用户id,查询该用户所具有的订单信息 * @param uid * @return */ @Select("select * from orders where uid = #{uid}") public List<Orders> findOrderByUid(Integer uid);
-
测试代码
/** * 一对多查询(注解方式):查询一个用户,与此同时查询出该用户具有的订单 */ @Test public void testOneToMany() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> allWithOrder = mapper.findAllWithOrder(); for (User user : allWithOrder) { System.out.println(user); System.out.println(user.getOrdersList()); } }
多对多查询(注解)
查询所有用户,同时查询出该用户的所有角色
-
UserMapper接口
/** * 多对多注解: 查询所有用户及关联的角色信息 * @return */ @Select("select * from user") @Results({ @Result(property = "id",column = "id",id = true), @Result(property = "username",column = "username"), @Result(property = "birthday",column = "birthday"), @Result(property = "sex",column = "sex"), @Result(property = "address",column = "address"), @Result(property = "roleList",javaType = List.class,column = "id",many = @Many(select = "com.code.mapper.RoleMapper.findAllByUid")), }) public List<User> findAllWithRole();
-
RoleMapper接口
/** * 查询所有用户,同时查询出该用户的所有角色 * * 根据传递过来的用户id,查询该用户所具有的角色信息 * @param uid * @return */ @Select("SELECT * FROM sys_role r INNER JOIN sys_user_role ur ON ur.roleid = r.id WHERE ur.userid = #{uid}") public List<Role> findAllByUid(Integer uid);
-
测试方法
/** * 多对多查询(注解方式):查询所有用户,同时查询出该用户的所有角色 */ @Test public void testManyToMany() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> allWithRole = mapper.findAllWithRole(); for (User user : allWithRole) { System.out.println(user); System.out.println(user.getRoleList()); } }