springboot是如今比較流行的微服使用的框架,springboot本質上就是將spring+springmvc+mybatis零配置化,基本上springboot的默認配置符合咱們的開發。固然有一部分仍是須要自定義的。前端
本章不是專門講springboot的,主要將springboot+mybatis plus是如何整合的。java
1、導入pom依賴mysql
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <repositories> <!--阿里雲倉庫--> <repository> <id>aliyun</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> <!--快照版本使用,正式版本無需添加此倉庫--> <repository> <id>snapshots</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> </repository> </repositories> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <mybatis-plus-boot-starter.version>2.1.9</mybatis-plus-boot-starter.version> <mybatisplus.version>2.1.8</mybatisplus.version> <HikariCP.version>2.4.13</HikariCP.version> <fastjson.version>1.2.39</fastjson.version> <druid.version>1.1.0</druid.version> </properties> <dependencies> <!-- slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.19</version> </dependency> <!-- Druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</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-jetty</artifactId> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP-java7</artifactId> <version>${HikariCP.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <!-- mybatis-plus begin --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus-boot-starter.version}</version> <exclusions> <exclusion> <artifactId>tomcat-jdbc</artifactId> <groupId>org.apache.tomcat</groupId> </exclusion> </exclusions> </dependency> <!-- mybatis-plus end --> <!-- JUnit test dependency --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.jayway.restassured</groupId> <artifactId>rest-assured</artifactId> <version>2.9.0</version> <scope>test</scope> </dependency> <!-- Code generator test sample--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2、編寫application.yml配置文件web
#app server: port: 8080 #spring spring: 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 #mybatis mybatis-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 #logging logging: level: warn
3、準備相關的類(例如springboot啓動類等)spring
Application.javasql
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 @SpringBootApplication public 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; /** * 注入公共字段自動填充,任選注入方式便可 */ //@Component public 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.javaexpress
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.javaapache
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; /** * <p> * WEB 初始化相關配置 * </p> */ @ControllerAdvice @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> 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的動態掃描的接口編程方式。編程
4、使用代碼生成器進行代碼生成(具體能夠參考個人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; /** * <p> * * </p> * * @author yc * @since 2018-05-19 */ @TableName("user") public class UserEntity extends Model<UserEntity> { /** * 用戶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; /** * <p> * Mapper 接口 * </p> * * @author yc * @since 2018-05-19 */ public interface UserDao extends BaseMapper<UserEntity> { }
(3)service
package com.blog.springboot.service; import com.blog.springboot.entity.UserEntity; import com.baomidou.mybatisplus.service.IService; /** * <p> * 服務類 * </p> * * @author yc * @since 2018-05-19 */ public interface UserService extends IService<UserEntity> { }
(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; /** * <p> * 服務實現類 * </p> * * @author yc * @since 2018-05-19 */ @Service public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService { }
(5)controller
package com.blog.springboot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; /** * <p> * 前端控制器 * </p> * * @author yc * @since 2018-05-19 */ @Controller @RequestMapping("/user") public class UserController { }
(6)UserDao.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.blog.springboot.mapper.UserDao"> <!-- 通用查詢映射結果 --> <resultMap id="BaseResultMap" type="com.blog.springboot.entity.UserEntity"> <id column="user_id" property="user_id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <result column="phone" property="phone" /> <result column="password" property="password" /> <result column="level" property="level" /> <result column="create_time" property="createTime" /> <result column="email" property="email" /> <result column="logo" property="logo" /> <result column="login_time" property="loginTime" /> </resultMap> <!-- 通用查詢結果列 --> <sql id="Base_Column_List"> user_id AS userId, username, sex, phone, password, level, create_time AS createTime, email, logo, login_time AS loginTime </sql> </mapper>
(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()); } }