当前位置: 首页 > 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>

相关文章:

  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读
  • 【面试专栏】Java8 - CompletableFuture,增强版Future
  • OSPF(开放式最短路径优先协议2)
  • cleanmymac最新2023版 mac清理软件CleanMyMac X4.12.5 中文版功能介绍
  • 【C语言学习】C语言初探
  • R语言处理表格数据(一)
  • Java开发环境配置
  • JS手写Promise(详细过程)
  • Postman接口测试之断言
  • C语言基础 — ( C语言的链表实例)
  • 社科院与杜兰大学金融管理硕士项目,承载着你读研时光的喜与乐
  • 再了解一点Ribbon的重试机制
  • MySQL5.7安装教程
  • Python 3.9 有什么新变化 - 新的特性
  • 为什么我们认为GPT是一个技术爆炸
  • HTB-baby~
  • Docker使用DockerFile部署Go项目
  • 自己设计的网站,如何实现分页功能?(详细代码+注释)
  • O2O、C2C、B2B、B2C是什么意思
  • 带你一文透彻学习【PyTorch深度学习实践】分篇——加载数据集(Dataset类、DataLoader类核心参数讲解)附:实例源代码
  • 基于html+css的图片居中排列
  • Python通用验证码识别OCR库ddddocr的安装使用
  • 「无服务器架构」无服务器架构是应用程序的正确选择?需要考虑利弊。
  • Pycharm中修改git提交代码的账户和用户名【Git追溯注解,git blame】
  • 中介变量、调节变量与协变量