-
TKMybatis和Mybatis Plus 哪个用起来更好?
2019-08-27 22:46:59TKMybatis和Mybatis Plus 哪个用起来更好? 各自的优缺点是什么? -
tk mybatis和Thymeleaf及mybatis plus
2021-03-13 15:23:30一、tk mybatis 1、引入依赖 <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.2</version> </...一、tk mybatis
1、引入依赖
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.2</version> </dependency>
2.注解
@Table(name = "bill_")//要和数据库里的表名一样 @Id//标注主建 @GeneratedValue(strategy = GenerationType.IDENTITY)//主键策略 @Column(name = "id_") //列要和数据库名字里的一样,支持驼峰命名 @Transient //表示该属性不是数据库里的
3.mapper方法
/*使用mapper来对数据库进行操作,注意要导入tk.mybatis.mapper.common.Mapper的包*/ import tk.mybatis.mapper.common.Mapper; import java.util.List; public interface BillMapper extends Mapper<Bill> { }
方法 说明 List select(T record) 根据实体中的属性值进行查询,查询条件使用等号 T selectByPrimaryKey(Object key) 根据主键字段进行查询,方法参数必须包含完整的主键属性, List selectAll() 查询全部结果,select(null)方法能达到同样的效果 T selectOne(T record) 根据实体中的属性进行查询,只能有一个返回值,多个则抛出异常 int selectCount(T record); 根据实体中的属性查询总数, int insert(T record) 保存一个实体,null的属性也会保存,不会使用数据库默认值 int updateByPrimaryKey(T record) 根据主键更新实体全部字段,null值会被更新 int updateByPrimaryKeySelective(T record) 根据主键更新属性不为null的值 int delete(T record) :根据实体属性作为条件进行删除 int deleteByPrimaryKey(Object key) 根据主键字段进行删除,方法参数必须包含完整的主键属性 List selectByExample(Object example) 根据Example条件进行查询 重点 int selectCountByExample(Object example) 根据Example条件进行查询总数 int updateByExample(@Param(“record”) T record, @Param(“example”) Object example) 根据Example条件更新实体 record 包含的全部属性,null值会被更新 int deleteByExample(Object example) 根据Example条件删除数据 4.启动类
import tk.mybatis.spring.annotation.MapperScan; @SpringBootApplication @EnableConfigurationProperties @MapperScan("com.lxs.demo.dao") public class Application {
二、Thymeleaf
1.引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
2.配置
spring: thymeleaf: cache: false //关闭模板缓存 prefix: classpath:/templates/ suffix: .html 注意,把html 的名称空间,改成: xmlns:th="http://www.thymeleaf.org" 会有语法提示
3.常用语法
<body> <div style="text-align: center"> <span style="color: darkslategray; font-size: 30px">欢迎光临!</span> <hr/> <table class="list"> <tr> <th>id</th> <th>姓名</th> <th>用户名</th> <th>年龄</th> <th>性别</th> <th>生日</th> <th>备注</th> <th>操作</th> </tr> <tr th:each="user, status : ${users}" th:object="${user}">//遍历集合,先用${}表达式来取出user,使用*{}则要用th:object="${user}" <td th:text="${user.id}">1</td> <td th:text="*{name}">张三</td> <td th:text="*{userName}">zhangsan</td> <td th:text="${user.age}">20</td> <td th:text="${user.sex} == 1 ? '男': '女'">男</td> <td th:text="${#dates.format(user.birthday, 'yyyy-MM-dd')}">1980-02-30</td>//日期转换的方法 <td th:text="${user.note}">1</td> <td> <a th:href="@{/delete(id=${user.id}, userName=*{userName})}">删除</a> //url表达式 <a th:href="|/update/${user.id}|">修改</a> //文本替换 <a th:href="'/approve/' + ${user.id}">审核</a> //字符串拼接 </td> </tr> </table>
4.常用的th标签
5.内联js
内联文本:[[…]]内联文本的表示方式,使用时,必须先用th:inline=”text/javascript/none”激活,th:inline可以在父级标签内使用,甚至作为body的标签
<h5>内联js</h5> <script th:inline="javascript"> /*<![CDATA[*/ var text = '[[${text}]]'; alert(text); /*]]>*/ </script>
6.内嵌变量
<h5>内置变量</h5> <h6 th:text="${#dates.createNow()}">获取当前日期</h6> <h6 th:text="${#dates.createNow()}">获取当前日期</h6> <h6 th:text="${#strings.substring(text, 6, 9)}">截取字符串</h6> <h6 th:text="${#strings.length(text)}">获得长度</h6> <h6 th:text="${#strings.randomAlphanumeric(6)}">随机字符串</h6> <h6 th:text="${#strings.equals(text, 'hello text....')}"></h6>
三、Mybatis Plus
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变。
1.引入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatisplus.version}</version> </dependency> //引用了这个不用写get、set方法,在实体类加上@Data注解 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2.启动类
@SpringBootApplication @MapperScan("com.lxs.quickstart.mapper") public class QuickstartApplication { public static void main(String[] args) { SpringApplication.run(QuickstartApplication.class, args); } }
3.dao方法
public interface UserMapper extends BaseMapper<User> { }
4.常用注解
//如果mysql自增主键注解策略设置如下 @TableId(type = IdType.AUTO) private Long id; //排除实体类中非表字段 @TableField(exist = false)
5.内置增删改查
@Test public void testInsert() { User user = new User(); user.setName("开吧"); user.setEmail("ls@163.com"); user.setAge(3); Assert.assertTrue(mapper.insert(user) > 0); mapper.selectList(null).forEach(System.out :: println); } @Test public void testDelete() { // //主键删除 // mapper.deleteById(3l); // mapper.selectList(null).forEach(System.out :: println); // //批量删除:1 // mapper.delete(new QueryWrapper<User>().like("name", "J")); // mapper.selectList(null).forEach(System.out :: println); // //批量删除:2 // mapper.delete(Wrappers.<User>query().like("name", "J")); // mapper.selectList(null).forEach(System.out :: println); //批量删除:2 mapper.delete(Wrappers.<User>query().lambda().like(User::getName, "J")); mapper.selectList(null).forEach(System.out :: println); } @Test public void testUpdate() { // //基本修改 // mapper.updateById(new User().setId(1l).setName("慧科")); // mapper.selectList(null).forEach(System.out :: println); // //批量修改:1 // mapper.update(null, Wrappers.<User>update().set("email", "huike@163.com").like("name", "J")); // mapper.selectList(null).forEach(System.out :: println); //批量修改:2 mapper.update(new User().setEmail("huike@163.com"), Wrappers.<User>update().like("name", "J")); mapper.selectList(null).forEach(System.out :: println); } @Test public void testSelect() { // //基本查询 // System.out.println(mapper.selectOne(Wrappers.<User>query().eq("name", "Tom"))); //投影查询 mapper.selectList(new QueryWrapper<User>().select("id", "name")).forEach(user -> { System.out.println(user); }); }
6.内置分页
写配置类
@Configuration public class MybatisPlusConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { // 开启 count 的 join 优化,只针对 left join !!! return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true)); } } @Test public void testPage() { System.out.println("------ baseMapper 自带分页 ------"); Page<User> page = new Page<>(1, 5); IPage<User> pageResult = mapper.selectPage(page, new QueryWrapper<User>().eq("age", 20)); System.out.println("总条数 ------> " + pageResult.getTotal()); System.out.println("当前页数 ------> " + pageResult.getCurrent()); System.out.println("当前每页显示数 ------> " + pageResult.getSize()); pageResult.getRecords().forEach(System.out :: println); }
7.配置
# 配置mybatis plus mybatis-plus: type-aliases-package: com.lxs.crud.entity #别名搜索 mapper-locations: classpath:/mappers/*.xml #加载映射文件
7.pageHelper分页
引入依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.11</version> </dependency>
配置类
@Configuration @MapperScan("com.lxs.mybatisplus.samples.crud.mapper") public class MybatisPlusConfig { /** * mp分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { // 开启 count 的 join 优化,只针对 left join !!! return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true)); } /** * 两个分页插件都配置,不会冲突 * pagehelper的分页插件 */ @Bean public PageInterceptor pageInterceptor() { return new PageInterceptor(); }
使用方法
PageInfo<User> page = PageHelper.startPage(1, 2).doSelectPageInfo(() -> mapper.selectList(Wrappers.<User>query())); PageHelper.startPage(1,2); // PageInfo<User> page = new PageInfo<>(mapper.selectList(Wrappers.<User>query())); User u = new User(); u.setAge(20); PageInfo<User> page = new PageInfo<User>(mapper.selectUserByPage2(u))
-
【Mybatis】TKMybatis 介绍和使用
2020-05-24 23:19:04一、什么是 TKMybatis TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作。 二、 TKMybatis ...目录
一、什么是 TKMybatis
TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作。
二、TKMybatis 使用
2.1 Springboot 项目中加入依赖
<!--通用mapper起步依赖--> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.4</version> </dependency>
在 POJO 类中加入依赖
<!--每个工程都有Pojo,都需要用到该包对应的注解--> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> <scope>compile</scope> </dependency>
在启动类中配置 @MapperScan 扫描
@SpringBootApplication @MapperScan(basePackages = {"com.tom.order.mapper"}) public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
2.2 使用讲解
2.2.1 实体类中使用
在实体类中,常用的注解和意义为:
@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等暂不描述
2.2.2 dao中使用
单表操作,只需要继承 tk.mybatis 下的 Mapper 接口即可使用
import tk.mybatis.mapper.common.Mapper; @Repository public interface BrandMapper extends Mapper<Brand> { }
查看具体使用:内部都已经封装了基本的单表操作
2.2.3 Service 层中使用
操作 类型 介绍 增加 Mapper.insert(record); 保存一个实体,null的属性也会保存,不会使用数据库默认值 Mapper.insertSelective(record); 保存一个实体,忽略空值,即没提交的值会使用使用数据库默认值 删除 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.selectByPrimaryKey(key) 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号 Mapper.selectCount(record) 根据实体中的属性查询总数,查询条件使用等号 Mapper.selectCountByExample(example) 根据Example条件进行查询总数 Mapper.selectOne(record) 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号。
但是如果存在某个属性为int,则会初始化为0。可能影响到实际使用
2.3 实际案例
2.3.1 dao 层使用
import tk.mybatis.mapper.common.Mapper; /** * DAO 使用通用Mapper * DSO接口需要继承 tk.mybatis.mapper.common.Mapper */ @Repository public interface BrandMapper extends Mapper<Brand> { }
2.3.2 service 层使用
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import tk.mybatis.mapper.entity.Example; import java.util.List; @Service public class BrandServiceImpl implements BrandService { @Autowired private BrandMapper brandMapper; public Example createExample(Brand brand) { // 自定义条件搜索对象 Example Example example = new Example(Brand.class); Example.Criteria criteria = example.createCriteria(); //条件构造器 if (brand != null) { if (!StringUtils.isEmpty(brand.getName())) { criteria.andLike("name", '%' + brand.getName() + '%'); } if (!StringUtils.isEmpty(brand.getLetter())) { criteria.andEqualTo("letter", brand.getLetter()); } } return example; } @Override public List<Brand> findAll() { return brandMapper.selectAll(); } @Override public List<Brand> findList(Brand brand) { Example example = createExample(brand); return brandMapper.selectByExample(example); } @Override public Brand findById(Integer id) { return brandMapper.selectByPrimaryKey(id); } /** * 分页查询 * @param page 当前页 * @param size 每页显示的条数 * @return */ @Override public PageInfo<Brand> pageSearch(Integer page, Integer size) { // 分页实现 // 后面的查询必须是紧跟集合查询 PageHelper.startPage(page, size); // 查询集合 List<Brand> brands = brandMapper.selectAll(); return new PageInfo<Brand>(brands); } @Override public PageInfo<Brand> pageSearchAndCondition(Brand brand, Integer page, Integer size) { // 开始分页 PageHelper.startPage(page, size); // 搜索数据 Example example = createExample(brand); List<Brand> list = brandMapper.selectByExample(example); return new PageInfo<Brand>(list); } /** * 增加品牌 * @param brand */ @Override public void add(Brand brand) { // 使用通用 Mapper.insertSelective // 方法中但凡带有selective就会忽略空值 int i = brandMapper.insertSelective(brand); } /** * 根据id修改品牌 * @param brand */ @Override public void update(Brand brand) { // 使用通用mapper.update(); brandMapper.updateByPrimaryKeySelective(brand); } /** * 根据id删除 * @param id */ @Override public void del(Integer id) { brandMapper.deleteByPrimaryKey(id); } }
三、扩展介绍
https://juejin.im/post/5cbfd158f265da038860b82f
-
TKmybatis和mybatisplus哪个好用
2019-06-10 14:54:32文档连接 :http://baomidou.oschina.io/mybatis-plus-doc/#/?id=%E7%AE%80%E4%BB%8B https://gitee.com/hengboy/mybatis-enhance https://gitee.com/free/Mapper/wikis/1.3-...文档连接 :http://baomidou.oschina.io/mybatis-plus-doc/#/?id=%E7%AE%80%E4%BB%8B
https://gitee.com/hengboy/mybatis-enhance
https://gitee.com/free/Mapper/wikis/1.3-spring-boot?sort_id=208198
https://durcframework.gitee.io/fastmybatis/
注: mybatis-enhance也同样可以跟相同namespace的mapper.xml自动合并
-
Springboot2.0 项目中TKmybatis和Activiti集成的问题
2018-06-07 18:13:42版本信息:springboot 2.0,mybatis 3.4.6 , tkmybatis 2.0 ,activiti 6.0今天在集成项目的时候,发现mybatis和activiti集成时不会报错,但是mapper和activiti集成到一起时启动就会报错,错误信息如下:Parameter 1 ...版本信息:springboot 2.0,mybatis 3.4.6 , tkmybatis 2.0 ,activiti 6.0
今天在集成项目的时候,发现mybatis和activiti集成时不会报错,但是mapper和activiti集成到一起时启动就会报错,错误信息如下:
Parameter 1 of method springProcessEngineConfiguration in org.activiti.spring.boot.JpaProcessEngineAutoConfiguration$JpaConfiguration required a bean of type 'javax.persistence.EntityManagerFactory' that could not be found.
于是查看了一下JpaProcessEngineAutoConfiguration类,部分代码如下:
public class JpaProcessEngineAutoConfiguration { public JpaProcessEngineAutoConfiguration() { } @Configuration @ConditionalOnClass( name = {"javax.persistence.EntityManagerFactory"} ) @EnableConfigurationProperties({ActivitiProperties.class}) public static class JpaConfiguration extends AbstractProcessEngineAutoConfiguration { public JpaConfiguration() { } } }
可以看到EntityManagerFactory是被@ConditionlOnClass所注解的。而EntityManagerFactory是来自于JPA相关的接口。其实这里是Activiti所做的判断,如果项目使用了JPA,那走JPA,如果没有,则走Mybatis。所以只引入Mybatis和Activiti的话项目不会报错,那为什么引入了Mapper就会报错呢?
继续看mapper的源码就能知道原因,其实mapper并没有实现EntityManagerFactory接口,而是自己写了一套,而在Activiti中则认为当前项目使用的是JPA,找不到EntityManagerFactory的实现类。所以报错。解决方法就是在mapper中移除对persistence-api依赖,在activiti中加上jpa的依赖。这样的话,项目启动不会报错,并且能正常使用tkmybatis,省去了公共的增删改查代码。
修改后的pom.xml如下:
<!-- 集成tk-mapper --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>${tk.mapper.version}</version> <exclusions> <exclusion> <artifactId>persistence-api</artifactId> <groupId>javax.persistence</groupId> </exclusion> </exclusions> </dependency> <!-- activiti --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-jpa</artifactId> <version>${activiti.version}</version> </dependency>
其他的配置按照mapper和activiti官网上的来就OK了。
-
Spring Boot 系列分享二[整合tkmybatis和lombok]
2020-04-02 16:19:31Spring Boot 系列分享二[整合tkmybatis和lombok]1. 整合lombok1.1 idea中配置支持lombok1.2 配置主目录下的build.gradle2. 整合tk-mybatis2.1 新建模块并添加依赖2.2 整合通用Mapper接口3. 进行简单的整合测试3.1 ... -
mybatis-generator和TKmybatis的结合使用
2020-06-10 18:00:571 mybatis-generator可以自动...TKmybatis提供一种通用mapper,它不需要针对每个mapper写sql语句,只需继承通用mapper调用相应的接口来完成单表的增删改查。 配置步骤: 1.pom文件中增加代码: <dependency> -
快速上手高效插件:TKMybatis和MybatisPlus、Lomback
2019-10-14 00:32:42一.TKMybatis 1.依赖 <!--mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </depend... -
tkmbatis 日志_SpringBoot使用MyBatis+Tkmybatis+Druid步骤
2020-12-30 14:01:55原标题:SpringBoot使用MyBatis+Tkmybatis+Druid步骤 全部介绍MyBatis+Tkmybatis+Druid:MyBatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和... -
Java框架tk_TKmybatis的框架介绍和原理分析及Mybatis新特性
2021-03-13 20:11:45tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具实现对员工表的增删改查的代码java的dao层... -
mybatis-generator插件和TKmybatis的结合使用
2017-12-08 13:22:50 mybatis-generator可以自动生成mapper和entity文件,mybatis-generator有三种用法:命令行、eclipse插件、maven...TKmybatis提供一种通用mapper,它不需要针对每个mapper写sql语句,只需继承通用mapper调用相应的 -
TKmybatis的框架介绍和原理分析及Mybatis新特性演示
2019-09-29 21:39:35tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源... -
boot druid 长时间不连接 异常_SpringBoot使用MyBatis+Tkmybatis+Druid步骤
2021-01-10 01:00:19SpringBoot使用MyBatis+Tkmybatis+Druid步骤全部介绍MyBatis+Tkmybatis+Druid:MyBatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置... -
SpringBoot+tkMyBatis实现注册登录service和controller
2020-12-05 22:53:49涉及到的工具有DateUtil,MD5Utils,n3r,tkMyBatis Mapper类由MyBatis逆向生成工具生成,实现了通用Mapper接口类,所以在调用相关CRUD方法时要根据tkMyBatis相关规则 Service和Controller编写如下 UserServiceImpl ... -
TKmybatis的框架介绍和原理分析及Mybatis新特性
2018-07-03 10:27:23tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具实现对员工表的增删改查的代码 java的dao层... -
Java框架tk_TKmybatis的框架介绍和原理解析
2021-03-13 20:11:58一、tkmybatistkmybatis 是基于 mybatis 框架开发的一个工具,通过调用它提供的方法实现...1. 引用在 pom.xml 中引入 tk.mybatis 的引用。tk.mybatismapper-spring-boot-starter2.1.52. do 对象@table(name = "t_pl... -
SSM 框架基于ORACLE集成TKMYBATIS 和GENERATOR自动生成代码(Github源码)
2018-10-31 15:07:00基于前一个博客搭建的SSM框架 ... 源码:... 实现基于oracle数据库集成tkmybatis 和 gengerator自动生成代码 先看下完成之后的目录结构 首先pom.xml里面引入相应的包和插件 ... -
springboot引入mybatis和tkMybatis启动报反射异常错误java.lang.RuntimeException: java.lang.reflect....
2019-09-23 18:31:41springboot引入mybatis和tkMybatis启动报反射异常错误。。错误如下: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException Caused by: java.lang.reflect.InvocationTargetException: null ...