当前位置: 首页 > news >正文

Mybatis、TKMybatis对比

文章目录

  • 1.Mybatis
    • (1)配置文件
    • (2)实体类
    • (3)Mapper
    • (4)mybatis-config.xml
  • 2.TKMybatis
    • (1)配置文件
    • (2)实体类
    • (3)Mapper
    • (4)mybatis-config.xml

1.Mybatis

(1)配置文件

  • mybatis.config-location=classpath:mybatis-config.xml,配置mybatis-config.xml路径,mybatis-config.xml中配置MyBatis基础属性,如果项目中配置了mybatis-config.xml文件需要设置该参数。
  • mybatis.mapper-locations=classpath*:mapper/**/*.xml,指定mapper文件夹
  • mybatis.type-handlers-package=geektime.spring.data.mybatisdemo.handler,不用再指定TypeHandler
  • mybatis.configuration.map-underscore-to-camel-case = true,将带有下划线的表字段映射为驼峰格式的实体类属性,省去了在mapper.xml文件中编写表字段列表与表实体类属性的映射关系,即resultMap。

(2)实体类

  • 使用 Mybatis 时,数据库表对应的实体类中,并没有使用任何注解
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Coffee {private Long id;private String name;private Money price;private Date createTime;private Date updateTime;
}

(3)Mapper

@Mapper
public interface CoffeeMapper {@Insert("insert into t_coffee (name, price, create_time, update_time)"+ "values (#{name}, #{price}, now(), now())")// 因为配置了mybatis.type-handlers-package,所以不用指定typeHandler// #{price, typeHandler=geektime.spring.data.mybatisdemo.handler.MoneyTypeHandler}@Options(useGeneratedKeys = true, keyColumn="id", keyProperty="id")int save(Coffee coffee);@Select("select * from t_coffee where id = #{id}")@Results({// 默认会根据名字映射// map-underscore-to-camel-case = true 可以实现一样的效果// 因为配置了mybatis.type-handlers-package,所以不用指定typeHandler@Result(id = true, column = "id", property = "id"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")// 因为配置了mybatis.type-handlers-package,所以不用指定typeHandler// @Result(column = "price", property = "price", typeHandler = geektime.spring.data.mybatisdemo.handler.MoneyTypeHandler.class),})Coffee findById(@Param("id") Long id);
}

(4)mybatis-config.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置 --><!-- 配置 --><settings><!-- 一级缓存默认开启,只在同一个sqlSession之间共享,方法必须在同一个事务内,才会支持,执行commit()方法时,会清空本地缓存 --><!-- 二级缓存默认开启,下面的配置可关闭,支持多个SqlSession之间共享缓存,如果两个SqlSession之间发生了更新操作,就不会去缓存拿数据了。如果在执行过程中,执行了多表操作,即如果A表和B表相关联,若对A表执行了更新操作,B表并不能够感知到,从而会拿到脏数据 --><setting name="cacheEnabled" value="false"/><!-- 日志实现 --><setting name="logImpl" value="LOG4J2"/></settings><typeAliases></typeAliases><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="name" value="mybatis"/> </plugin> </plugins>
</configuration>

2.TKMybatis

(1)配置文件

  • mybatis.config-location=classpath:mybatis-config.xml,配置mybatis-config.xml路径,mybatis-config.xml中配置MyBatis基础属性,如果项目中配置了mybatis-config.xml文件需要设置该参数。
  • mybatis.mapper-locations=classpath*:mapper/**/*.xml,指定mapper文件夹
  • mybatis.type-handlers-package=geektime.spring.data.mybatisdemo.handler,不用再指定TypeHandler

(2)实体类

  • TkMybatis默认使用继承Mapper接口中传入的实体类对象去数据库寻找对应的表,因此如果表名与实体类名不满足对应规则时会报错。这时使用@Table为实体类指定表(这种对应规则为驼峰命名规则)。
@Data
@Table(name = "anc_company")  // 建立实体类和数据库表之间的对应关系
public class Company {@Id // 标记和数据库表中主键字段对应的实体类字段@Column(name = "company_name")  // 建立实体类字段和数据库表字段之间的对应关系@GeneratedValue(strategy = GenerationType.IDENTITY) // 通用Mapper在执行insert操作之后将数据库自动生成的主键值回写到实体类对象中private String companyName;@Column(name = "company_logo")private String companyLogo;@Column(name = "company_dec")@Transient  // 用于标记不与数据库表字段对应的实体类字段。private String companyDec;
}

(3)Mapper

public interface CompanyMapper extends BaseMapper<Company> {
}

(4)mybatis-config.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置 --><!-- 配置 --><settings><!-- 一级缓存默认开启,只在同一个sqlSession之间共享,方法必须在同一个事务内,才会支持,执行commit()方法时,会清空本地缓存 --><!-- 二级缓存默认开启,下面的配置可关闭,支持多个SqlSession之间共享缓存,如果两个SqlSession之间发生了更新操作,就不会去缓存拿数据了。如果在执行过程中,执行了多表操作,即如果A表和B表相关联,若对A表执行了更新操作,B表并不能够感知到,从而会拿到脏数据 --><setting name="cacheEnabled" value="false"/><!-- 日志实现 --><setting name="logImpl" value="LOG4J2"/><!-- 驼峰配置 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases></typeAliases><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="name" value="mybatis"/> </plugin> </plugins>
</configuration>
http://www.lryc.cn/news/45020.html

相关文章:

  • 37了解高可用技术方案,如冗余、容灾
  • jdb调试问题集锦
  • 要和文心一言来一把你画我猜吗?
  • delete[] p->elems和free(p->elems)有什么区别?
  • CAS问题
  • 网络编程socket(下)
  • 华为OD机试题【打折买水果】用 C++ 编码,速通
  • JSON 数据类型
  • Python函数简介
  • 一文读懂 mysql 为什么要两阶段提交以及两阶段提交原理
  • 启动Hadoop报错【Error: JAVA_HOME is not set and could not be found.】
  • 《MySQL系列-InnoDB引擎35》索引与算法-B+树索引的使用
  • 【EHub_tx1_tx2_E100】不止科技NVISTAR ROC 300激光雷达Ubuntu18.04+ROS1ROS2 评测
  • C语言函数大全--d开头的函数
  • 基于springboot实现福聚苑社区团购演示【项目源码】
  • 动静态库的制作
  • QMS-云质-质量软件-客诉,为什么应该用两段式来处理
  • JS:关于邮箱的正则表达式及规则
  • 两句话,ChatGPT帮我写一个打飞机的游戏
  • 计算机图形学14:三维图形的投影变换
  • 【ChatGPT4】王老师零基础《NLP》(自然语言处理)第二课
  • 设计模式之中介者模式在前端的应用
  • 2023年还能入行程序员吗?工作3年以上的黑马老学员怎么说?
  • 接收机的噪声来源与噪声分析
  • Android FrameWork——SystemServer
  • 婴儿推车ASTMF883测试
  • 射频接收机概述
  • 实验三Numpy知识点总结
  • Code Review时学到的技巧之isAssignableFrom
  • IP协议以及相关技术