Mysql

Mybatis实践笔记-去XML化的注解开发

2020-09-28  本文已影响0人  叶子的翅膀

文章内容输出来源:拉勾教育Java高薪训练营

介绍

Mybatis使用注解开发,可以减少编写XML文件,对于不复杂的数据逻辑处理也是比较简单适用。
本文演示Mybatis使用注解开发的增删改查操作。

注解介绍

示例

一、开始之前的配置

项目代码链接:mybatis_demo_01_annoation

1、基于order订单表和user表的操作,两张表的实体如下

public class OrderEntity {
    private Integer id;
    private Integer userId;
    private BigDecimal amount;
    //订单关联的用户
    private UserEntity user;
    //ignore setter/getter
}
public class UserEntity {
    private Integer id;
    private String name;
    //用户关联的订单数据
    private List<OrderEntity> orders;
    //ignore setter/getter
}    

2、创建OrderDao和UserDao接口

3、在mybatis配置文件上配置对应的mapper,或者直接配置mapper所在的package包路径

<configuration>
    <mappers>
        <!--<mapper class="com.yyh.demo.dao.OrderDao"/>
        <mapper class="com.yyh.demo.dao.UserDao"/>-->
        <package name="com.yyh.demo.dao"/>
    </mappers>
</configuration>

4、创建OrderTest和UserTest的单元测试类

二、新增订单数据

/**
  * 多参数添加订单数据
  * @param userId 用户ID
  * @param amount 金额
  * @return 返回值大于0表示插入成功
  */
@Insert("INSERT INTO `order`(user_id, amount) VALUES(#{userId}, #{amount})")
int insert(@Param("userId") Integer userId, @Param("amount") BigDecimal amount);
/**
    * 实体参数添加订单数据
    * @param order 订单实体
    * @return 返回值大于0表示插入成功
    */
@Insert("INSERT INTO `order`(user_id, amount) VALUES(#{order.userId}, #{order.amount})")
int insertWithEntity(@Param("order") OrderEntity order);
/**
    * 实体参数添加订单数据,并返回订单ID
    * @param order 订单实体
    * @return 返回值大于0表示插入成功
    */
@Insert("INSERT INTO `order`(user_id, amount) VALUES(#{order.userId}, #{order.amount})")
@Options(useGeneratedKeys = true, keyProperty = "order.id", keyColumn = "id")
int insertWithEntityAndReturnId(@Param("order") OrderEntity order);

三、更新订单数据

/**
    * 更新某订单的金额
    * @param id 订单ID
    * @param amount 金额
    * @return 返回值大于0表示更新成功
    */
@Update("UPDATE `order` SET amount=#{amount} WHERE id=#{id}")
int updateAmount(@Param("id") Integer id, @Param("amount") BigDecimal amount);
/**
    * 更新某订单的金额
    * @param order 订单实体
    * @return 返回值大于0表示更新成功
    */
@Update("UPDATE `order` SET amount=#{order.amount} WHERE id=#{order.id}")
int updateAmountWithEntity(@Param("order") OrderEntity order);

四、删除订单数据

/**
    * 根据订单ID删除订单
    * @param id 订单ID
    * @return 返回值大于0表示删除成功
    */
@Delete("DELETE FROM `order` WHERE id=#{id}")
int delete(@Param("id") Integer id);

五、查询全部订单数据

@Select("SELECT * FROM `order`")
List<OrderEntity> selectList();

六、查询单条订单数据

/**
    * 根据订单ID查询订单数据
    * @param id 订单ID
    * @return
    */
@Select("SELECT * FROM `order` WHERE id=#{id}")
OrderEntity selectOne(@Param("id") Integer id);

七、查询订单以及关联的用户数据

/**
    * 获取订单数据以及关联的用户信息
    * @param id 订单ID
    * @return
    */
@Select("SELECT t1.id,t1.amount,t1.user_id,t2.name as user_name FROM `order` t1,user t2 where t1.user_id=t2.id AND t1.id=#{id}")
@Results({
        @Result(id=true, column = "id", property = "id"),
        @Result(column = "amount", property = "amount"),
        @Result(column = "user_id", property = "userId"),
        @Result(column = "user_id", property = "user.id"),
        @Result(column = "user_name", property = "user.name")
})
OrderEntity selectOneWithUser(Integer id);
/**
    * 获取订单数据以及关联的用户信息
    * @param id 订单ID
    * @return
    */
@Select("SELECT * FROM `order` WHERE id=#{id}")
@Results({
        @Result(id=true, column = "id", property = "id"),
        @Result(column = "amount", property = "amount"),
        @Result(column = "user_id", property = "user",
                javaType = UserEntity.class, one = @One(select = "com.yyh.demo.dao.UserDao.selectOne"))
})
OrderEntity selectOneWithUser2(Integer id);

八、查询用户以及关联的订单数据

/**
    * 获取某用户的数据以及关联订单数据。延迟加载
    * @param id
    * @return
    */
@Select("select * from user where id=#{id}")
@Results({
        @Result(id=true, column = "id", property = "id"),
        @Result(column = "name", property = "name"),
        @Result(property = "orders", column = "id",
                javaType = List.class, many = @Many(select = "com.yyh.demo.dao.OrderDao.selectListByUser", fetchType = FetchType.LAZY))
})
UserEntity selectOneWithOrders(Integer id);
/**
    * 获取某用户的数据以及关联订单数据
    * @param id
    * @return
    */
@Select("select * from user where id=#{id}")
@Results({
        @Result(id=true, column = "id", property = "id"),
        @Result(column = "name", property = "name"),
        @Result(property = "orders", column = "id",
                javaType = List.class, many = @Many(select = "com.yyh.demo.dao.OrderDao.selectListByUser"))

})
UserEntity selectOneWithOrders2(Integer id);

九、使用动态SQL支持复杂条件的查询订单数据

public class OrderParam {
    //最小金额
    private BigDecimal minAmount;
    //最大金额
    private BigDecimal maxAmount;
    //用户ID
    private Integer userId;
    //ignore getter/setter
}   

/**
    * 复杂的查询订单数据
    * @param param
    * @return
    */
@Select({
        "<script>",
        "SELECT * FROM `order`",
        "<where> ",
        "<if test='null != userId'>and user_id=#{userId}</if>",
        "<if test='null != minAmount'>and amount &gt;= #{minAmount}</if>",
        "<if test='null != maxAmount'>and amount &lt;= #{maxAmount}</if>",
        "</where>",
        "</script>"
})
List<OrderEntity> selectListByCondition2(OrderParam param);
  1. 示例1
public class OrderProvider {

    public String selectListByCondition(OrderParam param) {
        SQL sql = new SQL().SELECT("*").FROM("`order`");
        if(null != param.getUserId()) {
            sql.WHERE("user_id=#{userId}");
        }
        if(null != param.getMinAmount()) {
            sql.WHERE("amount>=#{minAmount}");
        }
        if(null != param.getMaxAmount()) {
            sql.WHERE("amount<=#{maxAmount}");
        }
        return sql.toString();
    }
}

 /**
    * 复杂的查询订单数据
    * @param param
    * @return
    */
@SelectProvider(type = OrderProvider.class, method="selectListByCondition")
List<OrderEntity> selectListByCondition(OrderParam param);
  1. 示例2
public class OrderProvider {
    public String selectListByCondition2(Map<String, Object> param) {
        SQL sql = new SQL().SELECT("*").FROM("`order`");
        if(null != param.get("userId")) {
            sql.WHERE("user_id=#{userId}");
        }
        if(null != param.get("minAmount")) {
            sql.WHERE("amount>=#{minAmount}");
        }
        if(null != param.get("maxAmount")) {
            sql.WHERE("amount<=#{maxAmount}");
        }
        return sql.toString();
    }
}

/**
    * 复杂的查询订单数据
    * @param userId 用户ID
    * @param minAmount 最小金额
    * @param maxAmount 最大金额
    * @return
    */
@SelectProvider(type = OrderProvider.class, method="selectListByCondition2")
List<OrderEntity> selectListByCondition3(@Param("userId") Integer userId, @Param("minAmount") BigDecimal minAmount, @Param("maxAmount") BigDecimal maxAmount);

如果接口有多个参数,在provider中要使用Map<String, Object>来进行接收

上一篇下一篇

猜你喜欢

热点阅读