开篇:
一.创建spring boot
1.1,idea创建,点击new project,然后一路next下去
1.2,设置maven自动导入,setting文件添加阿里云镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
1.3,添加pom依赖,让工程跑起来
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在添加build
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
同时添加mybatis整合springboot依赖,跟mysql依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
1.3,将自动生成代码文件放入resource资源文件下,文件名为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>
<!--mysql 连接数据库jar 这里选择自己本地位置的jar包-->
<classPathEntrylocation="D:\maven\repository\mysql\mysql-connector-java\5.1.35\mysql-connector-java-5.1.35.jar"/>
<context id="testTables"targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<propertyname="suppressAllComments"value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnectiondriverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"userId="root"
password="123">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals"value="false"/>
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGeneratortargetPackage="com.example.mapper.pojo"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<propertyname="trimStrings"value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
如果maven工程只是单独的一个工程,targetProject="src/main/java"
若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
targetProject="ecps-manager-mapper",下同-->
<sqlMapGeneratortargetPackage="com.example.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGeneratortype="XMLMAPPER"
targetPackage="com.example.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
</javaClientGenerator>
<!-- 指定数据库表 -->
<tableschema=""tableName="userinfo"></table>
<!--<table schema="" tableName="success_killed"></table>-->
</context>
</generatorConfiguration>
二.创建数据库
2.1 建表语句如下:
CREATE TABLE `user` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2,修改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>
<!--mysql 连接数据库jar 这里选择自己本地位置的jar包-->
<classPathEntrylocation="D:\maven\repository\mysql\mysql-connector-java\5.1.35\mysql-connector-java-5.1.35.jar"/>
<context id="testTables"targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<propertyname="suppressAllComments"value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnectiondriverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"userId="root"
password="123">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals"value="false"/>
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGeneratortargetPackage="com.example.demo.mapper.pojo"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<propertyname="trimStrings"value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
如果maven工程只是单独的一个工程,targetProject="src/main/java"
若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
targetProject="ecps-manager-mapper",下同-->
<sqlMapGeneratortargetPackage="com.example.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGeneratortype="XMLMAPPER"
targetPackage="com.example.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
</javaClientGenerator>
<!-- 指定数据库表 -->
<tableschema=""tableName="user"></table>
<!--<table schema="" tableName="success_killed"></table>-->
</context>
</generatorConfiguration>
2.3,添加application.properties的数据源
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2.4.点击maven里的生成按钮,生成mapper等文件
2.5.生成后的目录如下,并且工程启动没有错误
2.6 DemoApplication启动类上添加注解
@MapperScan(basePackages= {"com.demo.mapper"})
@ComponentScan(basePackages= {"com.demo"})
三.实现增删改以及分页查询
3.1 service层的接口以及实现类
public interfaceUserService {
List<User> getAll();
}
@Service
public class UserServiceImplimplementsUserService {
@Autowired
UserMapperuserMapper;
@Override
publicList<User>getAll() {
UserExample userExample = new UserExample();
userExample.setDistinct(true);
return userMapper.selectByExample(userExample);
}
}
3.2 controller如下,启动浏览器或者postman可测试返回数据
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
UserServiceuserServiceImpl;
/**
* 查询
* @return
*/
@RequestMapping(value="/demo",method= RequestMethod.GET)
@ResponseBody
publicObjectgetUsers(){
returnuserServiceImpl.getAll();
}
}
3.3 利用RowBounds进行分页查询
一,usermapper与usermapper.xml添加如下代码
List<User>selectByExampleWithBounds(UserExample example,RowBounds rowBounds);
<select id="selectByExampleWithBounds"resultMap="BaseResultMap"parameterType="com.demo.pojo.UserExample">
select
<iftest="distinct">
distinct
</if>
<include refid="Base_Column_List"/>
from user
<iftest="_parameter != null">
<include refid="Example_Where_Clause"/>
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
二,userservice与userserviceimpl分别添加如下代码
List<User>getPage(intpageSize,intpageNo);
@Override
public List<User>getPage(intpageSize,intpageNo) {
RowBounds rowBounds = newRowBounds(pageNo,pageSize);
UserExample userExample =newUserExample();
userExample.setDistinct(true);
return userMapper.selectByExampleWithBounds(userExample,rowBounds);
}
二.Usercontroller添加如下代码
/**
* 利用mybatis的rowbounds分页类,分页查询
*/
@RequestMapping(value="/page",method= RequestMethod.GET)
@ResponseBody
public ObjectgetPage(@RequestParam(name="pageSize") String pageSize,
@RequestParam(name="pageNo") String pageNo){
try{
String size = pageSize;
int pageSizes=5,nos=1;
if(StringUtils.isNotBlank(size)){
pageSizes = Integer.parseInt(pageSize);
}
String no = pageNo;
if(StringUtils.isNotBlank(no)){
nos = Integer.parseInt(no);
}
returnuserServiceImpl.getPage(pageSizes,nos);
}catch(Exception ex){
ex.getMessage();
}
return null;
}
三.请求路径上添加pagesize跟pageno这连个参数,可正常返回分页
四.整合日志
4.1 pom.xml添加依赖如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
4.2 resource资源目录下添加logback.xml文件如下
<?xml version="1.0"encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<propertyname="LOG_HOME"value="/workspace/example"/>
<!-- 控制台输出 -->
<appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appendername="DAYINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestSpringBoot_info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<!--这里设置日志级别为info-->
<filterclass="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 -->
<appendername="DAYERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestSpringBoot_error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<!--这里设置日志级别为info-->
<filterclass="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<rootlevel="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="DAYINFO"/>
<appender-ref ref="DAYERROR"/>
</root>
</configuration>
4.3.启动项目,访问分页查询接口,可看到如下日子生成文件
五.整合定时任务
5.1 DemoApplication添加注解
@EnableScheduling
5.2 添加定时启动类
@Component
public class Task {
Logger logger= LoggerFactory.getLogger(Task.class);
@Autowired
UserServiceuserServiceImpl;
@Scheduled(cron="0/5 * * * * ?")
public voidtest(){
//加入fastJson依赖
/*<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>*/
List<User> users =userServiceImpl.getAll();
String str = JSONObject.toJSONString(users);
logger.info(str);
}
}
六.整合druid连接池
6.1pom.xml文件添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
6.2,application.properties的配置文件如下:
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM t_user
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#spring.datasource.druid.useGlobalDataSourceStat=true
#mybatis.mapperLocations=classpath:mybatis/*.xml
七.所有源码如下
Task类
package com.demo.job;
import com.alibaba.fastjson.JSONObject;
import com.demo.pojo.User;
import com.demo.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class Task {
Logger logger= LoggerFactory.getLogger(Task.class);
@Autowired
UserServiceuserServiceImpl;
@Scheduled(cron="0 30 * * * ?")
public voidtest(){
//加入fastJson依赖
/*<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>*/
List<User> users =userServiceImpl.getAll();
String str = JSONObject.toJSONString(users);
logger.info(str);
}
}
UserMapper
package com.demo.mapper;
import com.demo.pojo.User;
import com.demo.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
intcountByExample(UserExample example);
int deleteByExample(UserExample example);
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
List<User>selectByExample(UserExample example);
List<User>selectByExampleWithBounds(UserExample example,RowBounds rowBounds);
UserselectByPrimaryKey(Integer id);
int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);
int updateByExample(@Param("record") User record, @Param("example") UserExample example);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
UserMapper.xml
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.UserMapper">
<resultMap id="BaseResultMap"type="com.demo.pojo.User">
<id column="id"property="id"jdbcType="INTEGER"/>
<result column="username"property="username"jdbcType="VARCHAR"/>
<result column="password"property="password"jdbcType="VARCHAR"/>
</resultMap>
<sql id="Example_Where_Clause">
<where >
<foreach collection="oredCriteria"item="criteria"separator="or">
<if test="criteria.valid">
<trim prefix="("suffix=")"prefixOverrides="and">
<foreach collection="criteria.criteria"item="criterion">
<choose >
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreachcollection="criterion.value"item="listItem"open="("close=")"separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Update_By_Example_Where_Clause">
<where >
<foreach collection="example.oredCriteria"item="criteria"separator="or">
<if test="criteria.valid">
<trim prefix="("suffix=")"prefixOverrides="and">
<foreach collection="criteria.criteria"item="criterion">
<choose >
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreachcollection="criterion.value"item="listItem"open="("close=")"separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Base_Column_List">
id, username, password
</sql>
<select id="selectByExample"resultMap="BaseResultMap"parameterType="com.demo.pojo.UserExample">
select
<iftest="distinct">
distinct
</if>
<include refid="Base_Column_List"/>
from user
<iftest="_parameter != null">
<include refid="Example_Where_Clause"/>
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
<select id="selectByExampleWithBounds"resultMap="BaseResultMap"parameterType="com.demo.pojo.UserExample">
select
<iftest="distinct">
distinct
</if>
<include refid="Base_Column_List"/>
from user
<iftest="_parameter != null">
<include refid="Example_Where_Clause"/>
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
<select id="selectByPrimaryKey"resultMap="BaseResultMap"parameterType="java.lang.Integer">
select
<includerefid="Base_Column_List"/>
from user
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey"parameterType="java.lang.Integer">
delete from user
where id = #{id,jdbcType=INTEGER}
</delete>
<delete id="deleteByExample"parameterType="com.demo.pojo.UserExample">
delete from user
<iftest="_parameter != null">
<include refid="Example_Where_Clause"/>
</if>
</delete>
<insert id="insert"parameterType="com.demo.pojo.User">
insert into user (id, username, password
)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
)
</insert>
<insert id="insertSelective"parameterType="com.demo.pojo.User">
insert into user
<trimprefix="("suffix=")"suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="username != null">
username,
</if>
<if test="password != null">
password,
</if>
</trim>
<trim prefix="values ("suffix=")"suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="username != null">
#{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
#{password,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="countByExample"parameterType="com.demo.pojo.UserExample"resultType="java.lang.Integer">
selectcount(*) from user
<iftest="_parameter != null">
<include refid="Example_Where_Clause"/>
</if>
</select>
<update id="updateByExampleSelective"parameterType="map">
update user
<set >
<if test="record.id != null">
id = #{record.id,jdbcType=INTEGER},
</if>
<if test="record.username != null">
username = #{record.username,jdbcType=VARCHAR},
</if>
<if test="record.password != null">
password = #{record.password,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause"/>
</if>
</update>
<update id="updateByExample"parameterType="map">
update user
set id = #{record.id,jdbcType=INTEGER},
username = #{record.username,jdbcType=VARCHAR},
password = #{record.password,jdbcType=VARCHAR}
<iftest="_parameter != null">
<include refid="Update_By_Example_Where_Clause"/>
</if>
</update>
<update id="updateByPrimaryKeySelective"parameterType="com.demo.pojo.User">
update user
<set >
<if test="username != null">
username = #{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
password = #{password,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey"parameterType="com.demo.pojo.User">
update user
set username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
User
package com.demo.pojo;
public class User {
privateIntegerid;
private Stringusername;
private Stringpassword;
public IntegergetId() {
returnid;
}
public voidsetId(Integer id) {
this.id= id;
}
publicStringgetUsername() {
returnusername;
}
public voidsetUsername(String username) {
this.username= username ==null?null: username.trim();
}
publicStringgetPassword() {
returnpassword;
}
public voidsetPassword(String password) {
this.password= password ==null?null: password.trim();
}
}
UserExample
package com.demo.pojo;
import java.util.ArrayList;
import java.util.List;
public class UserExample {
protectedStringorderByClause;
protected boolean distinct;
protected List<Criteria>oredCriteria;
public UserExample() {
oredCriteria=newArrayList<Criteria>();
}
public voidsetOrderByClause(String orderByClause) {
this.orderByClause= orderByClause;
}
publicStringgetOrderByClause() {
returnorderByClause;
}
public voidsetDistinct(booleandistinct) {
this.distinct= distinct;
}
public booleanisDistinct() {
returndistinct;
}
publicList<Criteria>getOredCriteria() {
returnoredCriteria;
}
public voidor(Criteria criteria) {
oredCriteria.add(criteria);
}
publicCriteriaor() {
Criteria criteria = createCriteriaInternal();
oredCriteria.add(criteria);
return criteria;
}
publicCriteriacreateCriteria() {
Criteria criteria = createCriteriaInternal();
if (oredCriteria.size() ==0) {
oredCriteria.add(criteria);
}
returncriteria;
}
protectedCriteriacreateCriteriaInternal() {
Criteria criteria = newCriteria();
return criteria;
}
public voidclear() {
oredCriteria.clear();
orderByClause=null;
distinct=false;
}
protected abstract static classGeneratedCriteria {
protectedList<Criterion>criteria;
protected GeneratedCriteria() {
super();
criteria=newArrayList<Criterion>();
}
public booleanisValid() {
returncriteria.size() >0;
}
publicList<Criterion>getAllCriteria() {
returncriteria;
}
publicList<Criterion>getCriteria() {
returncriteria;
}
protected voidaddCriterion(String condition) {
if(condition ==null) {
throw newRuntimeException("Value for condition cannot be null");
}
criteria.add(newCriterion(condition));
}
protected voidaddCriterion(String condition,Object value,String property) {
if(value ==null) {
throw newRuntimeException("Value for "+ property + " cannot be null");
}
criteria.add(newCriterion(condition,value));
}
protected voidaddCriterion(String condition,Object value1,Object value2,String property) {
if(value1 ==null|| value2 ==null) {
throw newRuntimeException("Between values for "+ property + " cannot be null");
}
criteria.add(newCriterion(condition,value1,value2));
}
publicCriteriaandIdIsNull() {
addCriterion("id is null");
return (Criteria)this;
}
publicCriteriaandIdIsNotNull() {
addCriterion("id is not null");
return (Criteria)this;
}
publicCriteriaandIdEqualTo(Integer value) {
addCriterion("id =",value,"id");
return (Criteria)this;
}
publicCriteriaandIdNotEqualTo(Integer value) {
addCriterion("id <>",value,"id");
return (Criteria)this;
}
publicCriteriaandIdGreaterThan(Integer value) {
addCriterion("id >",value,"id");
return (Criteria)this;
}
publicCriteriaandIdGreaterThanOrEqualTo(Integer value) {
addCriterion("id >=",value,"id");
return (Criteria)this;
}
publicCriteriaandIdLessThan(Integer value) {
addCriterion("id <",value,"id");
return (Criteria)this;
}
publicCriteriaandIdLessThanOrEqualTo(Integer value) {
addCriterion("id <=",value,"id");
return (Criteria)this;
}
publicCriteriaandIdIn(List<Integer> values) {
addCriterion("id in",values,"id");
return (Criteria)this;
}
publicCriteriaandIdNotIn(List<Integer> values) {
addCriterion("id not in",values,"id");
return (Criteria)this;
}
publicCriteriaandIdBetween(Integer value1,Integer value2) {
addCriterion("id between",value1,value2,"id");
return (Criteria)this;
}
publicCriteriaandIdNotBetween(Integer value1,Integer value2) {
addCriterion("id not between",value1,value2,"id");
return (Criteria)this;
}
publicCriteriaandUsernameIsNull() {
addCriterion("username is null");
return (Criteria)this;
}
publicCriteriaandUsernameIsNotNull() {
addCriterion("username is not null");
return (Criteria)this;
}
publicCriteriaandUsernameEqualTo(String value) {
addCriterion("username =",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameNotEqualTo(String value) {
addCriterion("username <>",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameGreaterThan(String value) {
addCriterion("username >",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameGreaterThanOrEqualTo(String value) {
addCriterion("username >=",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameLessThan(String value) {
addCriterion("username <",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameLessThanOrEqualTo(String value) {
addCriterion("username <=",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameLike(String value) {
addCriterion("username like",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameNotLike(String value) {
addCriterion("username not like",value,"username");
return (Criteria)this;
}
publicCriteriaandUsernameIn(List<String> values) {
addCriterion("username in",values,"username");
return (Criteria)this;
}
publicCriteriaandUsernameNotIn(List<String> values) {
addCriterion("username not in",values,"username");
return (Criteria)this;
}
publicCriteriaandUsernameBetween(String value1,String value2) {
addCriterion("username between",value1,value2,"username");
return (Criteria)this;
}
publicCriteriaandUsernameNotBetween(String value1,String value2) {
addCriterion("username not between",value1,value2,"username");
return (Criteria)this;
}
publicCriteriaandPasswordIsNull() {
addCriterion("password is null");
return (Criteria)this;
}
publicCriteriaandPasswordIsNotNull() {
addCriterion("password is not null");
return (Criteria)this;
}
publicCriteriaandPasswordEqualTo(String value) {
addCriterion("password =",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordNotEqualTo(String value) {
addCriterion("password <>",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordGreaterThan(String value) {
addCriterion("password >",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordGreaterThanOrEqualTo(String value) {
addCriterion("password >=",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordLessThan(String value) {
addCriterion("password <",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordLessThanOrEqualTo(String value) {
addCriterion("password <=",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordLike(String value) {
addCriterion("password like",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordNotLike(String value) {
addCriterion("password not like",value,"password");
return (Criteria)this;
}
publicCriteriaandPasswordIn(List<String> values) {
addCriterion("password in",values,"password");
return (Criteria)this;
}
publicCriteriaandPasswordNotIn(List<String> values) {
addCriterion("password not in",values,"password");
return (Criteria)this;
}
publicCriteriaandPasswordBetween(String value1,String value2) {
addCriterion("password between",value1,value2,"password");
return (Criteria)this;
}
publicCriteriaandPasswordNotBetween(String value1,String value2) {
addCriterion("password not between",value1,value2,"password");
return (Criteria)this;
}
}
public static classCriteriaextendsGeneratedCriteria {
protectedCriteria() {
super();
}
}
public static classCriterion {
privateStringcondition;
private Objectvalue;
private ObjectsecondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private StringtypeHandler;
public StringgetCondition() {
returncondition;
}
publicObjectgetValue() {
returnvalue;
}
publicObjectgetSecondValue() {
returnsecondValue;
}
public booleanisNoValue() {
returnnoValue;
}
public booleanisSingleValue() {
returnsingleValue;
}
public booleanisBetweenValue() {
returnbetweenValue;
}
public booleanisListValue() {
returnlistValue;
}
publicStringgetTypeHandler() {
returntypeHandler;
}
protectedCriterion(String condition) {
super();
this.condition= condition;
this.typeHandler=null;
this.noValue=true;
}
protectedCriterion(String condition,Object value,String typeHandler) {
super();
this.condition= condition;
this.value= value;
this.typeHandler= typeHandler;
if (valueinstanceofList<?>) {
this.listValue=true;
}else{
this.singleValue=true;
}
}
protectedCriterion(String condition,Object value) {
this(condition,value, null);
}
protectedCriterion(String condition,Object value,Object secondValue,String typeHandler) {
super();
this.condition= condition;
this.value= value;
this.secondValue= secondValue;
this.typeHandler= typeHandler;
this.betweenValue=true;
}
protectedCriterion(String condition,Object value,Object secondValue) {
this(condition,value,secondValue, null);
}
}
}
UserService
package com.demo.service;
import com.demo.pojo.User;
import java.util.List;
public interface UserService {
List<User> getAll();
List<User>getPage(intpageSize,intpageNo);
List<User>getCondition(String name);
int insert(String userName,String password);
int updateUser(intid);
}
UserServiceImpl
package com.demo.service.impl;
import com.demo.mapper.UserMapper;
import com.demo.pojo.User;
import com.demo.pojo.UserExample;
import com.demo.service.UserService;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImplimplementsUserService {
@Autowired
UserMapperuserMapper;
@Override
publicList<User>getAll() {
UserExample userExample = new UserExample();
userExample.setDistinct(true);
return userMapper.selectByExample(userExample);
}
@Override
publicList<User>getPage(intpageSize,intpageNo) {
RowBounds rowBounds = new RowBounds(pageNo,pageSize);
UserExample userExample =newUserExample();
userExample.setDistinct(true);
return userMapper.selectByExampleWithBounds(userExample,rowBounds);
}
@Override
publicList<User>getCondition(String name) {
UserExample userExample = new UserExample();
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andUsernameEqualTo(name);
return userMapper.selectByExample(userExample);
}
@Override
public intinsert(String userName,String password) {
User user = newUser();
user.setUsername(userName);
user.setPassword(password);
return userMapper.insert(user);
}
@Override
public intupdateUser(intid) {
User user = newUser();
user.setId(id);
user.setUsername("修改");
user.setPassword("111");
return userMapper.updateByPrimaryKey(user);
}
}
UserController
package com.demo.web;
import com.demo.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
UserServiceuserServiceImpl;
/**
* 查询
* @return
*/
@RequestMapping(value="/demo",method= RequestMethod.GET)
@ResponseBody
publicObjectgetUsers(){
returnuserServiceImpl.getAll();
}
/**
* 利用mybatis的rowbounds分页类,分页查询
*/
@RequestMapping(value="/page",method= RequestMethod.GET)
@ResponseBody
publicObjectgetPage(@RequestParam(name="pageSize") String pageSize,
@RequestParam(name="pageNo") String pageNo){
try{
String size = pageSize;
int pageSizes=5,nos=1;
if(StringUtils.isNotBlank(size)){
pageSizes = Integer.parseInt(pageSize);
}
String no = pageNo;
if(StringUtils.isNotBlank(no)){
nos = Integer.parseInt(no);
}
returnuserServiceImpl.getPage(pageSizes,nos);
}catch(Exception ex){
ex.getMessage();
}
return null;
}
/**
* 按条件查询
*/
@RequestMapping(value="/condition/{name}",method= RequestMethod.GET)
@ResponseBody
publicObjectgetCondition(@PathVariableString name){
returnuserServiceImpl.getCondition(name);
}
/**
* 增加user
*/
@RequestMapping(value="/save",method= RequestMethod.GET)
@ResponseBody
publicObjectsave(@RequestParam(name="username") String username,
@RequestParam(name="password") String password){
returnuserServiceImpl.insert(username,password);
}
/**
* 根据id修改user
*/
@RequestMapping(value="/update/{id}",method= RequestMethod.GET)
@ResponseBody
publicObjectupdateUser(@PathVariableintid){
returnuserServiceImpl.updateUser(id);
}
}
demoApplication
package com.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@MapperScan(basePackages= {"com.demo.mapper"})
@ComponentScan(basePackages= {"com.demo"})
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static voidmain(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
Application.properties
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM t_user
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#spring.datasource.druid.useGlobalDataSourceStat=true
#mybatis.mapperLocations=classpath:mybatis/*.xml
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>
<!--mysql 连接数据库jar 这里选择自己本地位置的jar包-->
<classPathEntrylocation="D:\maven\repository\mysql\mysql-connector-java\5.1.35\mysql-connector-java-5.1.35.jar"/>
<context id="testTables"targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<propertyname="suppressAllComments"value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnectiondriverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"userId="root"
password="123">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals"value="false"/>
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGeneratortargetPackage="com.demo.pojo"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<propertyname="trimStrings"value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
如果maven工程只是单独的一个工程,targetProject="src/main/java"
若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
targetProject="ecps-manager-mapper",下同-->
<sqlMapGeneratortargetPackage="com.demo.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGeneratortype="XMLMAPPER"
targetPackage="com.demo.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<propertyname="enableSubPackages"value="false"/>
</javaClientGenerator>
<!-- 指定数据库表 -->
<tableschema=""tableName="user"></table>
<!--<table schema="" tableName="success_killed"></table>-->
</context>
</generatorConfiguration>
Logback.xml
<?xml version="1.0"encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<propertyname="LOG_HOME"value="/workspace/example"/>
<!-- 控制台输出 -->
<appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appendername="DAYINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestSpringBoot_info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<!--这里设置日志级别为info-->
<filterclass="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 -->
<appendername="DAYERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestSpringBoot_error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<!--这里设置日志级别为info-->
<filterclass="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<rootlevel="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="DAYINFO"/>
<appender-ref ref="DAYERROR"/>
</root>
</configuration>
Pom.xml
<?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</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.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</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
八 整合swagger
8.1添加pom.xml依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
8.2UserController添加注解
@Api("测试swagger")
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
UserService userServiceImpl;
/**
* 查询
* @return
*/
@ApiOperation("查询")
@RequestMapping(value = "/demo",method = RequestMethod.GET)
@ResponseBody
public Object getUsers(){
return userServiceImpl.getAll();
}
/**
* 利用mybatis的rowbounds分页类,分页查询
*/
@ApiOperation("利用mybatis的rowbounds分页类,分页查询")
@RequestMapping(value = "/page",method = RequestMethod.GET)
@ResponseBody
public Object getPage(@RequestParam(name = "pageSize") String pageSize,
@RequestParam(name = "pageNo") String pageNo){
try{
String size = pageSize;
int pageSizes=0,nos=0;
if(StringUtils.isNotBlank(size)){
pageSizes = Integer.parseInt(pageSize);
}
String no = pageNo;
if(StringUtils.isNotBlank(no)){
nos = Integer.parseInt(no);
}
return userServiceImpl.getPage(pageSizes,nos);
}catch (Exception ex){
ex.getMessage();
}
return null;
}
8.3,启动项目,访问http://localhost:8080/swagger-ui.html#/
九.整合redis
9.1pom.xml文件加入依赖
<!--Jedis,使用redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
9.2 application.properties加入redis配置,前提要有redis服务
#连超时设置
default.redis.timeout=15000
#是否使用连接池
default.redis.usePool = true
#host&port
default.redis.nodes=192.168.0.208:7000
9.3 添加几个类
JedisConfig配置类如下
package com.demo.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class JedisConfig {
@Autowired
Environment evn;
@Bean
public ShardedJedisPool shardedJedisPool(){
String servers = evn.getProperty("default.redis.nodes");
int timeOut = Integer.parseInt(evn.getProperty("default.redis.timeout"));
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(2);
List<JedisShardInfo> jedisShardInfos = new ArrayList<>(1);
String[] split = servers.split(":");
JedisShardInfo jedisShardInfo = new JedisShardInfo(split[0],Integer.parseInt(split[1]),timeOut);
jedisShardInfos.add(jedisShardInfo);
return new ShardedJedisPool(config,jedisShardInfos);
}
}
redisUtils类如下
package com.demo.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import java.util.List;
@Component
public class RedisUtil {
@Autowired
ShardedJedisPool pool;
public void set(String key,String value) {
ShardedJedis shardedJedis = null;
try {
shardedJedis = pool.getResource();
if (shardedJedis != null) {
shardedJedis.set(key, value);
}
} catch (Exception ex) {
} finally {
if (shardedJedis != null) {
shardedJedis.close();
}
}
}
public String get(String key){
ShardedJedis shardedJedis = null;
try{
shardedJedis = pool.getResource();
if (shardedJedis != null){
return shardedJedis.get(key);
}
}catch (Exception ex){
}finally {
if(shardedJedis != null){
shardedJedis.close();
}
}
return "1564";
}
public List<String> getList(String key){
ShardedJedis shardedJedis = null;
try {
shardedJedis = pool.getResource();
if (shardedJedis != null) {
return shardedJedis.hmget(key);
}
} catch (Exception ex) {
} finally {
if (shardedJedis != null) {
shardedJedis.close();
}
}
return null;
}
public void setList(String key,String value){
ShardedJedis shardedJedis = null;
try {
shardedJedis = pool.getResource();
if (shardedJedis != null) {
shardedJedis.set(key,value);
}
} catch (Exception ex) {
} finally {
if (shardedJedis != null) {
shardedJedis.close();
}
}
}
}
常量前缀如下
package com.demo.redis;
public class DbAndCacheContants {
public static final String USER_CACHE_PREFIX = "user:";
}
UserServiceImpl类修改如下代码
@Override
public String getCondition(String name) {
String redisName = DbAndCacheContants.USER_CACHE_PREFIX + name;
String str = redisUtil.get(redisName);
if (StringUtils.isNotBlank(str)){
return redisUtil.get(redisName);
}else {
UserExample userExample = new UserExample();
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andUsernameEqualTo(name);
List<User> users = userMapper.selectByExample(userExample);
String value = JSONObject.toJSONString(users);
redisUtil.set(redisName,value);
return value;
}
}
9.4 启动项目,swagger请求,断点调试可以看到第二次从redis里取数据
十.使用本地缓存
10.1 spring boot本身有添加google的guava包,如果没有,pom.xml添加如下依赖
<!--使用本地缓存googleGuavaCache,spring boot自己有依赖-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>
10.2 UserServiceImpl类添加如下代码
@Override
public User selectByPrimaryKey(Integer id) {
User user = null;
try{
user = userCache.get(id);
} catch (ExecutionException e) {
e.printStackTrace();
}
return user;
}
//使用本地缓存
LoadingCache<Integer,User> userCache = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.MINUTES)//缓存时间20分钟
.maximumSize(1000)//缓存对象1000个
.build(new CacheLoader<Integer, User>() {
@Override
public User load(Integer id) throws Exception {
User user = userMapper.selectByPrimaryKey(id);
if(user == null){
user = new User();
}
return user;
}
});
UserService接口添加如下方法
User selectByPrimaryKey(Integer id);
UserController添加如下代码
/**
* 根据id获得user
*/
@ApiOperation("根据id获得user")
@RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
@ResponseBody
public Object getUser(@PathVariable int id){
return userServiceImpl.selectByPrimaryKey(id);
}
10.3启动项目,断点调试,第二次不在访问数据库,使用了本地缓存