zoukankan      html  css  js  c++  java
  • TkMybatis 是什么?

    一、TkMybatis

    Tkmybatis 是基于 Mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何 sql 语句,这极大地提高了项目开发效率。

    二、怎么用?

    1. 引用

    在 pom.xml 中引入 tk.mybatis 的引用。

    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>2.1.5</version>
    </dependency>
    

    2. DO 对象

    @Table(name = "t_plan")
    public class PopMerchantPlanDO{
    
    	/**
    	 * id
    	 */
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	private Long id;
    	/**
    	 * 编号
    	 */
    	private String code;
    }
    

    映射数据库表和实体对象,类似的注解还有 @Column、@ColumnType、@Transient 等等。

    3. Mapper 数据库操作接口

    public interface BaseDao<T> extends BaseMapper<T>, MySqlMapper<T>, IdsMapper<T>, ConditionMapper<T>, ExampleMapper<T> {
    }
    

    Dao 对象继承的这些接口帮你封装了一系列单表的操作,使你不用再为每个单表编写繁杂重复的 sql 语句。

    当你使用 Dao 对象操作数据库的时候,只需要调用这些接口中封装好的方法,就能完成一系列对单表的 CURD 操作,比如下面的 selectAll 方法,鉴于篇幅,更多的 CURD 方法,大家可以打开 Mapper 接口自行查看,一目了然。

    @RegisterMapper
    public interface SelectAllMapper<T> {
    
        /**
         * 查询全部结果
         *
         * @return
         */
        @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
        List<T> selectAll();
    }
    

    当然,对于复杂的 SQL 语句,比如 JOIN 操作等等,仍然需要自行编写 xml 文件和 SQL 语句。

    三、底层原理

    TkMybatis 的封装依赖一个 @SelectProvider 注解来完成,如果你使用过 @Select 注解,那么 @SelectProvider 与它没有质的区别,只是在定义注解的方式上有所不同, 一个是直接定义 sql, 一个是在外部定义好 sql 直接引用。

    public interface Mapper {
    
        @Select("select uuid,full_name as name from t_system_company ")
        List<Map<String, String>> getCompanyInfo();
    }
    
    @RegisterMapper
    public interface SelectAllMapper<T> {
    
        @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
        List<T> selectAll();
    }
    

    @SelectProvider 引用的各种 *Provider.class 实现类,就是依赖反射、注解等手段拼接 SQL 语句的过程。

        /**
         * 查询全部结果
         *
         * @param ms
         * @return
         */
        public String selectAll(MappedStatement ms) {
            final Class<?> entityClass = getEntityClass(ms);
            //修改返回值类型为实体类型
            setResultType(ms, entityClass);
            StringBuilder sql = new StringBuilder();
            sql.append(SqlHelper.selectAllColumns(entityClass));
            sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
    
            // 逻辑删除的未删除查询条件
            sql.append("<where>");
            sql.append(SqlHelper.whereLogicDelete(entityClass, false));
            sql.append("</where>");
    
            sql.append(SqlHelper.orderByDefault(entityClass));
            return sql.toString();
        }
    

    四、结语

    当初从 Hibernate 换到 Mybatis,把 HQL、QBC 语句的成本换成简单的 SQL 语句,这?现在又兜兜转转回去了?

    Tkmybatis 减少了一系列对单表的单调接口和繁杂的 SQL 语句,但也降低了代码的可读性,另外这种广而全的数据库操作,必然会牺牲一部分的查询性能。

    可以在一些并发量不大、对性能要求不高的项目中尝试下 Tkmybatis ,对一些比较大的项目来说,还是希望自己对 SQL 的控制更强一点。



    相关链接:1. mybatis @SelectProvider 注解, 打赌你没有用过

  • 相关阅读:
    flask1 + jinja2 day88
    linux9
    linux8 redis集群槽+docker
    dsadfa
    redis
    aaa
    a
    题目
    java对含有中文的字符串进行Unicode编码
    Java转Double类型经纬度为度分秒格式
  • 原文地址:https://www.cnblogs.com/jmcui/p/14067042.html
Copyright © 2011-2022 走看看