Spring Boot 集成Mybatis

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章