本文共 14608 字,大约阅读时间需要 48 分钟。
springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发。当然有一部分还是需要自定义的。
本章不是专门讲springboot的,主要将springboot+mybatis plus是如何整合的。
一、导入pom依赖
org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE aliyun http://maven.aliyun.com/nexus/content/groups/public/ snapshots https://oss.sonatype.org/content/repositories/snapshots/ UTF-8 1.7 1.7 2.1.9 2.1.8 2.4.13 1.2.39 1.1.0 org.slf4j slf4j-api 1.7.19 com.alibaba druid ${druid.version} org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-jetty com.zaxxer HikariCP-java7 ${HikariCP.version} com.alibaba fastjson ${fastjson.version} com.baomidou mybatis-plus-boot-starter ${mybatis-plus-boot-starter.version} tomcat-jdbc org.apache.tomcat org.springframework.boot spring-boot-starter-test test com.jayway.restassured rest-assured 2.9.0 test org.apache.velocity velocity 1.7 test mysql mysql-connector-java 5.1.21 org.springframework.boot spring-boot-maven-plugin
二、编写application.yml配置文件
#appserver: port: 8080#springspring: devtools: restart: enabled: false datasource: url: jdbc:mysql://127.0.0.1:3306/blog?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: 1234 db-name: blog filters: log4j,wall,mergeStat1#mybatismybatis-plus: mapper-locations: classpath:/mapper/*Dao.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: com.blog.springboot.entity global-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 2 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 2 #驼峰下划线转换 db-column-underline: true #刷新mapper 调试神器 refresh-mapper: true #数据库大写下划线转换 #capital-mode: true #逻辑删除配置(下面3个配置) logic-delete-value: 0 logic-not-delete-value: 1 #自定义sql注入器,不在推荐使用此方式进行配置,请使用自定义bean注入 sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector #自定义填充策略接口实现,不在推荐使用此方式进行配置,请使用自定义bean注入 meta-object-handler: com.blog.springboot.MyMetaObjectHandler #自定义SQL注入器 #sql-injector: com.baomidou.springboot.xxx # SQL 解析缓存,开启后多租户 @SqlParser 注解生效 sql-parser-cache: true configuration: map-underscore-to-camel-case: true cache-enabled: false#logginglogging: level: warn
三、准备相关的类(例如springboot启动类等)
Application.java
package com.blog.springboot;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.Banner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableTransactionManagement@SpringBootApplicationpublic class Application { protected final static Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); logger.info("Application is success!"); }}
MyMetaObjectHandler.java
package com.blog.springboot;import com.baomidou.mybatisplus.mapper.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 注入公共字段自动填充,任选注入方式即可 *///@Componentpublic class MyMetaObjectHandler extends MetaObjectHandler { protected final static Logger logger = LoggerFactory.getLogger(Application.class); @Override public void insertFill(MetaObject metaObject) { logger.info("新增"); } @Override public void updateFill(MetaObject metaObject) { logger.info("更新"); }}
MybatisPlusConfig.java
package com.blog.springboot.config;import java.util.ArrayList;import java.util.List;import com.baomidou.mybatisplus.incrementer.H2KeyGenerator;import com.baomidou.mybatisplus.incrementer.IKeyGenerator;import com.baomidou.mybatisplus.mapper.ISqlInjector;import com.baomidou.mybatisplus.mapper.LogicSqlInjector;import com.baomidou.mybatisplus.mapper.MetaObjectHandler;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.baomidou.mybatisplus.plugins.PaginationInterceptor;import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;import com.baomidou.mybatisplus.plugins.parser.ISqlParser;import com.baomidou.mybatisplus.plugins.parser.tenant.TenantHandler;import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;import com.blog.springboot.MyMetaObjectHandler;import net.sf.jsqlparser.expression.Expression;import net.sf.jsqlparser.expression.LongValue;@Configuration@MapperScan("com.blog.springboot.mapper*")public class MybatisPlusConfig { /** * mybatis-plus SQL执行效率插件【生产环境可以关闭】 */ @Bean public PerformanceInterceptor performanceInterceptor() { return new PerformanceInterceptor(); } @Bean public MetaObjectHandler metaObjectHandler(){ return new MyMetaObjectHandler(); } /** * 注入主键生成器 */ @Bean public IKeyGenerator keyGenerator(){ return new H2KeyGenerator(); } /** * 注入sql注入器 */ @Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); }}
WebConfig.java
package com.blog.springboot.config;import java.util.List;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import com.fasterxml.jackson.annotation.JsonInclude;import com.fasterxml.jackson.databind.MapperFeature;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.module.SimpleModule;import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;/** ** WEB 初始化相关配置 *
*/@ControllerAdvice@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.serializationInclusion(JsonInclude.Include.NON_NULL); ObjectMapper objectMapper = builder.build(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);// 忽略 transient 修饰的属性 converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); super.configureMessageConverters(converters); }}
上述类启动类和对mapper文件扫描的类是一定要用到的,功能的话,就不用多说了,启动类,运行即可通过地址栏进入界面,因为我在pom文件中配置了tomcat,就算不配置,springboot也会自带一个servlet容器,扫描类,主要针对xml文件,相当于mybatis的动态扫描的接口编程方式。
四、使用代码生成器进行代码生成(具体可以参考我的MP实战系列(六)之代码生成器讲解)
生成的代码,我还是先贴出来
(1)实体类
package com.blog.springboot.entity;import java.io.Serializable;import com.baomidou.mybatisplus.activerecord.Model;import com.baomidou.mybatisplus.annotations.TableField;import com.baomidou.mybatisplus.annotations.TableId;import com.baomidou.mybatisplus.annotations.TableName;import com.baomidou.mybatisplus.enums.IdType;/** ** *
* * @author yc * @since 2018-05-19 */@TableName("user")public class UserEntity extends Model{ /** * 用户ID */ @TableId(value = "user_id", type = IdType.AUTO) private Integer user_id; /** * 用户名 */ private String username; /** * 性别 */ private Integer sex; /** * 电话 */ private String phone; /** * 密码 */ private String password; /** * 等级 */ private Integer level; /** * 用户创建时间 */ @TableField("create_time") private String createTime; /** * 邮箱 */ private String email; /** * 登录标识 */ private Integer logo; /** * 登录时间 */ @TableField("login_time") private String loginTime; public Integer getUserId() { return user_id; } public void setUserId(Integer user_id) { this.user_id = user_id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getLevel() { return level; } public void setLevel(Integer level) { this.level = level; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getLogo() { return logo; } public void setLogo(Integer logo) { this.logo = logo; } public String getLoginTime() { return loginTime; } public void setLoginTime(String loginTime) { this.loginTime = loginTime; } @Override public String toString() { return "User{" + "userId=" + user_id + ", username=" + username + ", sex=" + sex + ", phone=" + phone + ", password=" + password + ", level=" + level + ", createTime=" + createTime + ", email=" + email + ", logo=" + logo + ", loginTime=" + loginTime + "}"; } @Override protected Serializable pkVal() { // TODO Auto-generated method stub return this.user_id; }}
(2)dao
package com.blog.springboot.mapper;import com.blog.springboot.entity.UserEntity;import com.baomidou.mybatisplus.mapper.BaseMapper;/** ** Mapper 接口 *
* * @author yc * @since 2018-05-19 */public interface UserDao extends BaseMapper{}
(3)service
package com.blog.springboot.service;import com.blog.springboot.entity.UserEntity;import com.baomidou.mybatisplus.service.IService;/** ** 服务类 *
* * @author yc * @since 2018-05-19 */public interface UserService extends IService{}
(4)service实现类
package com.blog.springboot.service.impl;import com.blog.springboot.entity.UserEntity;import com.blog.springboot.mapper.UserDao;import com.blog.springboot.service.UserService;import com.baomidou.mybatisplus.service.impl.ServiceImpl;import org.springframework.stereotype.Service;/** ** 服务实现类 *
* * @author yc * @since 2018-05-19 */@Servicepublic class UserServiceImpl extends ServiceImplimplements UserService {}
(5)controller
package com.blog.springboot.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.stereotype.Controller;/** ** 前端控制器 *
* * @author yc * @since 2018-05-19 */@Controller@RequestMapping("/user")public class UserController {}
(6)UserDao.xml
user_id AS userId, username, sex, phone, password, level, create_time AS createTime, email, logo, login_time AS loginTime
(7)springboot单元测试
package com..test;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.blog.springboot.Application;import com.blog.springboot.entity.UserEntity;import com.blog.springboot.mapper.UserDao;@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = Application.class)public class UserTest{ @Autowired private UserDao ud; @Test public void test001() { UserEntity userEntity = ud.selectById(1); System.out.println(userEntity.getCreateTime()+"||"+userEntity.getEmail()); }}
转载地址:http://gpobz.baihongyu.com/