SpringBoot集成TkMybatis插件 (二)
一.Tkmybatis的好处
Tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效。这个插件里面封装好了我们需要用到的很多sql语句,不过这个插件是通过我们去调用它封装的各种方法来实现sql语句的效果。对于单表查询不需要写SQL语句,这样就不用像mybatis那样每次写一个接口就要写一条sql语句。这样大大减少了我们的工作量。
拓展:IDEA中使用mybatis-generator自动生成mapper和pojo文件
使用maven命令即可使用:mvn mybatis-generator:generate
二.搭建与使用
1、首先我们添加tk.mybatis的依赖包
- <!--通用Mapper-->
- <dependency>
- <groupId>tk.mybatis</groupId>
- <artifactId>mapper</artifactId>
- <version>3.3.9</version>
- </dependency>
2、然后去添加一个UserInfo实体类
- //注解声明数据库某表明
- @Table(name = "USER")//如果实体类名字与数据库不一致又不使用注解会报错
- public class UserInfo {
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "SELECT LAST_INSERT_ID()")
- @Column(name = "id")// 注解声明该表的字段名
- private Integer id;
- @Column(name = "code")//如果实体类变量与数据库列名不一致又不使用注解会报错
- private String code;
- //添加get,set方法
- }
拓展:SpringBoot的@GeneratedValue的参数设置
默认是可以不加参数的,但是如果数据库控制主键自增(auto_increment), 不加参数就会报错。
@GeneratedValue(strategy=GenerationType.IDENINY)
PS:@GeneratedValue注解的strategy属性提供四种值:
-AUTO主键由程序控制, 是默认选项 ,不设置就是这个
-IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
-SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
3、有两种方式可以扫描文件
(1)新建配置扫描类文件
MyBatisConfig.class:
- package com.lkt.Professional.mapper.mybatis;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.mybatis.spring.SqlSessionFactoryBean;
- import org.springframework.context.annotation.Bean;
- public class MyBatisConfig {
- @Bean(name = "sqlSessionFactory")
- public SqlSessionFactory sqlSessionFactoryBean(){
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- // bean.setDataSource(dataSource());
- bean.setTypeAliasesPackage("com.lkt.Professional.entity");
- try {
- //基于注解扫描Mapper,不需配置xml路径
- //bean.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));
- return bean.getObject();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
- }
MyBatisMapperScannerConfig.class:
- package com.lkt.Professional.mapper.mybatis;
- import java.util.Properties;
- import org.springframework.boot.autoconfigure.AutoConfigureAfter;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import com.lkt.Professional.MyMappers.MyMapper;
- import tk.mybatis.spring.mapper.MapperScannerConfigurer;
- @Configuration
- //必须在MyBatisConfig注册后再加载MapperScannerConfigurer,否则会报错
- @AutoConfigureAfter(MyBatisConfig.class)
- public class MyBatisMapperScannerConfig {
- @Bean
- public MapperScannerConfigurer mapperScannerConfigurer(){
- MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
- mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
- mapperScannerConfigurer.setBasePackage("com.lkt.Professional.mapper.mybatis");
- Properties properties = new Properties();
- properties.setProperty("mappers", MyMapper.class.getName());//MyMapper这个类接下来会创建
- properties.setProperty("notEmpty", "false");
- properties.setProperty("IDENTITY", "MYSQL");
- //特别注意mapperScannerConfigurer的引入import tk.mybatis.spring.mapper.MapperScannerConfigurer;引入错误则没下面这个方法
- mapperScannerConfigurer.setProperties(properties);
- return mapperScannerConfigurer;
- }
- }
(2)在启动类中设置扫描
- package com.java.aney;
- import javax.sql.DataSource;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.mybatis.spring.SqlSessionFactoryBean;
- import tk.mybatis.spring.annotation.MapperScan;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.builder.SpringApplicationBuilder;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.boot.web.servlet.ServletComponentScan;
- import org.springframework.context.annotation.Bean;
- import org.springframework.core.io.DefaultResourceLoader;
- import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
- @SpringBootApplication
- @ServletComponentScan //使用注解注册Servlet
- @MapperScan("com.java.aney.mapper") //通过使用@MapperScan可以指定要扫描的Mapper类的包的路径
- public class Application {
- private static Logger logger = LoggerFactory.getLogger(Application.class);
- protected SpringApplicationBuilder configure(
- SpringApplicationBuilder application) {
- return application.sources(Application.class);
- }
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource")
- public DataSource dataSource() {
- return new org.apache.tomcat.jdbc.pool.DataSource();
- }
- @Bean
- public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
- SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
- sqlSessionFactoryBean.setDataSource(dataSource());
- PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
- sqlSessionFactoryBean.setMapperLocations(resolver
- .getResources("classpath:/mybatis/*.xml"));
- // 加载全局的配置文件
- sqlSessionFactoryBean.setConfigLocation(
- new DefaultResourceLoader().getResource("classpath:mybatis-config.xml"));
- return sqlSessionFactoryBean.getObject();
- }
- public static void main(String[] args) {
- SpringApplication.run(Application.class);
- logger.info("服务成功启动");
- }
- }
4、新建公共父类BaseService
BaseService:(把BaseService文件存放在mapper文件夹的同级目录或者上级目录,如果扫描到了BaseService会出现报错)
- package com.java.aney.service;
- import java.util.List;
- import com.github.pagehelper.PageInfo;
- import com.java.aney.model.QueryExample;
- import tk.mybatis.mapper.entity.Example;
- public interface BaseServices<T, ID> {
- /**
- * 保存一个实体,null的属性不会保存,会使用数据库默认值
- *
- * @param t
- * @return
- */
- Integer add(T t);
- /**
- * 保存一个list实体,null的属性不会保存,会使用数据库默认值
- *
- * @param list
- * @return
- */
- Integer batchAdd(List<T> list);
- /**
- * 根据id删除
- *
- * @param id
- * @return
- */
- Integer deleteById(ID id);
- /**
- * 根据实体属性作为条件进行删除,查询条件使用等号
- *
- * @param t
- * @return
- */
- Integer delete(T t);
- /**
- * 根据主键更新属性不为null的值
- *
- * @param t
- * @return
- */
- Integer updateByPrimaryKey(T t);
- /**
- * 根据主键更新属性不为null的值
- *
- * @param list
- * @return
- */
- Integer batchUpdateByPrimaryKey(List<T> list);
- /**
- * 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
- *
- * @param t
- * @return
- */
- T findOne(T t);
- /**
- * 查询全部结果
- *
- * @return
- */
- List<T> findAll();
- /**
- * 根据主键查询
- *
- * @param id
- * @return
- */
- T findById(ID id);
- /**
- * 根据实体中的属性值进行查询,查询条件使用等号
- *
- * @param t
- * @return
- */
- List<T> find(T t);
- /**
- * 根据Example条件更新实体`record`包含的不是null的属性值
- *
- * @return
- */
- Integer updateByExampleSelective(QueryExample<T> queryExample);
- /**
- * 根据实体中的属性值进行分页查询,查询条件使用等号
- *
- * @param t
- * @param pageNum
- * @param pageSize
- * @return
- */
- PageInfo<T> findPage(T t, Integer pageNum, Integer pageSize);
- List<T> findByExample(Example example);
- /**
- * 根据query条件更新record数据
- *
- * @param record 要更新的数据
- * @param query 查询条件
- * @return
- */
- Integer updateByExampleSelective(T record, Example query);
- /**
- * 根据query条件更新record数据
- *
- * @param record 要更新的数据
- * @param query 查询条件
- * @return
- */
- Integer updateByExampleSelective(T record, T query);
- /**
- * 查询数量
- *
- * @param record
- * @return
- */
- Integer findCount(T record);
- /**
- * 查询数量
- *
- * @param query
- * @return
- */
- Integer findCountByExample(Example query);
- }
5、新建公共封装SQL语句条件类
- package com.java.aney.model;
- public class QueryExample<T> {
- // @ApiModelProperty(value = "将查询到的数据更新成实体非null属性")
- private T record;
- // @ApiModelProperty(value = "example查询条件")
- private Object example;
- public T getRecord() {
- return record;
- }
- public void setRecord(T record) {
- this.record = record;
- }
- public Object getExample() {
- return example;
- }
- public void setExample(Object example) {
- this.example = example;
- }
- }
6、新建BaseServicesImpl实现父类BaseService
- package com.java.aney.service;
- public abstract class BaseServicesImpl<T, ID> implements BaseServices<T, ID> {
- protected final Logger logger = LoggerFactory.getLogger(getClass());
- public abstract Mapper<T> getMapper();
- @Override
- @Transactional(rollbackFor = Exception.class) //事务回滚
- public Integer add(T t) {
- return getMapper().insertSelective(t); //封装单表操作方法
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public Integer deleteById(ID id) {
- return getMapper().deleteByPrimaryKey(id);
- }
- 。。。
- }
拓展:tk.mybatis单表条件拼装SQL
demo见方法如下:
- //分页查询1
- @RequestMapping(value="bootgridpage",produces="application/json;charset=UTF-8")
- @ResponseBody
- public BootgridPageInfoSet fenye(int current,int rowCount,String sort,String nane,String ph ){
- PageHelper.startPage(current,rowCount);//分页
- Example example = new Example(CcompareccicModel.class); //定义对象CcompareccicModel
- String by=Jsonutil.getsortby(sort);//解析字段
- example.setOrderByClause(by); //排序那个字段
- Example.Criteria criteria = example.createCriteria();//拼接SQL条件语句
- if (StringUtil.isNotEmpty(nane)) {
- criteria.andLike("xm", "%" + nane + "%");
- }
- // criteria.andEqualTo("xm", "崔颖");//条件相等
- // criteria.andGreaterThan("xb", "1");//大于
- // criteria.andLessThan("xb", "2");//小于
- // criteria.andIsNotNull("xm");//is not null
- // criteria.andCondition("xzdqh=","110104");//加各种条件都可以 = like <,可以代替全部的
- // List<String> values=new ArrayList<String>();
- // values.add("110104");
- // criteria.andIn("xzdqh", values);//in()
- // criteria.andBetween("csrq", "1956/01/08", "1966/10/21");//时间相隔
- // Example.Criteria criteria2 = example.createCriteria();
- // criteria2.andCondition("xzdqh=","220104");
- // example.or().andCondition("xzdqh=","220104");//or
- // example.or(criteria2);//or
- List<CcompareccicModel> list=service.selectByExample(example);
- new BootgridPageInfoSet<CcompareccicModel>(list);
- return new BootgridPageInfoSet<CcompareccicModel>(list);
- }
7、新建子类UserService继承BaseServicesImpl<AccountUser, Integer>,并重写方法
- @Service("userService")
- public class UserService extends BaseServicesImpl<User, Integer> {
- @Resource
- private UserMapper userMapper;
- @Override
- public Mapper<AccountUser> getMapper() {
- return userMapper;
- }
- public AccountUser queryUserName(String userName) {
- AccountUser user = userMapper.selectUserName(userName);
- return user;
- }
- 。。。
- }
-
8、新建mapper接口继承父接口Mapper<T>
- @Repository
- public interface UserMapper extends Mapper<User> {
- /**
- * 通过用户昵称查询用户信息
- * @param userName
- * @return
- */
- public User selectUserName(String userName);
- }
拓展:Mapper接口的声明如下,可以看到Mapper接口实现了所有常用的方法:
- public interface Mapper<T> extends
- BaseMapper<T>,
- ExampleMapper<T>,
- RowBoundsMapper<T>,
- Marker {
- }
9、新建mapper.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.lkt.Professional.UserMapper">
- <resultMap id="BaseResultMap" type="com.model.User">
- <id column="id" jdbcType="VARCHAR" property="id"/>
- <result column="code" jdbcType="VARCHAR" property="code"/>
- <result column="user_name" jdbcType="INTEGER" property="UserName"/>
- <result column="initime" jdbcType="TIMESTAMP" property="initime"/>
- <association property="userIdMap" column="user_id" foreignColumn="id" notNullColumn="user_name" javaType="map">
- <id column="id" property="id"/>
- <result column="user_name" property="name"/>
- </association>
- </resultMap>
- <select id="getUserDetail" resultMap="BaseResultMap" parameterType="String">
- </select>
- </mapper>
注意:右击application跑起来,如果报出有关mysql或者sql语句的错误
(1)检查application.properties文件数据库配置是否正确;
(2)检查bean(实体类)的类名是否与数据库表名一致,不一致是否添加@Table(name = "表名")注解声明;
(3)检查bean的变量名是否与该表名的列名一致,不一致是否添加@Column(name = "列名")注解声明。
SpringBoot集成TkMybatis插件 (二)的更多相关文章
- SpringBoot集成TkMybatis插件
前提: 基于SpringBoot项目,正常集成Mybatis后,为了简化sql语句的编写,甚至达到无mapper.xml文件. 在本篇总结教程,不在进行SpringBoot集成Mybatis的概述. ...
- 10_SpringBoot集成TkMybatis插件
10_SpringBoot集成TkMybatis插件 明天你好向前奔跑 关注 0.5 2018.09.11 11:15 字数 163 阅读 3794评论 0喜欢 3 @Author Jacky Wa ...
- springboot集成mybatis(二)
上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...
- SpringBoot集成rabbitmq(二)
前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失.除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特 ...
- Springboot集成BeanValidation扩展二:加载jar中的资源文件
一.需求 今天在搭建Springboot框架的时候,又遇到一个需求:在多模块系统中,有些模块想自己管理BeanValidation的资源文件(默认是启动项目claspath下的 ValidationM ...
- SpringBoot集成篇(二) 异步调用Async
什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 如何实现异步调用? 多线程, ...
- springboot集成pagehelper插件
1.在pom.xml中引入依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifact ...
- Spring Boot笔记(五) SpringBoot 集成Lombok 插件
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 为了减少代码量,为当前项目添加 lombok 来优雅编码 Lombok 插件安装: a . 添加依赖: ...
- SpringBoot集成整合pageHelper分页插件
今天来讲讲springboot 集成 pagehelper插件, 引入jar 依赖包 <!-- 分页插件 --><dependency> <groupId>com. ...
随机推荐
- oracle基础——内存管理、优化
内存图解: 自动管理:11g:AMM 10g:ASMM SGA(system global area):由所有服务进程和后台进程共享 PGA(program global area): 由每个服务 ...
- Stanford CS231n实践笔记(课时14卷积神经网络详解 上)
本课我们主要来研究一个"浏览器中的卷积神经网络" 这只是一个展示项目,但是能够帮助直观地看到一些东西 地址:https://cs.stanford.edu/people/karpa ...
- VMware Ubuntu 虚拟机安装 VMwareTools (VMware虚拟机如何与主机互相复制文件)
1.关闭虚拟机 2.CD-ROM开机连接取消对号 3.开启虚拟机 4.此时可能提示安装,点击即可 或者在VMware上方选择 :虚拟机 → 安装VMware Tools 5.虚拟机桌面会弹出相应安装包 ...
- Oracle分析函数简析
oracle的分析函数over(Partition by...) Sql代码 over(Partition by...) 一个超级牛皮的ORACLE特有函数. 最近工作中才接触到这个功能强大而灵活的函 ...
- topcoder srm 693 div1 -3
1.给出一个$n$个顶点的无向带权图.其中顶点$i,i+1$之间存在边,$i,i+2$之间存在边.而且仅有这些边.现在删掉其中的一些边,剩下的边满足图仍然是2联通的情况下使得权值和最小? 思路:其实就 ...
- Docker 使用Dockerfile构建redis镜像
Dockerfile实现: FROM centos: MAINTAINER hongdada "hongdaqi159505@gmail.com" WORKDIR /home RU ...
- 【做题】arc072_f-Dam——维护下凸包
题意:有一个容量为\(L\)的水库,每天晚上可以放任意体积的水.每天早上会有一定温度和体积的水流入水库,且要保证流入水之后水的总体积不能超过\(L\).令体积分别为\(V_1,V_2\),温度分别为\ ...
- UVA 11019 Matrix Matcher(哈希)
题意 给定一个 \(n\times m\) 的矩阵,在给定一个 \(x\times y\) 的小矩阵,求小矩阵在大矩阵中出现的次数. \(1 \leq n,m \leq 1000\) \(1\leq ...
- Python实现机器学习算法:朴素贝叶斯算法
''' 数据集:Mnist 训练集数量:60000 测试集数量:10000 ''' import numpy as np import time def loadData(fileName): ''' ...
- Vue学习四:v-if及v-show指令使用方法
本文为博主原创,未经允许不得转载: <!DOCTYPE html> <html lang="zh"> <head> <meta http- ...