Spring Boot 集成Mybatis
首先在SpringBoot的配置文件application.yml(application.properties)中
datasource:
url: localhost:3306/test
spring:
datasource: # 數據庫配置
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${datasource.url}?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
username: root
password: 123456
hikari:
maximum-pool-size: 10 # 最大連接池數
max-lifetime: 1770000
mybatis:
# 指定別名設置的包爲所有pojo
type-aliases-package: com.example.demo.pojo
configuration:
map-underscore-to-camel-case: true # 駝峯命名規範
mapper-locations: # mapper 映射文件位置
- classpath:mapper/*.xml
map-underscore-to-camel-case: true
開啓駝峯命名,類似於表中的字段user_name在相應的POJO類中只需要寫成userName便會自動匹配。
有兩種方式來操縱數據庫。
1. XML方式
表t_user結構:
mysql> desc t_user;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| age | int(11) | YES | | NULL | |
| user_name | varchar(255) | YES | | NULL | |
| passWD | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
創建一個UserController類
@RestController
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/getUserByName/{name}")
public UserInfo getUserByName(@PathVariable String name){
return userService.getUserByName(name);
}
}
UserService.interface
public interface UserService {
UserInfo getUserByName(String name);
}
UserServiceImp.java
@Service
public class UserServiceImp implements UserService{
@Resource
private UserMapper userMapper;
@Override
public UserInfo getUserByName(String name){
return userMapper.getUserByName(name);
}
}
UserMapper.java
public interface UserMapper {
//使用XML方式
UserInfo getUserByName(String userName);
}
在項目資源目錄中創建一個mapper文件夾(在上面的配置文件中說明了映射文件位置),新建一個UserMapper.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.example.demo.dao.UserMapper">
<resultMap id="BaseResultMap" type="com.example.demo.pojo.UserInfo">
<result column="user_name" jdbcType="VARCHAR" property="userName" />
</resultMap>
<select id="getUserByName" resultType="UserInfo" parameterType="String">
select * from t_user where user_name = #{userName}
</select>
</mapper>
namespace指定對應的Mapper,resultMap
指定表對應的實體類。在前的配置文件中已經開啓駝峯命名了所以可以不用寫<result>
這裏需要注意一下:Spring Boot是如何知道這個Mapper的呢?一種方法是在mapper層對應的類上添加@Mapper註解即可,但這種方法有個弊端,當我們有很多個mapper時,每個一個類上都得添加@Mapper註解。另一種比較簡便的方法是在Spring Boot啓動類上添加@MaperScan註解,用來掃描某個包下的所有mapper。
@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2. 註解方式
還可以通過註解的方式使用SQL語句 spring boot支持 增:@insert;刪:@delete;改:@update;查:@selete;註解。
public interface UserMapper {
//使用XML方式
UserInfo getUserByName(String userName);
//註解方式
@Select("select * from t_user where age = #{age}")
UserInfo getUserByAge(int age);
//多個參數 @ Param指定的參數要和SQL中#{}取的參數名相同,不同則取不到。
@Select("select * from t_user where age = #{age} and userName = #{userName}")
UserInfo getUserByAgeAndName(@Param("age") int age,@Param("userName") String userName);
@Select("select * from t_user")
List<UserInfo> getUser();
}
只需要在對應的方法上添加註解即可。不需要再寫XML文件。如果實體類和數據庫表字段不能通過駝峯命名來映射,就需要使用@Results註解。
@Select("select * from t_user where age = #{age}")
@Results({
@Result(property = "username", column = "user_name"),
@Result(property = "password", column = "passWD")
})
User getUser(int age);
不過在項目中一般會使用XML和註解結合的方式來使用。使用@ResultMap引入XML文件中的<ResultMap>
的配置,註解中的值爲XML中<ResultMap>
的id值。
@Select("select * from t_user where age = #{age}")
@ResultMap("BaseResultMap")
User getUser(int age);