当前位置: 澳门新濠3559 > 编程 > 正文

我们只需要创建UserMapper接口,新建一个SpringBoo

时间:2019-10-06 23:42来源:编程
这篇文章介绍一个SpringBoot整合Mybatis-Plus,提供一个小的Demo供大家参考。 Mybatis-Plus是一个 Mybatis 的增强工具 ,在 Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。 本文介

这篇文章介绍一个SpringBoot整合Mybatis-Plus,提供一个小的Demo供大家参考。

Mybatis-Plus是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

本文介绍如何将Maven和Mybatis-Generator配合使用。

之前一篇文章介绍了《SpringBoot Mybatis MySql学习》的整合,这一片扩展一下Mybatis的分页插件-Mybatis-PageHelper。

已经很久没有写文章了,最近家里有点事刚刚处理完,顺便也趁机休息了一段时间。刚回到公司看了一下码云,发现本期码云封面人员就是Mybatis-Plus团队苞米豆的负责人,如下图。

官网文档地址

图片 1image

首先,pom文件中加入pagehelper依赖,完整pom代码如下:

图片 2image

  • 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
  • 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
  • 损耗小启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击
  • 通用CRUD操作内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
  • 支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
  • 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
  • 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
  • 支持自定义全局通用操作我们只需要创建UserMapper接口,新建一个SpringBoot项目。:支持全局通用方法注入( Write once, use anywhere )
  • 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
  • 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
  • 内置性能分析插件可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

Mybatis-Generator是Mybatis提供的一个便捷型插件,自动可以为项目生产对应的实体类,Mapper,dao层。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dalaoyang</groupId> <artifactId>springboot_mybatis_pagehelper</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot_mybatis_pagehelper</name> <description>springboot_mybatis_pagehelper</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

忽然想到,正好之前别人跟我说过怎么不出一个SpringBoot整合Mybatis-Plus的,已经很久的事了,正好想起来,这次就弄一个整合的Demo。

官网文档:

配置文件增加PageHelper的配置,由于demo很简单,只用到了分页,所以没有增加其他配置,只设置了分页方言,完整代码如下:

言归正传,新建一个项目。pom文件中加入Mybatis依赖,完整pom如下:

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.0-gamma</version></dependency>

<!-- 配置SqlSessionFactoryBean Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean --><!-- 配置sqlsessionFactoryBean --><bean > <!-- 数据源 --> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 别名处理 --> <property name="typeAliasesPackage" value="com.luo.beans"></property></bean>

DROP TABLE IF EXISTS `tbl_user`;CREATE TABLE `tbl_user` ( `email` varchar DEFAULT NULL, `age` int DEFAULT NULL, `gender` char DEFAULT NULL, `user_name` varchar DEFAULT NULL, `id` int NOT NULL AUTO_INCREMENT, PRIMARY KEY  ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;INSERT INTO `tbl_user` VALUES ('243518985@qq.com', 24, '1', '罗康元 ', 1);INSERT INTO `tbl_user` VALUES ('1835856@qq.com', 34, '2', '张三', 2);INSERT INTO `tbl_user` VALUES ('323134435@163.com', 53, '1', '李四', 3);INSERT INTO `tbl_user` VALUES ('345464566@qq.com', 43, '1', '王五', 4);INSERT INTO `tbl_user` VALUES ('luokangyuansb@gmail.com', 45, '1', '赵六', 5);

public class User { private Integer id; private String userName; private String email; private Integer gender; private Integer age;}

<dependencies> <!-- mp依赖:mybatisPlus 会自动的维护Mybatis 以及MyBatis-spring相关的依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency> <!--junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- mysql --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.10.RELEASE</version> </dependency></dependencies>

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration></configuration>

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" > <param name="Encoding" value="UTF-8" /> <layout > <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root></log4j:configuration>

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkongjdbc.username=rootjdbc.password=jiamei@20141107.

<!-- 数据源 --><context:property-placeholder location="classpath:db.properties" /><bean > <property name="driverClass" value="${jdbc.driver}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property></bean><!--事务管理器 --><bean > <property name="dataSource" ref="dataSource"></property></bean><!--基于注解的事务管理 --><tx:annotation-driven transaction-manager="dataSourceTransactionManager" /><!-- 配置SqlSessionFactoryBean Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean --><!-- 配置sqlsessionFactoryBean --><bean > <!-- 数据源 --> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 别名处理 --> <property name="typeAliasesPackage" value="com.luo.beans"></property></bean><!-- 配置mybatis扫描的mapper接口路径--><bean > <property name="basePackage" value="com.luo.mapper"></property></bean>

本文使用SpringBoot结合Mybatis-Generator插件使用,数据库Mysql。

##端口号server.port=8888##日志级别logging.level.com.dalaoyang.dao.UserMapper=debug##数据库urlspring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false##数据库用户名spring.datasource.username=root##数据库密码spring.datasource.password=root##数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver#pagehelper分页插件配置pagehelper.helperDialect=mysql
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dalaoyang</groupId> <artifactId>springboot_mybatisplus</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot_mybatisplus</name> <description>springboot_mybatisplus</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

假设我们有一张user表,我们需要对这个表进行增删改查操作,如果说没有代码生成的话,在mybatis我们需要编写UserMapper接口,手写CRUD方法,在UserMapper.xml文件中写对应的sql语句,但是,在MybatisPlus中,我们只需要创建UserMapper接口,继承BaseMapper接口,就可以完成CRUD操作,甚至不需要创建SQl映射文件。

新建一个SpringBoot项目。

实体类User代码如下:

配置文件配置数据库配置和对应Mybatis-Plus实体信息,配置如下:

public interface UserMapper extends BaseMapper<User>{}

依赖文件

在项目pom文件中,引入Mybatis-Generator插件,并且引入Mybatis和Mysql依赖。完整pom代码如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dalaoyang</groupId> <artifactId>springboot_generator</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot_generator</name> <description>springboot_generator</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.15.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <executions> <execution> <id>mybatis-generator</id> <phase>deploy</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!-- Mybatis-Generator 工具配置文件的位置 --> <configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build></project>
package com.dalaoyang.entity;import org.apache.ibatis.type.Alias;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.entity * @email 397600342@qq.com * @date 2018/6/22 */@Aliaspublic class User { private int id; private String user_name; private String user_password; public User(String user_name, String user_password) { this.user_name = user_name; this.user_password = user_password; } public User(int id, String user_name, String user_password) { this.id = id; this.user_name = user_name; this.user_password = user_password; } public int getId() { return id; } public void setId { this.id = id; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public String getUser_password() { return user_password; } public void setUser_password(String user_password) { this.user_password = user_password; }}
##端口号server.port=8888##数据库urlspring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false##数据库用户名spring.datasource.username=root##数据库密码spring.datasource.password=root##数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver##日志级别logging.level.com.dalaoyang.dao.UserMapper=debug##mybatis-plus mapper xml 文件地址mybatis-plus.mapper-locations=classpath*:mapper/*Mapper.xml##mybatis-plus type-aliases 文件地址mybatis-plus.type-aliases-package=com.dalaoyang.entity

然后,我们就写一些基本的单元测试方法,测试我们的CRUD,来到我们的测试类中,如下:

配置Mybatis-Generator配置

在pom文件中配置的Mybatis-Generator 工具配置文件的位置新建一个generatorConfig.xml,(本文案例配置的位置是src/main/resources/mybatis-generator/generatorConfig.xml),配置文件代码如下,具体配置需要自行修改至自己的项目:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!-- 配置生成器 --><generatorConfiguration> <!--执行generator插件生成文件的命令: call mvn mybatis-generator:generate -e --> <!-- 引入配置文件 --> <properties resource="application.properties"/> <!--classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置 可选 --> <!--<classPathEntry location="D:generator_mybatismysql-connector-java-5.1.24-bin.jar" /> --> <!-- 一个数据库一个context --> <!--defaultModelType="flat" 大数据字段,不分表 --> <context targetRuntime="MyBatis3Simple" defaultModelType="flat"> <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表; 一般保留默认值,遇到数据库关键字,使用columnOverride覆盖 --> <property name="autoDelimitKeywords" value="true" /> <!-- 生成的Java文件的编码 --> <property name="javaFileEncoding" value="utf-8" /> <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; --> <property name="beginningDelimiter" value="`" /> <property name="endingDelimiter" value="`" /> <!-- 格式化java代码 --> <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <!-- 格式化XML代码 --> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <plugin type="org.mybatis.generator.plugins.SerializablePlugin" /> <plugin type="org.mybatis.generator.plugins.ToStringPlugin" /> <!-- 注释 --> <commentGenerator > <property name="suppressAllComments" value="false"/><!-- 是否取消注释 --> <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳--> </commentGenerator> <!-- jdbc连接 --> <jdbcConnection driverClass="${spring.datasource.driver-class-name}" connectionURL="${spring.datasource.url}" userId="${spring.datasource.username}" password="${spring.datasource.password}" /> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成实体类地址 --> <javaModelGenerator targetPackage="com.dalaoyang.entity" targetProject="${mybatis.project}" > <property name="enableSubPackages" value="false"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成mapxml文件 --> <sqlMapGenerator targetPackage="mapper" targetProject="${mybatis.resources}" > <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 生成mapxml对应client,也就是接口dao --> <javaClientGenerator targetPackage="com.dalaoyang.dao" targetProject="${mybatis.project}" type="XMLMAPPER" > <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 --> <table tableName="user" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <property name="useActualColumnNames" value="false" /> <!-- 数据库表主键 --> <generatedKey column="id" sqlStatement="Mysql" identity="true" /> </table> <table tableName="book" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <property name="useActualColumnNames" value="false" /> <!-- 数据库表主键 --> <generatedKey column="id" sqlStatement="Mysql" identity="true" /> </table> </context></generatorConfiguration>

启动类代码如下:

实体类User代码如下:

public class TestMp { private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); private UserMapper userMapper = ioc.getBean("userMapper",UserMapper.class);}

配置application.properties

配置项目的application.properties,其中数据库信息,Mapper地址之前都有过介绍,具体SpringBoot-Mybatis配置可以参考:《SpringBoot Mybatis MySql学习》

本文配置如下:

## mapper xml 文件地址mybatis.mapper-locations=classpath*:mapper/*Mapper.xml##数据库urlspring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false##数据库用户名spring.datasource.username=root##数据库密码spring.datasource.password=123456##数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver#Mybatis Generator configuration#dao类和实体类的位置mybatis.project =src/main/java#mapper文件的位置mybatis.resources=src/main/resources

到这里其实配置就完成了,可以体验Mybatis-Generator插件的优点了,在右侧Maven处点击如图所示位置,如图:

图片 3image

点击完成后,可以看到Mapper,dao,实体类都已经创建好了,如图:

图片 4image

创建完成会给我生成几个默认的建当方法,如UserMapper代码如下:

package com.dalaoyang.dao;import com.dalaoyang.entity.User;import org.apache.ibatis.annotations.Mapper;import java.util.List;public interface UserMapper { /** * This method was generated by MyBatis Generator. * This method corresponds to the database table user * * @mbggenerated */ int deleteByPrimaryKey; /** * This method was generated by MyBatis Generator. * This method corresponds to the database table user * * @mbggenerated */ int insert(User record); /** * This method was generated by MyBatis Generator. * This method corresponds to the database table user * * @mbggenerated */ User selectByPrimaryKey; /** * This method was generated by MyBatis Generator. * This method corresponds to the database table user * * @mbggenerated */ List<User> selectAll(); /** * This method was generated by MyBatis Generator. * This method corresponds to the database table user * * @mbggenerated */ int updateByPrimaryKey(User record);}

UserMapper.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.dalaoyang.dao.UserMapper" > <resultMap type="com.dalaoyang.entity.User" > <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> <id column="id" property="id" jdbcType="BIGINT" /> <result column="user_name" property="userName" jdbcType="VARCHAR" /> <result column="user_password" property="userPassword" jdbcType="VARCHAR" /> </resultMap> <delete parameterType="java.lang.Long" > <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> delete from user where id = #{id,jdbcType=BIGINT} </delete> <insert parameterType="com.dalaoyang.entity.User" > <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" > SELECT LAST_INSERT_ID() </selectKey> insert into user (user_name, user_password) values (#{userName,jdbcType=VARCHAR}, #{userPassword,jdbcType=VARCHAR}) </insert> <update parameterType="com.dalaoyang.entity.User" > <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> update user set user_name = #{userName,jdbcType=VARCHAR}, user_password = #{userPassword,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT} </update> <select resultMap="BaseResultMap" parameterType="java.lang.Long" > <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> select id, user_name, user_password from user where id = #{id,jdbcType=BIGINT} </select> <select resultMap="BaseResultMap" > <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> select id, user_name, user_password from user </select></mapper>
package com.dalaoyang;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SpringbootMybatisPagehelperApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisPagehelperApplication.class, args); }}
package com.dalaoyang.entity;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.entity * @email yangyang@dalaoyang.cn * @date 2018/7/20 */public class User { private int id; private String user_name; private String user_password; public User() { } public User(String user_name, String user_password) { this.user_name = user_name; this.user_password = user_password; } public User(int id, String user_name, String user_password) { this.id = id; this.user_name = user_name; this.user_password = user_password; } public int getId() { return id; } public void setId { this.id = id; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public String getUser_password() { return user_password; } public void setUser_password(String user_password) { this.user_password = user_password; }}

说明:在测试类中我们将使用从SpringIOC容器中获取的userMapper进行CRUD一系列操作

新增测试方法

在UserMapper上加入注解@Mapper表明是持久化映射层,启动类上加入注解@RestController进行测试,这里简单调用一个查询所有的方法selectAll,启动类代码如下:

@SpringBootApplication@RestControllerpublic class SpringbootGeneratorApplication { @Autowired private UserMapper userMapper; @GetMapping("/findAll") public List<User> findAll(){ return userMapper.selectAll(); } public static void main(String[] args) { SpringApplication.run(SpringbootGeneratorApplication.class, args); }}

新建一个UserMapper,之前介绍的整合mybatis是使用的mapper方式,本文选择使用注解方式,代码如下:

下面要说的都是需要注意的地方,新增一个MybatisPlus配置类,其中没有做过多的设置,只是设置了一下方言,代码如下:

保存一条数据userMapper.insert;

运行测试

运行项目,浏览器访问localhost:8080/findAll如图所示:

图片 5image

源码下载 :大老杨码云

package com.dalaoyang.dao;import com.dalaoyang.entity.User;import com.github.pagehelper.Page;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Select;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.dao * @email 397600342@qq.com * @date 2018/6/22 */@Mapperpublic interface UserMapper { @Select("SELECT * FROM USER") Page<User> getUserList();}
package com.dalaoyang.config;import com.baomidou.mybatisplus.plugins.PaginationInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.config * @email yangyang@dalaoyang.cn * @date 2018/7/20 */@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ PaginationInterceptor page = new PaginationInterceptor(); //设置方言类型 page.setDialectType; return page; }}
@Testpublic void insert(){ User user = new User(); user.setUserName("luokangyuan"); user.setAge; user.setEmail("2356775645@qq.com"); user.setGender; Integer result = userMapper.insert; System.out.println; // 直接获取插入数据返回的自增主键值 System.out.println(user.getId() "======");}

还是一如既往的使用controller作为测试,代码如下:

UserMapper继承了MybatisPlus的BaseMapper,这里面列举一个普通的查询方法getUserList,完整代码如下:

插入数据的方法有两个:insert和insertAllColumn,二者的执行结果是一样的,区别在于,前者会根据实体类的每一个属性值进行一个非空校验,在插入的sql语句中不会出现实体类属性为空的字段;

package com.dalaoyang.controller;import com.dalaoyang.dao.UserMapper;import com.dalaoyang.entity.User;import com.github.pagehelper.Page;import com.github.pagehelper.PageHelper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.controller * @email 397600342@qq.com * @date 2018/6/22 */@RestControllerpublic class UserController { @Autowired UserMapper userMapper; //http://localhost:8888/getUserList?pageNum=1&pageSize=2 @RequestMapping("/getUserList") public Page<User> getUserList(Integer pageNum, Integer pageSize){ PageHelper.startPage(pageNum, pageSize); Page<User> userList= userMapper.getUserList(); return userList; }}
package com.dalaoyang.dao;import com.baomidou.mybatisplus.mapper.BaseMapper;import com.dalaoyang.entity.User;import org.apache.ibatis.annotations.Mapper;import java.util.List;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.dao * @email yangyang@dalaoyang.cn * @date 2018/7/20 */@Mapperpublic interface UserMapper extends BaseMapper<User> { List<User> getUserList();}

注意:在没有使用全局配置之前,我们需要指定实体类对应的数据库表和主键生成策略

到这里项目就完全创建完成了。

新建一个UserMapper.xml,里面写getUserList对应sql,代码如下:

  • 主键生成策略:@TableId(type = IdType.AUTO,value = "id"),value属性值当实体类字段名和数据库一致时可以不写,这里的value指的是数据库字段名称,type的类型有以下几种:
    • IdType.AUTO:数据库ID自增
    • IdType.INPUT:用户输入ID
    • IdType.ID_WORKER:全局唯一ID,内容为空自动填充
    • IdType.UUID:全局唯一ID,内容为空自动填充
  • 实体对应表名注解:@TableName(value = "tbl_user");指定当前实体类对应的数据库表
  • 数据库字段映射名称:@TableField(value = "user_name"),当禁止驼峰映射规则后可以使用
  • 忽略插入到表的字段:@ableField(exist = false),如下,数据库没有money这个字段,如果不忽略,那么插入就会报错,找不到这个字段;

浏览器访问

<?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.dalaoyang.dao.UserMapper"> <resultMap type="com.dalaoyang.entity.User"/> <parameterMap type="com.dalaoyang.entity.User"/> <select resultMap="user"> SELECT * FROM USER </select></mapper>

图片 6image

最后和往常一样,新建一个Controller进行测试,完整代码如下:

@TableField(exist = false)private Double money;

然后查看控制台如下:

package com.dalaoyang.controller;import com.baomidou.mybatisplus.mapper.EntityWrapper;import com.baomidou.mybatisplus.plugins.Page;import com.dalaoyang.dao.UserMapper;import com.dalaoyang.entity.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.List;import java.util.Map;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.controller * @email yangyang@dalaoyang.cn * @date 2018/7/20 */@RestControllerpublic class UserController { @Autowired private UserMapper userDao; //http://localhost:8888/getUserList @GetMapping("getUserList") public List<User> getUserList(){ return userDao.getUserList(); } //http://localhost:8888/getUserListByName?userName=xiaoli //条件查询 @GetMapping("getUserListByName") public List<User> getUserListByName(String userName) { Map map = new HashMap(); map.put("user_name", userName); return userDao.selectByMap; } //http://localhost:8888/saveUser?userName=xiaoli&userPassword=111 //保存用户 @GetMapping("saveUser") public String saveUser(String userName,String userPassword) { User user = new User(userName,userPassword); Integer index = userDao.insert; if(index>0){ return "新增用户成功。"; }else{ return "新增用户失败。"; } } //http://localhost:8888/updateUser?id=5&userName=xiaoli&userPassword=111 //修改用户 @GetMapping("updateUser") public String updateUser(Integer id,String userName,String userPassword) { User user = new User(id,userName,userPassword); Integer index = userDao.updateById; if(index>0){ return "修改用户成功,影响行数" index "行。"; }else{ return "修改用户失败,影响行数" index "行。"; } } //http://localhost:8888/getUserById?userId=1 //根据Id查询User @GetMapping("getUserById") public User getUserById(Integer userId) { return userDao.selectById; } //http://localhost:8888/getUserListByPage?pageNumber=1&pageSize=2 //条件分页查询 @GetMapping("getUserListByPage") public List<User> getUserListByPage(Integer pageNumber,Integer pageSize) { Page<User> page =new Page<>(pageNumber,pageSize); EntityWrapper<User> entityWrapper = new EntityWrapper<>(); entityWrapper.eq("user_name", "xiaoli"); return userDao.selectPage(page,entityWrapper); }}

更新一条数据

图片 7image

这里对上面代码稍作解释,其中包含了如下几个方法:1.getUserList :这是普通的Mybatis查询的方法,没有用到Mybatis-Plus,这里不做过多解释。2.getUserListByName:条件查询,根据名称查询用户列表,这里使用到了selectByMap方法,参数需要传一个Map,里面对应写好需要查询的字段名与对应查询值。3.saveUser :保存用户,这里使用的是insert方法,需要传一个实体对象,返回Integer值作为影响行数。4.updateUser :修改用户,这里使用的是updateByIdt方法,需要传一个实体对象,返回Integer值作为影响行数。5.getUserById :根据Id查询实体对象,需要传用户Id。6.getUserListByPage :条件分页查询,使用的是selectPage方法,方法需要一个分页对象Page和一个条件对象EntityWrapper。Page放入页码和每页数量,EntityWrapper使用eq方法放入对应字段名和对应查询值。

@Testpublic void update(){ User user = new User(); user.setId; user.setUserName; user.setAge; //user.setEmail("2356775645@qq.com"); user.setGender; Integer result = userMapper.updateById;}

可以看到sql已经进行分页了。

这里只是举例说明几个方法,其中方法还有很多,更多Mybatis-Plus使用请查看官方文档:

同理:更新方法也有两个updateById和updateAllColumnById,前者会对实体类属性名进行非空校验,为空的就不会出现在sql语句中,也就是不会更新原有数据,后者是会更新所有列,如果实体类属性值为空,则数据库对应字段名更新为null;

然后回头看controller的方法,返回的Page对象中包含了很多关于分页的参数等数据,下面是Page的代码,具体使用可以查看一下:

源码下载 :大老杨码云

查询一条数据

//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.github.pagehelper;import java.io.Closeable;import java.util.ArrayList;import java.util.List;public class Page<E> extends ArrayList<E> implements Closeable { private static final long serialVersionUID = 1L; private int pageNum; private int pageSize; private int startRow; private int endRow; private long total; private int pages; private boolean count; private Boolean reasonable; private Boolean pageSizeZero; private String countColumn; private String orderBy; private boolean orderByOnly; public Page() { this.count = true; } public Page(int pageNum, int pageSize) { this(pageNum, pageSize, true, null); } public Page(int pageNum, int pageSize, boolean count) { this(pageNum, pageSize, count, null); } private Page(int pageNum, int pageSize, boolean count, Boolean reasonable) { super; this.count = true; if (pageNum == 1 && pageSize == 2147483647) { this.pageSizeZero = true; pageSize = 0; } this.pageNum = pageNum; this.pageSize = pageSize; this.count = count; this.calculateStartAndEndRow(); this.setReasonable(reasonable); } public Page(int[] rowBounds, boolean count) { super; this.count = true; if (rowBounds[0] == 0 && rowBounds[1] == 2147483647) { this.pageSizeZero = true; this.pageSize = 0; } else { this.pageSize = rowBounds[1]; this.pageNum = rowBounds[1] != 0 ? Math.ceilrowBounds[0]   rowBounds[1]) / rowBounds[1]) : 0; } this.startRow = rowBounds[0]; this.count = count; this.endRow = this.startRow   rowBounds[1]; } public List<E> getResult() { return this; } public int getPages() { return this.pages; } public Page<E> setPages(int pages) { this.pages = pages; return this; } public int getEndRow() { return this.endRow; } public Page<E> setEndRow(int endRow) { this.endRow = endRow; return this; } public int getPageNum() { return this.pageNum; } public Page<E> setPageNum(int pageNum) { this.pageNum = this.reasonable != null && this.reasonable && pageNum <= 0 ? 1 : pageNum; return this; } public int getPageSize() { return this.pageSize; } public Page<E> setPageSize(int pageSize) { this.pageSize = pageSize; return this; } public int getStartRow() { return this.startRow; } public Page<E> setStartRow(int startRow) { this.startRow = startRow; return this; } public long getTotal() { return this.total; } public void setTotal(long total) { this.total = total; if (total == -1L) { this.pages = 1; } else { if (this.pageSize > 0) { this.pages = (total / this.pageSize   (total % this.pageSize == 0L ? 0 : 1)); } else { this.pages = 0; } if (this.reasonable != null && this.reasonable && this.pageNum > this.pages) { this.pageNum = this.pages; this.calculateStartAndEndRow(); } } } public Boolean getReasonable() { return this.reasonable; } public Page<E> setReasonable(Boolean reasonable) { if (reasonable == null) { return this; } else { this.reasonable = reasonable; if (this.reasonable && this.pageNum <= 0) { this.pageNum = 1; this.calculateStartAndEndRow(); } return this; } } public Boolean getPageSizeZero() { return this.pageSizeZero; } public Page<E> setPageSizeZero(Boolean pageSizeZero) { if (pageSizeZero != null) { this.pageSizeZero = pageSizeZero; } return this; } public String getOrderBy() { return this.orderBy; } public <E> Page<E> setOrderBy(String orderBy) { this.orderBy = orderBy; return this; } public boolean isOrderByOnly() { return this.orderByOnly; } public void setOrderByOnly(boolean orderByOnly) { this.orderByOnly = orderByOnly; } private void calculateStartAndEndRow() { this.startRow = this.pageNum > 0 ? (this.pageNum - 1) * this.pageSize : 0; this.endRow = this.startRow   this.pageSize * (this.pageNum > 0 ? 1 : 0); } public boolean isCount() { return this.count; } public Page<E> setCount(boolean count) { this.count = count; return this; } public Page<E> pageNum(int pageNum) { this.pageNum = this.reasonable != null && this.reasonable && pageNum <= 0 ? 1 : pageNum; return this; } public Page<E> pageSize(int pageSize) { this.pageSize = pageSize; this.calculateStartAndEndRow(); return this; } public Page<E> count(Boolean count) { this.count = count; return this; } public Page<E> reasonable(Boolean reasonable) { this.setReasonable(reasonable); return this; } public Page<E> pageSizeZero(Boolean pageSizeZero) { this.setPageSizeZero(pageSizeZero); return this; } public Page<E> countColumn(String columnName) { this.countColumn = columnName; return this; } public PageInfo<E> toPageInfo() { PageInfo<E> pageInfo = new PageInfo; return pageInfo; } public PageSerializable<E> toPageSerializable() { PageSerializable<E> serializable = new PageSerializable; return serializable; } public <E> Page<E> doSelectPage(ISelect select) { select.doSelect(); return this; } public <E> PageInfo<E> doSelectPageInfo(ISelect select) { select.doSelect(); return this.toPageInfo(); } public <E> PageSerializable<E> doSelectPageSerializable(ISelect select) { select.doSelect(); return this.toPageSerializable(); } public long doCount(ISelect select) { this.pageSizeZero = true; this.pageSize = 0; select.doSelect(); return this.total; } public String getCountColumn() { return this.countColumn; } public void setCountColumn(String countColumn) { this.countColumn = countColumn; } public String toString() { return "Page{count="   this.count   ", pageNum="   this.pageNum   ", pageSize="   this.pageSize   ", startRow="   this.startRow   ", endRow="   this.endRow   ", total="   this.total   ", pages="   this.pages   ", reasonable="   this.reasonable   ", pageSizeZero="   this.pageSizeZero   '}'   super.toString(); } public void close() { PageHelper.clearPage(); }}
@Testpublic void select(){ // 1.通过ID查询一条数据 User user = userMapper.selectById; // 2.通过多个列进行查询,如果查处的数据有多条就会报错 User u = new User(); u.setId; u.setUserName; User user1 = userMapper.selectOne; // 3.查询符合多个ID的数据,使用的是in关键字查询 List<Integer> ids = new ArrayList<Integer>(); ids.add; ids.add; ids.add; List<User> users = userMapper.selectBatchIds; // 4.通过封装map条件,注意的是封装的是列字段名,不是实体里属性名, // map中的key充当sql中的条件名称 Map<String,Object> maps = new HashMap<String, Object>(); maps.put("user_name","张三"); maps.put("age",347); List<User> users1 = userMapper.selectByMap; // 5.分页查询方法,查看第二页,每页2条数据,在sql语句并没有limit关键字 // 所以要实现物理分页,还需借助插件,例如mybatis的pageHepler或者MybatisPlus提供的分页插件 List<User> users2 = userMapper.selectPage(new Page<User>, null);}

关于更多Mybatis-PageHelper配置及介绍可以查看下面网站:

删除一条数据

源码下载 :大老杨码云

@Testpublic void delete(){ // 1.根据ID删除 Integer integer = userMapper.deleteById; // 2.根据条件删除,map中的key为列名,千万注意 Map<String ,Object> maps = new HashMap<String, Object>(); maps.put; maps.put("gender",2); Integer integer1 = userMapper.deleteByMap; // 3.根据ID批量删除,使用in关键字 List<Integer> ids = new ArrayList<Integer>(); ids.add; ids.add; Integer integer2 = userMapper.deleteBatchIds;}

在前面的CRUD操作中,我们会使用直接注解指定主键生成策略和表名到实体类的映射,但是配置的仅仅会对当前实体类起作用,所以,引入了全局配置,如下:

<!-- 定义MybatisPlus的全局策略配置--><bean id ="globalConfiguration" > <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name="dbColumnUnderline" value="true"></property> <!-- 全局的主键策略 --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property></bean>

然后,将MybatisPlus全局配置注入到sqlSessionFactoryBean中

<!-- 注入全局MP策略配置 --><property name="globalConfig" ref="globalConfiguration"></property>

在前面,我们实现了基本的CRUD操作,操作简单,仅仅只需继承一个BaseMapper就可以完成,实现单一,批量,分页等等一系列操作,很大的减少了开发负担,但这仅仅是Mybatisplus的冰山一角,当我们需要多条件查询的时候,就会使用到MybatisPlus中强大的条件构造器EntityWrapper;

条件构造器就是EntityWrapper,就是一个封装查询条件对象,让开发者自由的定义查询条件,主要用于sql的拼接,排序或者实体参数等;条件构造器

注意:使用的参数是数据库字段名称,不是Java类属性名

@Testpublic void entityWrapperTedst(){ // 分页查询第一页,每页2条记录,年龄在41-53之间,genger为1,user_name为王五的用户 List<User> users = userMapper.selectPage(new Page<User>, new EntityWrapper<User>() .between("age", 41, 53) .eq("gender",1) .eq("user_name","王五") );}

@Testpublic void selectListTest(){ List<User> users = userMapper.selectList(new EntityWrapper<User>() .eq("gender", 1) .like("user_name", "三") .orNew() .like("email", "5") );}

使用或条件查询可以使用or()也可以使用orNew(),二者的区别在于sql中的条件部分不一样,如下:

使用or()的sql语句

SELECT id AS id,user_name AS userName,email,gender,age FROM tbl_user WHERE (gender = ? AND user_name LIKE ? OR email LIKE ?)

使用orNew()的sql语句

SELECT id AS id,user_name AS userName,email,gender,age FROM tbl_user WHERE (gender = ? AND user_name LIKE ?) OR (email LIKE ?)

@Testpublic void updataByEntityWrapper(){ User user = new User(); user.setEmail("luokangyuan@sina,com"); user.setAge; user.setUserName; Integer update = userMapper.update(user, new EntityWrapper<User>() .eq("user_name","李四") .eq );}

@Testpublic void deleteByEntityWrapper(){ userMapper.delete(new EntityWrapper<User>() .eq("user_name","王八") .eq );}

Condition继承了Wrapper类,另外,我们不需要再new一个Condition对象,直接调用condition类的静态方法create就可以得到一个condition对象,然后使用wrapper的所有方法,简单使用如下:

@Testpublic void testCondition(){ userMapper.selectPage(new Page<User>, Condition.create() .between("age",45,56) );}

Active Record,简称AR,是一种领域模型模式,特点就是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一条记录;

开启AR模式的方法很简单,就是让我们的实体类继承Model类,并实现其抽象方法,指定主键即可,如下

public class User extends Model<User> { @Override protected Serializable pkVal() { return id; }}

@Testpublic void insert(){ User user = new User(); user.setUserName; user.setAge; user.setEmail("shancnu@163.com"); user.setGender; boolean rs = user.insert();}

@Testpublic void update(){ User user = new User(); user.setUserName; user.setAge; user.setId; boolean rs = user.updateById();}

说明:和通用的CRUD中的更新方法一样,updateAllColumnById()会更新所有列

@Testpublic void select(){ User user = new User(); user.setId; // 根据ID查询一条数据 User user1 = user.selectById(); // 查询所有的数据 List<User> users = user.selectAll(); // 根据条件查询 List<User> usersList = user.selectList(new EntityWrapper<User>() .like("user_name", "三")); // 统计满足条件的数据数量 int gender = user.selectCount(new EntityWrapper<User>().eq("gender", 1)); // 统计全表数量 int count = user.selectCount;}

@Testpublic void delete(){ User user = new User(); user.setId; boolean rs = user.deleteById(); System.out.print;}

当然,也可以根据条件删除多条数据,这里需要注意的是:当删除不存在的数据时候,返回的结果也是true;

// 删除不存在逻辑属于成功public static boolean delBool(Integer result) { return null != result && result >= 0;}

在前面的CRUD中的分页查询返回的是list数据集合,但是在AR中返回的却是Page对象,如下

@Testpublic void selectPage(){ User user = new User(); Page<User> userPage = user.selectPage(new Page<User>, new EntityWrapper<User>().like("user_name", "三")); List<User> records = userPage.getRecords();}

AR提供的是一种更为快速的实现CRUD操作,本质很是调用Mybatis对应的方法,说的简单一点就是语法糖;

糖虽然好吃,但是,不要管不住嘴;

我们知道mybatis有一个代码生成器MBG,可以生成Java实体类mapper接口和映射文件,但是MybatisPlus却更加强大,可以生成service和controller,可以配置实体类是否支持AR等,代码生成器

说明:建议数据库表名和字段名采用驼峰命名方式,和实体来一致,可以避免在对应实体类产生的性能损耗

<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version></dependency>

说明:MybatisPlus默认使用的是velocity模版引

@Testpublic void testMbg(){ // 1.全局配置 GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setActiveRecord// 是否开启AR模式 .setAuthor("luokangyuan") // 指定作者 .setOutputDir("/Users/luokangyuan/Documents/project/mybatisdemo/src/main/java") .setFileOverride // 指定文件覆盖 .setIdType(IdType.AUTO) // 设置主键自增策略 .setServiceImplName("%sService") // 设置生成的services接口的名字的首字母是否为I .setBaseResultMap // 基本的字段映射 .setBaseColumnList; // 基本的sql片段 // 2.配置数据源 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setDbType(DbType.MYSQL) // 设置数据库类型 .setDriverName("com.mysql.jdbc.Driver") .setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong") .setUsername .setPassword("jiamei@20141107."); // 3.策略配置 StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setCapitalMode //全局大写命名 .setDbColumnUnderline // 指定表名和字段名是否使用了下划线 .setNaming(NamingStrategy.underline_to_camel) // 数据库字段下划线转驼峰命令策略 .setTablePrefix // 设置表前缀 .setInclude("tbl_dept","tbl_file"); // 设置需要生成的表 // 4.包名策略配置 PackageConfig packageConfig = new PackageConfig(); packageConfig.setParent("com.luo") // 设置父包 .setMapper .setService("service") .setController("controller") .setEntity .setXml; // 5. 开始生成代码 AutoGenerator autoGenerator = new AutoGenerator(); autoGenerator.setGlobalConfig(globalConfig) .setDataSource(dataSourceConfig) .setStrategy(strategyConfig) .setPackageInfo(packageConfig); autoGenerator.execute();}

@Servicepublic class DeptService extends ServiceImpl<DeptMapper, Dept> implements IDeptService {}

DeptService继承了ServiceImpl,在ServiceImpl中就已经注入了DeptMapper,所以,我们就不需要再次注入,在ServiceImpl中也帮我们提供了常用的CRUD方法,我们可以直接使用,

@Controller@RequestMappingpublic class DeptController { @Autowired private IDeptService service; public String select(){ service.selectList; return null; }}

<bean > <!-- 数据源 --> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 别名处理 --> <property name="typeAliasesPackage" value="com.luo.beans"></property> <!-- 注入全局MP策略配置 --> <property name="globalConfig" ref="globalConfiguration"></property> <property name="plugins"> <list> <bean ></bean> </list> </property></bean>

真正的分页查询

ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");private UserMapper userMapper = ioc.getBean("userMapper",UserMapper.class);@Testpublic void testPage(){ Page<User> page = new Page<User>; List<User> users = userMapper.selectPage(page,null); page.setRecords; System.out.print("总记录数" page.getTotal; System.out.print("当前页码" page.getCurrent; System.out.print("总页码" page.getPages; System.out.print("每页记录数" page.getSize; System.out.print("是否有前一页" page.hasPrevious; System.out.print("是否有后一页" page.hasNext;}

说明:我们可以将分页查询的数据放在page对象中,返回前端一个page对象即可

<bean > <property name="stopProceed" value="true"></property></bean>

测试如下:

@Testpublic void testDeltetAll(){ userMapper.delete;}

sql分析插件只支持mysql5.6.3以上的版本,本质就是通过sql分析命令Explain分析当前的sql语句,根据结果集中的Extra列来断定当前是否全表操作;

性能分析插件用于输出每秒sql语句和其执行时间,首先注册插件,如下:

<bean > <property name="format" value="true"></property></bean>

测试如下:

@Testpublic void testPer(){ Dept dept = new Dept(); dept.setDeptName; dept.setDeptCount; dept.setDeptBegintime(new Date; dept.insert();}

结果如下:

 Time:142 ms - ID:com.luo.mapper.DeptMapper.insert Execute SQL: INSERT INTO tbl_dept ( dept_count, dept_name, dept_beginTime ) VALUES ( '34', '开发部', '2018-08-26 23:09:17.293' )]

当我们在开发中,有时需要判断,当我们更新一条数据库记录时,希望这条记录没有被别人更新,这个时候就可以使用乐观锁插件,他的原理就是,取出记录时,获取当前的version,更新的时候带上这个version,执行更新的时候set version = yourVersion 1 where version = yourVersion,如果version不对,则更新失败,注意的是:@version用于注解实体字段,必须要有

首先,注册插件

<bean ></bean>

实体类添加对应属性,同时数据库表也要添加对应字段

@Versionprivate Integer version;

测试如下:

@Testpublic void testVersion(){ Dept dept = new Dept(); dept.setDeptName; dept.setVersion; dept.setId; dept.updateById();}

如果:这个时候将数据库version改为2,在执行更新就会显示更新记录数为0;

自定义全局操作,就是将我们需要的sql在项目启动的时候就注入到全局中,操作步骤如下:

  • 在Mapper接口中定义我们需要注入的方法;
  • 扩展AutoSqlInjector中的inject方法,实现Mapper中我们自定义方法要注入的sql;
  • 最后,在全局配置中,配置我们自定义的注入器即可;

第一步:mapper中定义方法

public interface UserMapper extends BaseMapper<User> { int deleteAll();}

第二步:重写inject方法

public class MySqlInjector extends AutoSqlInjector { @Override public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass, Class<?> modelClass, TableInfo table) { // 构造sql语句 String sql = "delete from "   table.getTableName(); // 构造方法名 String method = "deleteAll"; // 构造SqlSource对象 SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); // 构造一个删除的MapperStatement this.addDeleteMappedStatement(mapperClass,method,sqlSource); }}ß

第三步:注入自定义配置

<bean id ="globalConfiguration" > <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name="dbColumnUnderline" value="true"></property> <!-- 全局的主键策略 --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> <!--注入自定义全局操作--> <property name="sqlInjector" ref="mySqlInjector"></property></bean><bean ></bean>

测试

ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");private UserMapper userMapper = ioc.getBean("userMapper",UserMapper.class);@Testpublic void testInject(){ int rs = userMapper.deleteAll();}

所谓逻辑删除,就是不真正的删除数据的记录,而是变为无效状态,在MybatisPlus中,给我们提供logicSqlInjector

第一步:数据库添加逻辑字段

第二步:实体类添加对应属性和注解

@TableLogicprivate Integer logicFlag;

第三步:MybatisPlus全局配置中加入logicSqlInjector

<bean id ="globalConfiguration" > <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name="dbColumnUnderline" value="true"></property> <!-- 全局的主键策略 --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> <!--注入自定义全局操作--> <property ref="logicSqlInjector" name="sqlInjector"></property> <!--注入逻辑删除全局值--> <property name="logicDeleteValue" value="-1"></property> <property name="logicNotDeleteValue" value="1"></property></bean><!--逻辑删除--><bean ></bean>

测试

@Testpublic void testLogin(){ Integer integer = userMapper.deleteById;}

说明:我们做的是删除操作,但是,执行的却是update操作,同时,查询的时候自动添加了有效判断

这里涉及到一个元数据处理接口MetaObjectHandler,元对象是Mybatis提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性赋值的一个对象,本质上metaObject获取对象的值或者是给对象的属性赋值,都是通过反射获取到属性对应方法的Invoker;

第一步:注解需要填充的字段

@TableField(value = "user_name",fill = FieldFill.INSERT_UPDATE)private String userName;

第二步:自定义填充处理器

public class MetaHandler extends MetaObjectHandler { /** * 插入操作:自动填充 * @param metaObject */ public void insertFill(MetaObject metaObject) { // 获取到需要被填充的字段值 Object userName = getFieldValByName("userName", metaObject); if(userName == null){ setFieldValByName("userName","四川码酱",metaObject); } } /** * 更新操作:自动填充 * @param metaObject */ public void updateFill(MetaObject metaObject) { // 获取到需要被填充的字段值 Object userName = getFieldValByName("userName", metaObject); if(userName == null){ setFieldValByName("userName","康哥哥",metaObject); } }}

第三步:注入全局配置

<bean id ="globalConfiguration" > <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name="dbColumnUnderline" value="true"></property> <!-- 全局的主键策略 --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> <!--注入自定义全局操作--> <!--<property name="sqlInjector" ref="mySqlInjector"></property>--> <property ref="logicSqlInjector" name="sqlInjector"></property> <!--注入逻辑删除全局值--> <property name="logicDeleteValue" value="-1"></property> <property name="logicNotDeleteValue" value="1"></property> <!--注入公共字段填充处理器--> <property name="metaObjectHandler" ref="metaHandler"></property></bean><!--自定义公共字段填充处理器--><bean ></bean>

第四步:测试

@Testpublic void testCom(){ User user = new User(); user.setId; user.setLogicFlag; user.updateById();}

打开IDEA设置--Plugins--Browse repositories --搜索mybatisx,安装即可

根据mapper接口方法自动生成xml文件,接口方法定位xml,xml自动定位mapper接口;

编辑:编程 本文来源:我们只需要创建UserMapper接口,新建一个SpringBoo

关键词: 澳门新濠3559