Welcome everyone

tk mybatis 使用指北

java 汪明鑫 691浏览 0评论

原生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 使用指北

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz