MyBatis注解

MyBatis常用注解

  1. 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注解的增删改查

  1. 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);
    
  2. 编写核心配置文件

    <!--我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可-->
    <!--<mappers>
        &lt;!&ndash;扫描使用注解的Mapper类&ndash;&gt;
        <mapper class="com.code.mapper.UserMapper"></mapper>
    </mappers>-->
    <!--或者指定扫描包含映射关系的接口所在的包也可以-->
    <mappers>
        <!--扫描使用注解的Mapper类所在的包-->
        <package name="com.code.mapper"></package>
    </mappers>
    
  3. 编写测试方法

    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);
    
    }
    

使用注解实现复杂映射开发

  1. 使用注解开发后,我们可以使用 @Results、@Result,@One、@Many 注解组合完成复杂关系的配置。

在这里插入图片描述

一对一查询(注解)

需求:查询一个订单,与此同时查询出该订单所属的用户

  1. 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();
    
  2. UserMapper接口

    /**
     * 根据id查询用户
     * @param uid
     * @return
     */
    @Select("select * from user where id = #{uid}")
    public User findById(Integer uid);
    
  3. 测试代码

    /**
     * 一对一查询(注解方式):查询一个订单,与此同时查询出该订单所属的用户
     */
    @Test
    public void testOneToOne() {
    
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
    
        List<Orders> allWithUser = mapper.findAllWithUser();
    
        for (Orders orders : allWithUser) {
            System.out.println(orders);
        }
    
    }
    

一对多查询(注解)

查询一个用户,与此同时查询出该用户具有的订单

  1. 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();
    
  2. OrderMapper接口

    /**
     * 查询一个用户,与此同时查询出该用户具有的订单:根据传递过来的用户id,查询该用户所具有的订单信息
     * @param uid
     * @return
     */
    @Select("select * from orders where uid = #{uid}")
    public List<Orders> findOrderByUid(Integer uid);
    
  3. 测试代码

    /**
     * 一对多查询(注解方式):查询一个用户,与此同时查询出该用户具有的订单
     */
    @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());
        }
    
    }
    

多对多查询(注解)

查询所有用户,同时查询出该用户的所有角色

  1. 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();
    
  2. 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);
    
  3. 测试方法

    /**
     * 多对多查询(注解方式):查询所有用户,同时查询出该用户的所有角色
     */
    @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());
        }
    
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值