一、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,用的最多
其实我觉得这种并不好用,还没我在路径上使用动词表示的简单明了,当然了,个人看法。