一、MyBatis逆向工程的使用
因爲比較簡單,就不另寫一篇記錄了,在這裏正好使用上。可以針對單表自動生成mybatis執行所需要的代碼(mapper.java、mapper.xml、pojo…),提高工作效率。
數據表還是用上一篇的,這裏依然貼一下SQL
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`id` int(64) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL,
`salt` varchar(64) DEFAULT NULL,
`state` varchar(8) DEFAULT NULL,
`username` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `user_info` VALUES ('1', '管理員', '565111f370e4dd497aa4eeb985efa6a3', '7mrNoL/keN6rbqZDx+PKyg==', '1', 'admin');
1.1 POM.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!-- Spring Boot Mybatis 依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!-- Mybatis逆向工程 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- MySQL 連接驅動依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</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.7</version>
<configuration>
<configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
1.2 目錄結構
1.3 generator.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>
<!-- 數據庫驅動:選擇你的本地硬盤上面的數據庫驅動包-->
<classPathEntry location="D:\software\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/>
<!-- 表設計時有聯合主鍵時, 不需要單獨主鍵實體類時 把defaultModelType設置爲flat -->
<context id="DB2Tables" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- JavaBean 實現 序列化 接口 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!-- 生成toString -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<!-- optional,旨在創建class時,對註釋進行控制 -->
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- <property name="suppressAllComments" value="true"/>-->
</commentGenerator>
<!--數據庫鏈接URL,用戶名、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/demo"
userId="root"
password="1234">
</jdbcConnection>
<!-- 類型轉換 -->
<javaTypeResolver >
<!-- 是否使用bigDecimal,
false: 把JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer(默認)
true: 把JDBC DECIMAL 和 NUMERIC 類型解析爲java.math.BigDecimal
-->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.example.restfuldemo.domain" targetProject="src/main/java">
<!-- 默認false 是否允許子包 -->
<property name="enableSubPackages" value="true" />
<!-- 默認false 是否對model添加 構造函數 -->
<property name="constructorBased" value="false"/>
<!-- 默認false 建立的Model對象是否 不可改變 即生成的Model對象不會有 setter方法,只有構造方法 -->
<property name="immutable" value="false"/>
<!-- 默認false 是否對類CHAR類型的列的數據進行trim操作 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.restfuldemo.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名-->
<table tableName="user_info"></table>
</context>
</generatorConfiguration>
1.4 右鍵 run mybatis-generator即可
BUILD SUCCESS之後可以看到,它自動生成了下圖這些東西,那是相當省事了。
二、 Restful風格增刪改查
2.1 application.properties
#數據源配置
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = 1234
## Mybatis 配置
# 配置爲 com.example.restfuldemo.domain 指向實體類包路徑。
mybatis.typeAliasesPackage=com.example.restfuldemo.domain
# 配置爲 classpath 路徑下 mapper 包下,* 代表會掃描所有 xml 文件。
mybatis.mapperLocations=classpath:/mappers/*.xml
2.2 UserInfoService與Impl
public interface UserInfoService {
/**
* 新增用戶
* @param userInfo
* @return
*/
int addUser(UserInfo userInfo);
/**
* 修改用戶
* @param userInfo
* @return
*/
int updateUser(UserInfo userInfo);
/**
* 刪除用戶
* @param id
* @return
*/
int delUser(int id);
/**
* 根據用戶名查找
* @param username
* @return
*/
UserInfo getUserByName(String username);
/**
* 查詢所有用戶
* @return
*/
List<UserInfo> findAll();
}
實現類:
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
UserInfoMapper userInfoMapper;
@Override
public int addUser(UserInfo userInfo) {
int result = 0;
result = userInfoMapper.insert(userInfo);
return result;
}
@Override
public int updateUser(UserInfo userInfo) {
int result = 0;
result = userInfoMapper.updateByPrimaryKey(userInfo);
return result;
}
@Override
public int delUser(int id) {
int result = 0;
result = userInfoMapper.deleteByPrimaryKey(id);
return result;
}
@Override
public UserInfo getUserByName(String username) {
return null;
}
@Override
public List<UserInfo> findAll() {
UserInfoExample example = new UserInfoExample();
//有查詢條件框時這樣寫
// UserInfoExample.Criteria criteria = example.createCriteria();
//criteria.andUsernameLike("%"+username+"%");
List<UserInfo> userInfos = userInfoMapper.selectByExample(example);
return userInfos;
}
}
2.3 Controller
@RestController
@RequestMapping("/api/user")
public class UserInfoController {
@Autowired
UserInfoService userInfoService;
@PostMapping
public int addUser(UserInfo userInfo){
return userInfoService.addUser(userInfo);
}
@PutMapping
public int updateUser(UserInfo userInfo){
return userInfoService.updateUser(userInfo);
}
@DeleteMapping
public int delUser(int id){
return userInfoService.delUser(id);
}
@GetMapping("/userAll")
public List<UserInfo> findAll(){
return userInfoService.findAll();
}
}
2.4 測試
這裏直接使用postman來測試了。 展示新增與查詢的結果
查詢:
三、擴展
3.1 HTTP 動詞
- GET(SELECT):從服務器取出資源(一項或多項)。
- POST(CREATE):在服務器新建一個資源。
- PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。
- DELETE(DELETE):從服務器刪除資源。
3.2 實際情況
- 在實際的項目中簡單查詢儘量用GET,好處是可以直接帶查詢參數;
- 複雜查詢和更新用POST,用的最多
其實我覺得這種並不好用,還沒我在路徑上使用動詞表示的簡單明瞭,當然了,個人看法。