spring boot 整合mybatis,swagger,redis,guava等,以及idea自动生成mapper文件

开篇:

使用自动生成工具,生成的代码,xml文件等,将非常好的支持增删改,分页查询,条件查询等

一.创建spring boot

1.1idea创建,点击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进行分页查询

一,usermapperusermapper.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>

二,userserviceuserserviceimpl分别添加如下代码

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;
}

三.请求路径上添加pagesizepageno这连个参数,可正常返回分页

四.整合日志

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本身有添加googleguava包,如果没有,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启动项目,断点调试,第二次不在访问数据库,使用了本地缓存

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值