概述
mybatis框架的優點,就不用多說了,今天這邊干貨主要講mybatis的逆向工程,以及springboot的集成技巧,和分頁的使用
因為在日常的開發中,當碰到特殊需求之類會手動寫一下sql語句,大部分的時候完全可以用mybatis的逆向工程替代。
mybatis逆向工程
相比較而言,代碼形式的逆向工程,更加靈活方便,簡單,易於管理,而且可以上傳到git中存儲。而且也只需要簡單的三步就能完成自動生成代碼。下面介紹如果搭建並生成xml和代碼
第一步:搭建工程
本項目使用的是maven搭建的工程,在你的pom文件中加入以下依賴:(這里以mysql數據庫為例)
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
第二步:配置generatorConfig.xml
該xml文件是mybatis的配置項 這里記錄了數據庫連接的配置,
<?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>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自動生成的注釋 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/database" userId="root"
password="123456">
</jdbcConnection>
<!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL和NUMERIC類型解析為java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO類的位置,重要!! -->
<javaModelGenerator targetPackage="springboot.modal.vo"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
<!-- 從數據庫返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置,重要!! -->
<sqlMapGenerator targetPackage="springboot.dao"
targetProject=".\src">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置,重要!! -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="springboot.dao"
targetProject=".\src">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定數據庫表,要生成哪些表,就寫哪些表,要和數據庫中對應,不能寫錯! -->
<table tableName="t_contents" domainObjectName="ContentVo" mapperName="ContentVoMapper" ></table>
</context>
</generatorConfiguration>
第三步:啟動類
啟動類主要設置main方法以及,制定配置文件generatorConfig.xml的路徑
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Generator {
public static void main(String args[]) throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("./src/main/resources/generatorconfig.xml");
System.out.println(configFile.exists());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
當然如果有你想要設置日志輸出的話,可以加一個log4j.properties,簡單配置一下日志輸出:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
最后運行啟動類Generator,運行之前得確保,在數據庫中先創建好表
工程已經搭建好了,可以參考github上:
mybatis逆向工程GitHub
逆向工程如何使用
mapper中的方法
逆向工程生成完畢后,mybatis會在mapper中提供一些默認的接口和參數,下面就介紹一下這些方法的使用:
方法 | 功能說明 |
---|---|
int countByExample(UserExample example) | 按條件計數 |
int deleteByPrimaryKey(Integer id) | 按主鍵刪除 |
int deleteByExample(UserExample example) | 按條件刪除 |
String/Integer insert(User record) | 插入數據,返回值的ID |
String/Integer insertSelective(User record) | 插入一條數據,只插入不為null的字段 |
User selectByPrimaryKey(Integer id) | 按主鍵查詢 |
List selectByExample(UserExample example) | 按條件查詢 |
List selectByExampleWithBLOGs(UserExample example) | 按條件查詢(包括BLOB字段)。只有當數據表中的字段類型有為二進制的才會產生。 |
int updateByPrimaryKey(User record) | 按主鍵更新 |
int updateByPrimaryKeySelective(User record) | 按主鍵更新值不為null的字段 |
int updateByExample(User record, UserExample example) | 按條件更新 |
int updateByExampleSelective(User record, UserExample example) | 按條件更新值不為null的字段 |
example類中的方法
mybatis的逆向工程中會生成實例及實例對應的example,example用於添加條件,相當where后面的部分
xxxExample example = new xxxExample();
Criteria criteria = new Example().createCriteria();
下表是常用方法
方法 | 說明 |
---|---|
example.setOrderByClause(“字段名 ASC”); | 添加升序排列條件,DESC為降序 |
example.setDistinct(false) | 去除重復,boolean型,true為選擇不重復的記錄。 |
criteria.andXxxIsNull | 添加字段xxx為null的條件 |
criteria.andXxxIsNotNull | 添加字段xxx不為null的條件 |
criteria.andXxxNotEqualTo(value) | 添加xxx字段不等於value條件 |
criteria.andXxxGreaterThan(value) | 添加xxx字段大於value條件 |
criteria.andXxxGreaterThanOrEqualTo(value) | 添加xxx字段大於等於value條件 |
criteria.andXxxLessThan(value) | 添加xxx字段小於value條件 |
criteria.andXxxLessThanOrEqualTo(value) | 添加xxx字段小於等於value條件 |
criteria.andXxxIn(List<?>) | 添加xxx字段值在List<?>條件 |
criteria.andXxxNotIn(List<?>) | 添加xxx字段值不在List<?>條件 |
criteria.andXxxLike(“%”+value+”%”) | 添加xxx字段值為value的模糊查詢條件 |
criteria.andXxxNotLike(“%”+value+”%”) | 添加xxx字段值不為value的模糊查詢條件 |
criteria.andXxxBetween(value1,value2) | 添加xxx字段值在value1和value2之間條件 |
criteria.andXxxNotBetween(value1,value2) | 添加xxx字段值不在value1和value2之間條件 |
sringboot整合mybatis
springboot整合mybatis很簡單 只需要簡單的配置即可以。
這里使用時xml方式,注解方式相對而言是清爽一些,但是sql全都堆砌在java文件中,並不利於閱讀,而且也沒有xml方式靈活。
項目構建
這里使用的是maven來構建項目,下面是pom文件:
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- 數據庫連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
<scope>runtime</scope>
</dependency>
<!-- spring boot 配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
工程搭建
搭建springboot第一件事就是使用配置application.properties。整合mybatis的時候需要配置jdbc的信息,這里還用了阿里的連接池Druid.下面是詳細的配置信息:
server.port=80
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/bootmybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true
#用戶名
spring.datasource.username=root
#密碼
spring.datasource.password=123456
spring.datasource.initialSize=20
spring.datasource.minIdle=10
spring.datasource.maxActive=100
# 輸出mybatis日志 sql語句方便調試
logging.level.com.dao=DEBUG
下圖是工程結構圖:
這里的UserVoMapper,UserVo,UserVoExample,都是使用的逆向工程生成的
啟動類代碼:
package com;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@SpringBootApplication
@ComponentScan
@EnableAutoConfiguration
@MapperScan("com.dao")
public class StartApplication {
public static void main(String[] args) throws Exception {
SpringApplication app = new SpringApplication(StartApplication.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
// datasource注入
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
//mybatis SQLSession注入
@Bean
public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 這里設置mybatis xml文件的地址
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
}
測試
在IndexController代碼如下:
package com.controller;
import com.dao.UserVoMapper;
import com.domain.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@Autowired
UserVoMapper userDao;
@GetMapping(value = "")
@ResponseBody
public UserVo index(){
UserVo userVo = new UserVo();
userVo.setUsername("SELECTIVE");
userVo.setPassword("123456");
userVo.setAddress("北京");
userDao.insertSelective(userVo);
userVo = userDao.selectByPrimaryKey(1);
return userVo;
}
}
啟動startApplication,在瀏覽器中輸入http://127.0.0.1,即可查看到結果。
如果有不明白的可以去git上查看源碼,傳送門
喜歡的話,給個star