前言
- 當表名為user時,會多生成2個實體類
- 正常情況下生成的類
- 測試是否可以直接在目前
中開發mybatis代碼生成器的項目
- 啟動項目後測試,發現目前項目隻能用來生成代碼
- 即使項目添加所需的開發依賴,啟動項目後依然無法找到接口
,或者報依賴沖突的錯誤path
- 解決方案,參考
項目重新建構一個項目,将生成的代碼複制到新項目中gitee/chnx/cloud/seata/seata01
-
案例要求
# 使用代碼生成器生成代碼
# 工具類:傳回對象工具類、分頁對象工具類
# 使用分頁、分頁連接配接查詢
# 傳入參數為對象、集合、集合對象
案例一
-
使用mybatis代碼生成器生成代碼
- 使用的
是gitee/chenx/mybatis-geneatormybatis代碼生成器項目案例
- 未使用該方式開發的原因:
# 在該代碼生成器項目中生成代碼後,無法直接在該項目上繼續開發
# 将生成的代碼複制到1個建立的項目,需修改每個類的路徑,已經違背了使用代碼生成器的初衷
案例二
- 案例位址
-
使用mybatis plus代碼生成器生成代碼
- 首先參考
生成代碼案例二
- 生成代碼後,将pom.xml中的依賴删除,将application.properties中的配置删除,并重命名為application.yml
- 注釋掉
中的main方法測試類
- 之後參考建構mybatis plus項目
- 将maven配置為3.6.1或IDE自帶的maven,否者某些依賴無法導入
- 導入如下依賴
點選檢視詳情
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!-- 以下為代碼生成器中的依賴 -->
<!-- freemarker模闆和velocity模闆依賴,後面配置的時候會2選其1 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.20</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
- 編寫yml
點選檢視詳情
server:
port: 8080
spring:
application:
name: mybatisplus
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.102:3306/dbtest?characterEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
mvc:
view:
suffix: ".html"
mybatis:
configuration:
map-underscore-to-camel-case: true
mapperLocations: classpath:mapper/*.xml
logging:
level:
com:
chnq:
mybatisplus: debug
- 配置啟動類
點選檢視詳情
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.chnq.mybatisplus.mapper")
public class MybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}
}
- 編寫mybatis plus 配置類
點選檢視詳情
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@Configuration
@MapperScan("com.chnq.mybatisdemo.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
- 檢查實體類中的
注解配置
- 檢查mapper層注解
- 檢查service層注解,并注入mapper
- 檢查controller層注解,并注入mapper、service
- 在controller層調用mapper對象和service對象中的方法進行測試
點選檢視詳情
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
UserService userService;
@Resource
UserMapper userMapper;
// 測試
// 調用service層接口查詢所有
@GetMapping("/getUsers")
public String getUserList(){
List<User> user = userService.list();
System.out.println(user);
return RespResult.success("擷取成功!", user);
}
// 調用mapper層接口查詢所有
@GetMapping("/getUsers2")
@ResponseBody
public String getUserTest(){
List<User> users = userMapper.selectList(null);
users.forEach(user-> System.out.println("user = " + user));
return RespResult.success("擷取成功!", users);
}
}
- 在service層和controller層注入對象時,
,是因為之前使用代碼生成器的依賴被删除了,之後重新配置了mybatis plus開發所需的依賴,導緻還有緩存無法注入
- 解決方案參考
- 配置工具類
-
編寫req
點選檢視詳情
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class UserBookReq implements Serializable {
private static final long serialVersionUID = 1L;
// 使用者名
private String username;
// 性别
private String sex;
// 書名
private String bookname;
// 作者
private String author;
// 價格
private BigDecimal price;
// 目前頁
private int pageNum = 1;
// 每頁條數
private int pageSize = 5;
}
-
編寫resp
點選檢視詳情
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class UserBookResp implements Serializable {
private static final long serialVersionUID = 1L;
private Integer uId;
private String username;
private String password;
private String sex;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
private Integer bId;
private String bookname;
private String author;
private BigDecimal price;
}
-
編寫mapper
點選檢視詳情
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 連接配接查詢
List<User> findUser();
// 分頁查詢
List<User> findUsers();
// 分頁連接配接查詢
List<UserBookResp> getUserBook(UserBookReq userBookReq);
}
-
編寫mapper.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.chnq.mybatisplus.mapper.UserMapper">
<!-- 連接配接查詢 -->
<select id="findUser" resultType="com.chnq.mybatisplus.entity.User">
select u.id, u.username, u.password, u.sex, u.birthday, b.id, b.bookname, b.author, b.price from user u inner join book b on u.username = b.author;
</select>
<!-- 連接配接查詢:第3條開始的3條資料 -->
<select id="findUsers" resultType="com.chnq.mybatisplus.entity.User">
SELECT * FROM user LIMIT 2,3;
</select>
<!-- 分頁連接配接查詢 -->
<select id="getUserBook" resultType="com.chnq.mybatisplus.resp.UserBookResp">
select u.id, u.username, u.password, u.sex, u.birthday, b.id, b.bookname, b.author, b.price
from user u inner join book b on u.username = b.author
where
<if test="username != null">
u.username = #{username}
</if>
<if test="sex != null">
or u.sex = #{sex}
</if>
<if test="bookname != null">
or b.bookname = #{bookname}
</if>
<if test="author != null">
or b.author = #{author}
</if>
<if test="price != null">
or b.price = #{price}
</if>
<if test="pageNum !=null and pageSize != null">
limit #{pageNum}, #{pageSize}
</if>
</select>
</mapper>
-
編寫service
點選檢視詳情
public interface UserService extends IService<User> {
// 連接配接查詢
List<User> findUser();
// 分頁查詢
List<User> findUsers();
// 分頁連接配接查詢
List<UserBookResp> getUserBook(UserBookReq userBookReq);
}
-
編寫service實作類
點選檢視詳情
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List<User> findUser() {
return userMapper.findUser();
}
@Override
public List<User> findUsers() {
return userMapper.findUsers();
}
@Override
public List<UserBookResp> getUserBook(UserBookReq userBookReq) {
return userMapper.getUserBook(userBookReq);
}
}
-
編寫controller
點選檢視詳情
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
UserMapper userMapper;
// 連接配接查詢
@GetMapping("/userList")
@ResponseBody
public String UserList(){
List<User> users = userMapper.findUser();
users.forEach(user-> System.out.println("user = " + user));
return RespResult.success("擷取成功!", users);
}
// 分頁查詢
@GetMapping("/usersList")
@ResponseBody
public String UsersList(){
List<User> users = userMapper.findUsers();
users.forEach(user-> System.out.println("user = " + user));
return RespResult.success("擷取成功!", users);
}
// 分頁連接配接查詢
@RequestMapping(value = "/listAll", method = RequestMethod.POST)
public List<UserBookResp> listAll(@RequestBody UserBookReq req){
return userService.getUserBook(req);
}
}
- 測試