mybatis 之 tk.mybatis让操作mybatis单表增删改查更容易


mybatis  之 tk.mybatis让操作mybatis单表增删改查更容易

 

官网: https://gitee.com/free/Mapper/wikis/Home

https://mybatis.io/

大家日常mybatis开发的时候,有没有发现好多操作基本都差不多,比如通过id进行select、update、delete等等操作,虽然差不多,但是xml文件和mapper接口中也得写这一堆一模一样的代码。那我们有什么工具可以帮我完成这些重复性的代码工作呢?别着急下面就来给大家一一详解

1.基本步骤

  • 1. 引入TkMybatis的Maven依赖
  • 2. 实体类的相关配置,@Id,@Table
  • 3. Mapper继承tkMabatis的Mapper接口
  • 4. 启动类Application或自定义Mybatis配置类上使用@MapperScan注解扫描Mapper接口
  • 5. 在application.properties配置文件中,配置mapper.xml文件指定的位置[可选]
  • 6. 如有需要,实现mapper.xml自定义sql语句
  • PS :
  • 1. TkMybatis默认使用继承Mapper接口中传入的实体类对象去数据库寻找对应的表,因此如果表名与实体类名不满足对应规则时,会报错,这时使用@Table为实体类指定表。(这种对应规则为驼峰命名规则)
  • 2. 使用TkMybatis可以无xml文件实现数据库操作,只需要继承tkMybatis的Mapper接口即可。
  • 3. 如果有自定义特殊的需求,可以添加mapper.xml进行自定义sql书写,但路径必须与步骤4对应。

2.Java 实体类

考虑到基本数据类型在Java 类中都有默认值,会导致MyBatis 在执行相关操作时很难判断当前字段是否为null,所以在MyBatis 环境下使用Java 实体类时尽量不
要使用基本数据类型,都使用对应的包装类型。

TkMybatis默认使用继承Mapper接口中传入的实体类对象去数据库寻找对应的表,因此如果表名与实体类名不满足对应规则时,会报错,这时使用@Table为实体类指定表。(这种对应规则为驼峰命名规则)
下面以一个实体类Custoemr为例:
// @Table指定该实体类对应的表名,如表名为base_customer,类名为BaseCustomer可以不需要此注解
@Table(name = "t_base_customer")
public class Customer {

    // @Id表示该字段对应数据库表的主键id
    // @GeneratedValue中strategy表示使用数据库自带的主键生成策略.
    // @GeneratedValue中generator配置为"JDBC",在数据插入完毕之后,会自动将主键id填充到实体类中.类似普通mapper.xml中配置的selectKey标签
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY,generator = "JDBC")
    private Long id;

    private String name;

    private String code;

    private String status;

    private Date createDate;

    private Date lastUpdate;
}

 

3、pom文件中加入tk.mybatis依赖

<!--tk.mybatis依赖-->
 <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.3</version>
        </dependency>

 

4、Mapper继承tkMabatis的Mapper接口

import tk.mybatis.mapper.common.Mapper; public interface CustomerMapper extends Mapper<Customer> { }

 

5.启动类Application或自定义Mybatis配置类上使用@MapperScan注解扫描Mapper接口

@MapperScan("cn.base.mapper") public class MiddlewareApplication extends SpringBootServletInitializer { }

 

6.application.properties配置mapper.xml配置文件的扫描路径

mybatis.mapperLocations=classpath*:cn/base/mapper/*.xml

 

7.常用注解

@Table 注解

  • 作用:建立实体类和数据库表之间的对应关系。
  • 默认规则:实体类类名首字母小写作为表名。Employee 类→employee 表。
  • 用法:在@Table 注解的name 属性中指定目标数据库表的表名

@Column 注解

  • 作用:建立实体类字段和数据库表字段之间的对应关系。
  • 默认规则:
  • 实体类字段:驼峰式命名
  • 数据库表字段:使用“_”区分各个单词
  • 用法:在@Column 注解的name 属性中指定目标字段的字段名

@Id 注解

  • 通用Mapper 在执行xxxByPrimaryKey(key)方法时,有两种情况。
  • 情况1:没有使用@Id 注解明确指定主键字段
  • 之所以会生成上面这样的WHERE 子句是因为通用Mapper 将实体类中的所有
  • 字段都拿来放在一起作为联合主键。
  • 情况2:使用@Id 主键明确标记和数据库表中主键字段对应的实体类字段。
SELECT emp_id,emp_name,emp_salary_apple,emp_age FROM tabple_emp WHERE emp_id = ? AND emp_name = ? AND emp_salary_apple = ? AND emp_age = ?

@GeneratedValue 注解

  • 作用:让通用Mapper 在执行insert 操作之后将数据库自动生成的主键值回写到实体类对象中。

@Transient 

  • 用于标记不与数据库表字段对应的实体类字段。
@Transient private String otherThings; //非数据库表中字段

 

8.常用方法

1.selectOne 方法
通用Mapper 替我们自动生成的SQL 语句情况
实体类封装查询条件生成WHERE 子句的规则
使用非空的值生成WHERE 子句
在条件表达式中使用“=”进行比较
要求必须返回一个实体类结果,如果有多个,则会抛出异常

2.xxxByPrimaryKey 方法
需要使用@Id 主键明确标记和数据库表主键字段对应的实体类字段,否则通用
Mapper 会将所有实体类字段作为联合主键。

3.xxxSelective 方法
非主键字段如果为null 值,则不加入到SQL 语句中。

4.QBC 查询
Query By Criteria
Criteria 是Criterion 的复数形式。意思是:规则、标准、准则。在SQL 语句中相当
于查询条件。
QBC 查询是将查询条件通过Java 对象进行模块化封装。

5.  示例代码:

//目标:WHERE (emp_salary>? AND emp_age<?) OR (emp_salary<? AND emp_age>?) //1.创建Example 对象
Example example = new Example(Employee.class); //*********************** //i.设置排序信息
example.orderBy("empSalary").asc().orderBy("empAge").desc(); //ii.设置“去重”
example.setDistinct(true); //iii.设置select 字段
example.selectProperties("empName","empSalary"); //*********************** //2.通过Example 对象创建Criteria 对象
Criteria criteria01 = example.createCriteria(); Criteria criteria02 = example.createCriteria(); //3.在两个Criteria 对象中分别设置查询条件 //property 参数:实体类的属性名 //value 参数:实体类的属性值
criteria01.andGreaterThan("empSalary", 3000) .andLessThan("empAge", 25); criteria02.andLessThan("empSalary", 5000) .andGreaterThan("empAge", 30); //4.使用OR 关键词组装两个Criteria 对象
example.or(criteria02); //5.执行查询
List<Employee> empList = employeeService.getEmpListByExample(example); for (Employee employee : empList) { System.out.println(employee); }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM