概述
??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 generatorConfigurationPUBLIC "-//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注入@Beanpublic 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 {@AutowiredUserVoMapper userDao;@GetMapping(value = "")@ResponseBodypublic 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