SpringBoot框架之通用mapper插件(tk.mybatis)


一.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 = "列名")注解聲明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM