一.Tkmybatis的好处

Tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效。这个插件里面封装好了我们需要用到的很多sql语句,不过这个插件是通过我们去调用它封装的各种方法来实现sql语句的效果。对于单表查询不需要写SQL语句,这样就不用像mybatis那样每次写一个接口就要写一条sql语句。这样大大减少了我们的工作量。

拓展:IDEA中使用mybatis-generator自动生成mapper和pojo文件

使用maven命令即可使用:mvn mybatis-generator:generate

二.搭建与使用

1、首先我们添加tk.mybatis的依赖包

  1.  
    <!--通用Mapper-->
  2.  
    <dependency>
  3.  
    <groupId>tk.mybatis</groupId>
  4.  
    <artifactId>mapper</artifactId>
  5.  
    <version>3.3.9</version>
  6.  
    </dependency>

2、然后去添加一个UserInfo实体类

  1.  
    ​//注解声明数据库某表明
  2.  
    @Table(name = "USER")//如果实体类名字与数据库不一致又不使用注解会报错
  3.  
    public class UserInfo {
  4.  
    @Id
  5.  
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "SELECT LAST_INSERT_ID()")
  6.  
    @Column(name = "id")// 注解声明该表的字段名
  7.  
    private Integer id;
  8.  
    @Column(name = "code")//如果实体类变量与数据库列名不一致又不使用注解会报错
  9.  
    private String code;
  10.  
     
  11.  
    //添加get,set方法
  12.  
    }

拓展:SpringBoot的@GeneratedValue的参数设置

默认是可以不加参数的,但是如果数据库控制主键自增(auto_increment), 不加参数就会报错。

@GeneratedValue(strategy=GenerationType.IDENINY)

PS:@GeneratedValue注解的strategy属性提供四种值:

-AUTO主键由程序控制, 是默认选项 ,不设置就是这个

-IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式

-SEQUENCE 通过数据库的序列产生主键, MYSQL  不支持

3、有两种方式可以扫描文件

(1)新建配置扫描类文件

MyBatisConfig.class:

  1.  
    package com.lkt.Professional.mapper.mybatis;
  2.  
    import org.apache.ibatis.session.SqlSessionFactory;
  3.  
    import org.mybatis.spring.SqlSessionFactoryBean;
  4.  
    import org.springframework.context.annotation.Bean;
  5.  
    public class MyBatisConfig {
  6.  
    @Bean(name = "sqlSessionFactory")
  7.  
    public SqlSessionFactory sqlSessionFactoryBean(){
  8.  
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  9.  
    // bean.setDataSource(dataSource());
  10.  
    bean.setTypeAliasesPackage("com.lkt.Professional.entity");
  11.  
    try {
  12.  
    //基于注解扫描Mapper,不需配置xml路径
  13.  
    //bean.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));
  14.  
    return bean.getObject();
  15.  
    } catch (Exception e) {
  16.  
    // TODO Auto-generated catch block
  17.  
    e.printStackTrace();
  18.  
    throw new RuntimeException(e);
  19.  
    }
  20.  
    }
  21.  
    }

MyBatisMapperScannerConfig.class:

  1.  
    package com.lkt.Professional.mapper.mybatis;
  2.  
    import java.util.Properties;
  3.  
    import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  4.  
    import org.springframework.context.annotation.Bean;
  5.  
    import org.springframework.context.annotation.Configuration;
  6.  
    import com.lkt.Professional.MyMappers.MyMapper;
  7.  
    import tk.mybatis.spring.mapper.MapperScannerConfigurer;
  8.  
    @Configuration
  9.  
    //必须在MyBatisConfig注册后再加载MapperScannerConfigurer,否则会报错
  10.  
    @AutoConfigureAfter(MyBatisConfig.class)
  11.  
    public class MyBatisMapperScannerConfig {
  12.  
    @Bean
  13.  
    public MapperScannerConfigurer mapperScannerConfigurer(){
  14.  
    MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  15.  
    mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
  16.  
    mapperScannerConfigurer.setBasePackage("com.lkt.Professional.mapper.mybatis");
  17.  
    Properties properties = new Properties();
  18.  
    properties.setProperty("mappers", MyMapper.class.getName());//MyMapper这个类接下来会创建
  19.  
    properties.setProperty("notEmpty", "false");
  20.  
    properties.setProperty("IDENTITY", "MYSQL");
  21.  
    //特别注意mapperScannerConfigurer的引入import tk.mybatis.spring.mapper.MapperScannerConfigurer;引入错误则没下面这个方法
  22.  
    mapperScannerConfigurer.setProperties(properties);
  23.  
    return mapperScannerConfigurer;
  24.  
    }
  25.  
    }

(2)在启动类中设置扫描

  1.  
    package com.java.aney;
  2.  
     
  3.  
    import javax.sql.DataSource;
  4.  
     
  5.  
    import org.apache.ibatis.session.SqlSessionFactory;
  6.  
    import org.mybatis.spring.SqlSessionFactoryBean;
  7.  
    import tk.mybatis.spring.annotation.MapperScan;
  8.  
    import org.slf4j.Logger;
  9.  
    import org.slf4j.LoggerFactory;
  10.  
    import org.springframework.boot.SpringApplication;
  11.  
    import org.springframework.boot.autoconfigure.SpringBootApplication;
  12.  
    import org.springframework.boot.builder.SpringApplicationBuilder;
  13.  
    import org.springframework.boot.context.properties.ConfigurationProperties;
  14.  
    import org.springframework.boot.web.servlet.ServletComponentScan;
  15.  
    import org.springframework.context.annotation.Bean;
  16.  
    import org.springframework.core.io.DefaultResourceLoader;
  17.  
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  18.  
     
  19.  
     
  20.  
    @SpringBootApplication
  21.  
    @ServletComponentScan //使用注解注册Servlet
  22.  
    @MapperScan("com.java.aney.mapper") //通过使用@MapperScan可以指定要扫描的Mapper类的包的路径
  23.  
    public class Application {
  24.  
    private static Logger logger = LoggerFactory.getLogger(Application.class);
  25.  
     
  26.  
    protected SpringApplicationBuilder configure(
  27.  
    SpringApplicationBuilder application) {
  28.  
    return application.sources(Application.class);
  29.  
    }
  30.  
     
  31.  
    @Bean
  32.  
    @ConfigurationProperties(prefix = "spring.datasource")
  33.  
    public DataSource dataSource() {
  34.  
    return new org.apache.tomcat.jdbc.pool.DataSource();
  35.  
    }
  36.  
     
  37.  
    @Bean
  38.  
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
  39.  
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  40.  
    sqlSessionFactoryBean.setDataSource(dataSource());
  41.  
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  42.  
    sqlSessionFactoryBean.setMapperLocations(resolver
  43.  
    .getResources("classpath:/mybatis/*.xml"));
  44.  
    // 加载全局的配置文件
  45.  
    sqlSessionFactoryBean.setConfigLocation(
  46.  
    new DefaultResourceLoader().getResource("classpath:mybatis-config.xml"));
  47.  
    return sqlSessionFactoryBean.getObject();
  48.  
    }
  49.  
     
  50.  
    public static void main(String[] args) {
  51.  
    SpringApplication.run(Application.class);
  52.  
    logger.info("服务成功启动");
  53.  
    }
  54.  
    }

4、新建公共父类BaseService

BaseService:(把BaseService文件存放在mapper文件夹的同级目录或者上级目录,如果扫描到了BaseService会出现报错)

  1.  
    package com.java.aney.service;
  2.  
     
  3.  
    import java.util.List;
  4.  
     
  5.  
    import com.github.pagehelper.PageInfo;
  6.  
    import com.java.aney.model.QueryExample;
  7.  
     
  8.  
    import tk.mybatis.mapper.entity.Example;
  9.  
     
  10.  
    public interface BaseServices<T, ID> {
  11.  
     
  12.  
    /**
  13.  
    * 保存一个实体,null的属性不会保存,会使用数据库默认值
  14.  
    *
  15.  
    * @param t
  16.  
    * @return
  17.  
    */
  18.  
    Integer add(T t);
  19.  
     
  20.  
    /**
  21.  
    * 保存一个list实体,null的属性不会保存,会使用数据库默认值
  22.  
    *
  23.  
    * @param list
  24.  
    * @return
  25.  
    */
  26.  
    Integer batchAdd(List<T> list);
  27.  
     
  28.  
    /**
  29.  
    * 根据id删除
  30.  
    *
  31.  
    * @param id
  32.  
    * @return
  33.  
    */
  34.  
    Integer deleteById(ID id);
  35.  
     
  36.  
    /**
  37.  
    * 根据实体属性作为条件进行删除,查询条件使用等号
  38.  
    *
  39.  
    * @param t
  40.  
    * @return
  41.  
    */
  42.  
    Integer delete(T t);
  43.  
     
  44.  
    /**
  45.  
    * 根据主键更新属性不为null的值
  46.  
    *
  47.  
    * @param t
  48.  
    * @return
  49.  
    */
  50.  
    Integer updateByPrimaryKey(T t);
  51.  
     
  52.  
    /**
  53.  
    * 根据主键更新属性不为null的值
  54.  
    *
  55.  
    * @param list
  56.  
    * @return
  57.  
    */
  58.  
    Integer batchUpdateByPrimaryKey(List<T> list);
  59.  
     
  60.  
    /**
  61.  
    * 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
  62.  
    *
  63.  
    * @param t
  64.  
    * @return
  65.  
    */
  66.  
    T findOne(T t);
  67.  
     
  68.  
    /**
  69.  
    * 查询全部结果
  70.  
    *
  71.  
    * @return
  72.  
    */
  73.  
    List<T> findAll();
  74.  
     
  75.  
    /**
  76.  
    * 根据主键查询
  77.  
    *
  78.  
    * @param id
  79.  
    * @return
  80.  
    */
  81.  
    T findById(ID id);
  82.  
     
  83.  
    /**
  84.  
    * 根据实体中的属性值进行查询,查询条件使用等号
  85.  
    *
  86.  
    * @param t
  87.  
    * @return
  88.  
    */
  89.  
    List<T> find(T t);
  90.  
     
  91.  
    /**
  92.  
    * 根据Example条件更新实体`record`包含的不是null的属性值
  93.  
    *
  94.  
    * @return
  95.  
    */
  96.  
    Integer updateByExampleSelective(QueryExample<T> queryExample);
  97.  
     
  98.  
    /**
  99.  
    * 根据实体中的属性值进行分页查询,查询条件使用等号
  100.  
    *
  101.  
    * @param t
  102.  
    * @param pageNum
  103.  
    * @param pageSize
  104.  
    * @return
  105.  
    */
  106.  
    PageInfo<T> findPage(T t, Integer pageNum, Integer pageSize);
  107.  
     
  108.  
    List<T> findByExample(Example example);
  109.  
     
  110.  
    /**
  111.  
    * 根据query条件更新record数据
  112.  
    *
  113.  
    * @param record 要更新的数据
  114.  
    * @param query 查询条件
  115.  
    * @return
  116.  
    */
  117.  
    Integer updateByExampleSelective(T record, Example query);
  118.  
     
  119.  
    /**
  120.  
    * 根据query条件更新record数据
  121.  
    *
  122.  
    * @param record 要更新的数据
  123.  
    * @param query 查询条件
  124.  
    * @return
  125.  
    */
  126.  
    Integer updateByExampleSelective(T record, T query);
  127.  
     
  128.  
    /**
  129.  
    * 查询数量
  130.  
    *
  131.  
    * @param record
  132.  
    * @return
  133.  
    */
  134.  
    Integer findCount(T record);
  135.  
     
  136.  
    /**
  137.  
    * 查询数量
  138.  
    *
  139.  
    * @param query
  140.  
    * @return
  141.  
    */
  142.  
    Integer findCountByExample(Example query);
  143.  
    }

5、新建公共封装SQL语句条件类

  1.  
    package com.java.aney.model;
  2.  
     
  3.  
    public class QueryExample<T> {
  4.  
     
  5.  
    // @ApiModelProperty(value = "将查询到的数据更新成实体非null属性")
  6.  
    private T record;
  7.  
    // @ApiModelProperty(value = "example查询条件")
  8.  
    private Object example;
  9.  
     
  10.  
    public T getRecord() {
  11.  
    return record;
  12.  
    }
  13.  
     
  14.  
    public void setRecord(T record) {
  15.  
    this.record = record;
  16.  
    }
  17.  
     
  18.  
    public Object getExample() {
  19.  
    return example;
  20.  
    }
  21.  
     
  22.  
    public void setExample(Object example) {
  23.  
    this.example = example;
  24.  
    }
  25.  
    }

6、新建BaseServicesImpl实现父类BaseService

  1.  
    ​package com.java.aney.service;
  2.  
     
  3.  
    public abstract class BaseServicesImpl<T, ID> implements BaseServices<T, ID> {
  4.  
     
  5.  
    protected final Logger logger = LoggerFactory.getLogger(getClass());
  6.  
     
  7.  
    public abstract Mapper<T> getMapper();
  8.  
     
  9.  
    @Override
  10.  
    @Transactional(rollbackFor = Exception.class) //事务回滚
  11.  
    public Integer add(T t) {
  12.  
    return getMapper().insertSelective(t); //封装单表操作方法
  13.  
    }
  14.  
     
  15.  
    @Override
  16.  
    @Transactional(rollbackFor = Exception.class)
  17.  
    public Integer deleteById(ID id) {
  18.  
    return getMapper().deleteByPrimaryKey(id);
  19.  
    }
  20.  
    。。。
  21.  
    }

拓展:tk.mybatis单表条件拼装SQL

链接:mybatis Example条件查询

tk mybatis update 各种类型

demo见方法如下:

  1.  
    //分页查询1
  2.  
    @RequestMapping(value="bootgridpage",produces="application/json;charset=UTF-8")
  3.  
    @ResponseBody
  4.  
    public BootgridPageInfoSet fenye(int current,int rowCount,String sort,String nane,String ph ){
  5.  
    PageHelper.startPage(current,rowCount);//分页
  6.  
    Example example = new Example(CcompareccicModel.class); //定义对象CcompareccicModel
  7.  
    String by=Jsonutil.getsortby(sort);//解析字段
  8.  
    example.setOrderByClause(by); //排序那个字段
  9.  
    Example.Criteria criteria = example.createCriteria();//拼接SQL条件语句
  10.  
    if (StringUtil.isNotEmpty(nane)) {
  11.  
    criteria.andLike("xm", "%" + nane + "%");
  12.  
    }
  13.  
    // criteria.andEqualTo("xm", "崔颖");//条件相等
  14.  
    // criteria.andGreaterThan("xb", "1");//大于
  15.  
    // criteria.andLessThan("xb", "2");//小于
  16.  
    // criteria.andIsNotNull("xm");//is not null
  17.  
    // criteria.andCondition("xzdqh=","110104");//加各种条件都可以 = like <,可以代替全部的
  18.  
    // List<String> values=new ArrayList<String>();
  19.  
    // values.add("110104");
  20.  
    // criteria.andIn("xzdqh", values);//in()
  21.  
    // criteria.andBetween("csrq", "1956/01/08", "1966/10/21");//时间相隔
  22.  
    // Example.Criteria criteria2 = example.createCriteria();
  23.  
    // criteria2.andCondition("xzdqh=","220104");
  24.  
    // example.or().andCondition("xzdqh=","220104");//or
  25.  
    // example.or(criteria2);//or
  26.  
    List<CcompareccicModel> list=service.selectByExample(example);
  27.  
    new BootgridPageInfoSet<CcompareccicModel>(list);
  28.  
    return new BootgridPageInfoSet<CcompareccicModel>(list);
  29.  
    }

7、新建子类UserService继承BaseServicesImpl<AccountUser, Integer>,并重写方法

  1.  
    ​@Service("userService")
  2.  
    public class UserService extends BaseServicesImpl<User, Integer> {
  3.  
     
  4.  
    @Resource
  5.  
    private UserMapper userMapper;
  6.  
     
  7.  
    @Override
  8.  
    public Mapper<AccountUser> getMapper() {
  9.  
    return userMapper;
  10.  
    }
  11.  
     
  12.  
    public AccountUser queryUserName(String userName) {
  13.  
    AccountUser user = userMapper.selectUserName(userName);
  14.  
    return user;
  15.  
    }
  16.  
    。。。
  17.  
    }
  18.  

8、新建mapper接口继承父接口Mapper<T>

  1.  
    @Repository
  2.  
    public interface UserMapper extends Mapper<User> {
  3.  
     
  4.  
    /**
  5.  
    * 通过用户昵称查询用户信息
  6.  
    * @param userName
  7.  
    * @return
  8.  
    */
  9.  
    public User selectUserName(String userName);
  10.  
    }

拓展:Mapper接口的声明如下,可以看到Mapper接口实现了所有常用的方法:

  1.  
    public interface Mapper<T> extends
  2.  
    BaseMapper<T>,
  3.  
    ExampleMapper<T>,
  4.  
    RowBoundsMapper<T>,
  5.  
    Marker {
  6.  
     
  7.  
    }

9、新建mapper.xml

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.  
    <mapper namespace="com.lkt.Professional.UserMapper">
  4.  
    <resultMap id="BaseResultMap" type="com.model.User">
  5.  
    <id column="id" jdbcType="VARCHAR" property="id"/>
  6.  
    <result column="code" jdbcType="VARCHAR" property="code"/>
  7.  
    <result column="user_name" jdbcType="INTEGER" property="UserName"/>
  8.  
    <result column="initime" jdbcType="TIMESTAMP" property="initime"/>
  9.  
    <association property="userIdMap" column="user_id" foreignColumn="id" notNullColumn="user_name" javaType="map">
  10.  
    <id column="id" property="id"/>
  11.  
    <result column="user_name" property="name"/>
  12.  
    </association>
  13.  
    </resultMap>
  14.  
     
  15.  
    <select id="getUserDetail" resultMap="BaseResultMap" parameterType="String">
  16.  
     
  17.  
    </select>
  18.  
    </mapper>

注意:右击application跑起来,如果报出有关mysql或者sql语句的错误

(1)检查application.properties文件数据库配置是否正确;

(2)检查bean(实体类)的类名是否与数据库表名一致,不一致是否添加@Table(name = "表名")注解声明;

(3)检查bean的变量名是否与该表名的列名一致,不一致是否添加@Column(name = "列名")注解声明。

SpringBoot集成TkMybatis插件 (二)的更多相关文章

  1. SpringBoot集成TkMybatis插件

    前提: 基于SpringBoot项目,正常集成Mybatis后,为了简化sql语句的编写,甚至达到无mapper.xml文件. 在本篇总结教程,不在进行SpringBoot集成Mybatis的概述. ...

  2. 10_SpringBoot集成TkMybatis插件

    10_SpringBoot集成TkMybatis插件 明天你好向前奔跑 关注  0.5 2018.09.11 11:15 字数 163 阅读 3794评论 0喜欢 3 @Author Jacky Wa ...

  3. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  4. SpringBoot集成rabbitmq(二)

    前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失.除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特 ...

  5. Springboot集成BeanValidation扩展二:加载jar中的资源文件

    一.需求 今天在搭建Springboot框架的时候,又遇到一个需求:在多模块系统中,有些模块想自己管理BeanValidation的资源文件(默认是启动项目claspath下的 ValidationM ...

  6. SpringBoot集成篇(二) 异步调用Async

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 如何实现异步调用? 多线程, ...

  7. springboot集成pagehelper插件

    1.在pom.xml中引入依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifact ...

  8. Spring Boot笔记(五) SpringBoot 集成Lombok 插件

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 为了减少代码量,为当前项目添加 lombok 来优雅编码 Lombok 插件安装: a . 添加依赖: ...

  9. SpringBoot集成整合pageHelper分页插件

    今天来讲讲springboot 集成 pagehelper插件, 引入jar 依赖包 <!-- 分页插件 --><dependency> <groupId>com. ...

随机推荐

  1. 20145325张梓靖 《网络对抗技术》 MSF基础应用

    20145325张梓靖 <网络对抗技术> MSF基础应用 实验内容 掌握metasploit的基本应用方式以及常用的三种攻击方式的思路 主动攻击,即对系统的攻击,不需要被攻击方配合,这里以 ...

  2. Codeforces Round #427 (Div. 2) Problem C Star sky (Codeforces 835C) - 前缀和

    The Cartesian coordinate system is set in the sky. There you can see n stars, the i-th has coordinat ...

  3. python之udp

    import socket s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.bind(('127.0.0.1',8888)) while T ...

  4. java利用poi解析excel文件

    首先需要引入以下jar包 如果使用maven,需要添加两个依赖 <dependencies> <dependency> <groupId>org.apache.po ...

  5. Python3 tkinter基础 Frame event.x 输出鼠标左右键点击的位置

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. Pig项目&Spring Boot&Spring Cloud学习

    1.Spring条件加载原理(@Conditional,@ConditionalOnXXX注解) https://fangjian0423.github.io/2017/05/16/springboo ...

  7. How Flyway works

    The easiest scenario is when you point Flyway to an empty database. It will try to locate its schema ...

  8. 【拼接属性查询方式】MySql某一列属性值为拼接时的查询方式

    数据库中某一列的值为 使用IN查询是无法查询到数据的,只能查询到IN(2)或者IN(2,3)  查询结果: , style_id) 正确方式:使用FIND_IN_SET函数 , style_id) , ...

  9. Deep Reinforcement Learning for Visual Object Tracking in Videos 论文笔记

    Deep Reinforcement Learning for Visual Object Tracking in Videos 论文笔记 arXiv 摘要:本文提出了一种 DRL 算法进行单目标跟踪 ...

  10. Java 大数任意进制转换

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = ...