原生JDBC -> Spring的JDBC模版 -> Hibernate -> Mybatis -> Mybatis Plus -> tk Mybatis
tk Mybatis好在哪里,更灵活,更方便,减少重复性代码,基本SQL都已支持
tk Mybatis在有些地方有点像Hibernate,内置好的SQL
帮你更加傻瓜式的写代码,助你远离SQL
tk mybatis 使用概述:
1. 引入TkMybatis的Maven依赖
2. 实体类的相关配置,@Id,@Table
3. Mapper继承tkMabatis的Mapper接口
4. 启动类Application或自定义Mybatis配置类上使用@MapperScan注解扫描Mapper接口
5. 在application.properties配置文件中,配置mapper.xml文件指定的位置[可选]
6. 使用TkMybatis提供的sql执行方法
下面我们直接来搞一波Spring Boot 整合 tk mybatis
创建一个Spring Boot项目
引入依赖
<!--tk mybatis依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
定义一个实体类
package pers.wmx.tkmybatis;
import lombok.Data;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author wmx
* @date 2019-12-06
*/
@Data
@Table(name = "person")
public class Person {
@Id
private Integer id;
private String name;
private Integer age;
}
@Table(name = "person")
和 @Id
必要的注解
写一个mapper接口
package pers.wmx.tkmybatis;
import tk.mybatis.mapper.common.Mapper;
/**
* @author wmx
* @date 2019-12-06
*/
public interface PersonMapper extends Mapper<Person> {
}
package pers.wmx.tkmybatis;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import tk.mybatis.spring.annotation.MapperScan;
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = TkMybatisApplication.class)
@MapperScan("pers.wmx.tkmybatis")
class TkMybatisApplicationTests {
@Autowired
PersonMapper personMapper;
@Test
void testInsert(){
Person person = new Person();
person.setName("xxxxinye");
person.setAge(22);
personMapper.insertSelective(person);
}
}
写一个测试类感受下
跑单测,数据插入成功
再测试下更新:
@Test
void testUpdate(){
Person person = new Person();
person.setAge(100);
Example example = new Example(Person.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("name", "a");
personMapper.updateByExampleSelective(person,example);
}
Example
和 Criteria
是神器
可以拼接sql执行的条件
criteria.andEqualTo("name", "a");
意思就是更新 name 是 a 的数据
@Test
void testSelect(){
Example example = new Example(Person.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("name", "a");
criteria.orEqualTo("name","b");
criteria.orEqualTo("name","c");
List<Person> people = personMapper.selectByExample(example);
System.out.println(people);
}
当然除了使用tk mybatis的内置sql,或者使用Example
和 Criteria
也可以自己来写sql,就像使用原生sql一样
tk mybatis的神奇远远不止于此!
彩蛋:
最后加上一个mybatis的更新的骚操作,和tk mybatis无关
/**
* @param updatePerson 需更新到数据库的person
* @param conditionPerson 更新条件
* @return int
*/
@UpdateProvider(type = PersonProvider.class,method = "updateByCondition")
int updateByCondition(@Param("up") Person updatePerson,@Param("cp") Person conditionPerson);
type = PersonProvider.class
需要一个更新支持类,写动态sql
package pers.wmx.springbootfreemarkerdemo.dao;
import org.apache.ibatis.annotations.Param;
import pers.wmx.springbootfreemarkerdemo.entity.Person;
/**
* 动态SQL
*
* @author wmx
* @date 2019-12-06
*/
public class PersonProvider {
public String updateByCondition(@Param("up") Person updatePerson, @Param("cp") Person conditionPerson) throws Exception {
// update sql 语句
String SQL = " update person set ";
StringBuilder sqlBuilder = new StringBuilder(SQL);
if(conditionPerson.getId() == null){
throw new Exception("sql参数异常,缺少更新条件");
}
if(updatePerson.getAge() != null){
sqlBuilder.append(" age = #{up.age}, ");
}
if(updatePerson.getName() != null){
sqlBuilder.append(" name = #{up.name}, ");
}
//update 条件
sqlBuilder.deleteCharAt(sqlBuilder.lastIndexOf(","));
sqlBuilder.append(" where id = #{cp.id} ");
//如果有更多的条件可以继续append
sqlBuilder.append(" ; ");
return sqlBuilder.toString();
}
}
@Test
public void testUpdateByCondition() {
Person personUpdate = new Person();
personUpdate.setName("新名字");
personUpdate.setAge(999);
Person personCondition = new Person();
personCondition.setId(5);
int rst = personMapper.updateByCondition(personUpdate,personCondition);
Assert.assertEquals(rst,1);
}
更新成功
真正写代码好像也不会这么写,哈哈=-=
转载请注明:汪明鑫的个人博客 » tk mybatis 使用指北
说点什么
您将是第一位评论人!