mysql
mysql-connector-java
tk.mybatis
mapper
3.4.2
tk.mybatis
mapper-spring-boot-starter
1.1.3
org.projectlombok
lombok
true
2、创建数据库表对应实体类对象
DROP TABLE IF EXISTS category;
CREATE TABLE category (
category_id INT PRIMARY KEY,
category_name VARCHAR (50) NOT NULL,
description VARCHAR (100)
);
DELETE FROM category;
INSERT INTO category (category_id, category_name, description) VALUES
(1, ‘Beverages’, ‘test’),
(2, ‘Condiments’, ‘test’),
(3, ‘Oil’, ‘test’);
@Data
@Table(name = “category”)
public class Category {
@Id
@Column(name = “category_id”)
private Integer categoryID;
private String categoryName;
private String description;
}
实体类中,使用了以下注解:
@Table
描述数据库表信息,主要属性有name(表名)、schema、catalog、uniqueConstraints等。
@Id
指定表主键字段,无属性值。
@Column
描述数据库字段信息,主要属性有name(字段名)、columnDefinition、insertable、length、nullable(是否可为空)、precision、scale、table、unique、updatable等。
@ColumnType
描述数据库字段类型,可对一些特殊类型作配置,进行特殊处理,主要属性有jdbcType、column、typeHandler等。
@Transient
标识该属性不进行数据库持久化操作,无属性。
还有其他相关注解,如@ColumnResult、@JoinColumn、@OrderBy、@Embeddable等,可以做简单解一下,用的不多。
@Data
lombok插件用于简化代码的注解,无需写get set 等代码。
3、Mapper数据库操作接口
只需要继承tk.mybatis.mapper.common.Mapper即可。
4、Tkmybatis数据库操作方法API
增
Mapper.insert(record);
保存一个实体,null的属性也会保存,不会使用数据库默认值
Mapper.insertSelective(record);
保存一个实体,null的属性不会保存,会使用数据库默认值
删
Mapper.delete(record);
根据实体属性作为条件进行删除,查询条件使用等号
Mapper.deleteByExample(example)
根据Example条件删除数据
Mapper.deleteByPrimaryKey(key)
根据主键字段进行删除,方法参数必须包含完整的主键属性
改
Mapper.updateByExample(record, example)
根据Example条件更新实体record
包含的全部属性,null值会被更新
Mapper.updateByExampleSelective(record, example)
根据Example条件更新实体record
包含的不是null的属性值
Mapper.updateByPrimaryKey(record)
根据主键更新实体全部字段,null值会被更新
Mapper.updateByPrimaryKeySelective(record)
根据主键更新属性不为null的值
查
Mapper.select(record)
根据实体中的属性值进行查询,查询条件使用等号
Mapper.selectAll()
查询全部结果
Mapper.selectByExample(example)
根据Example条件进行查询
Mapper.selectByExampleAndRowBounds(example, rowBounds)
根据example条件和RowBounds进行分页查询
Mapper.selectByPrimaryKey(key)
根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
Mapper.selectByRowBounds(record, rowBounds)
根据实体属性和RowBounds进行分页查询
Mapper.selectCount(record)
根据实体中的属性查询总数,查询条件使用等号
Mapper.selectCountByExample(example)
根据Example条件进行查询总数
Mapper.selectOne(record)
根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
Example条件 (自定义查询条件)
//注意:(addEqualTo)这里的userId是映射的实体类。
@Test
public void selectAllTest2() {
Example example = new Example(Category.class);
example.createCriteria()
.andEqualTo(“categoryID”,1)
.andEqualTo(“categoryName”,“Beverages”);
List categories = categoryDao.selectByExample(example);
System.out.println(categories);
assertEquals(true, categories.size() > 0);
}
//注意:(addCondition)这里的user_id是数据库的字段。即where后面的条件。应该写sql语句。
@Test
public void selectAllTest3() {
Example example = new Example(Category.class);
example.createCriteria()
.andCondition(“category_id=”,1)
.andCondition(“category_name=”,“Beverages”);
List categories = categoryDao.selectByExample(example);
System.out.println(categories);
assertEquals(true, categories.size() > 0);
}
Example条件基本涵盖了常用的sql条件,并且支持使用原生sql语句字符串查询。
拓展-复杂查询
方式1:
public class ComplexTKMapperTest {
@Autowired
CategoryDao categoryDao;
@Test
public void testNestConditions(){
Example e = new Example(Category.class);
Example.Criteria c = e.createCriteria();
//关键字查询部分
String keyword = “key”;
if (!StringUtils.isEmpty(keyword)) {
c.orEqualTo(“categoryName”, keyword)
.orEqualTo(“categoryID”,keyword)
.orEqualTo(“description”,keyword);
}
//部门查询部门
Example.Criteria criteria = e.createCriteria();
criteria.andEqualTo(“categoryID”, “1112”);
e.and(criteria);
List users = categoryDao.selectByExample(e);
}
}
执行的sql为:
SELECT category_id, category_name, description FROM category WHERE (
category_name = ?
OR category_id = ?
OR description = ? ) AND (category_id = ?)
方式2
@Test
public void testNestConditions2(){
Weekend weekend = new Weekend<>(Category.class);
//关键字查询部分
String keyword = “key”;
WeekendCriteria<Category, Object> keywordCriteria = weekend.weekendCriteria();
if (!StringUtils.isEmpty(keyword)) {
keywordCriteria.orLike(Category::getCategoryName, keyword).
orLike(Category::getCategoryID, keyword)
.orLike(Category::getDescription, keyword);
//此处不需要再用下面这一句了,不然上面这个条件组合会重复一次
//weekend.and(keywordCriteria)
}
//部门查询部分
Example example = new Example(Category.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo(“categoryID”, “i222”);
weekend.and(criteria);
List users = categoryDao.selectByExample(weekend);
}
其中Weekend是高版本的通用mapper版本才有,而且需要java8语法支持。
执行效果如下图:
总结下来,就是
每个条件组合(a/b/c) (d)各自创建自己的cirteria,再用and或者or方法去连接
结语
Tkmybatis极大地提高了我们对单表数据库操作的开发效率,可以在实际项目开发中推荐使用。
拓展部分:
源码的简单分析,大家可以自己基于这个原理自定义特定的需求
此框架为我们实现这些功能所有的改动都在Mapper层面,所有的Mapper都继承了tk.mybatis.mapper.common.Mapper
public interface WorkerMapper extends Mapper {}
Mapper接口的声明如下,可以看到Mapper接口实现了所有常用的方法
public interface Mapper extends BaseMapper, ExampleMapper, RowBoundsMapper, Marker {
}
看一下完整的UML图,太大了,可以用新窗口打开,放大之后再看
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/0d90539976a7f00ada7fc2c971e73c0a.jpeg)
那么如何才能正确的掌握Redis呢?
为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题
-
并发编程面试题汇总
-
JVM面试题汇总
-
Netty常被问到的那些面试题汇总
-
Tomcat面试题整理汇总
-
Mysql面试题汇总
-
Spring源码深度解析
-
Mybatis常见面试题汇总
-
Nginx那些面试题汇总
-
Zookeeper面试题汇总
-
RabbitMQ常见面试题汇总
JVM常频面试:
Mysql面试题汇总(一)
Mysql面试题汇总(二)
Redis常见面试题汇总(300+题)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
如何才能正确的掌握Redis呢?
为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题
-
并发编程面试题汇总
-
JVM面试题汇总
-
Netty常被问到的那些面试题汇总
-
Tomcat面试题整理汇总
-
Mysql面试题汇总
-
Spring源码深度解析
-
Mybatis常见面试题汇总
-
Nginx那些面试题汇总
-
Zookeeper面试题汇总
-
RabbitMQ常见面试题汇总
JVM常频面试:
[外链图片转存中…(img-qKvsMnFG-1713373656308)]
Mysql面试题汇总(一)
[外链图片转存中…(img-MV0HYmVA-1713373656309)]
Mysql面试题汇总(二)
[外链图片转存中…(img-rc9kTKR4-1713373656309)]
Redis常见面试题汇总(300+题)
[外链图片转存中…(img-xyp7r5BH-1713373656309)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!