Spring Boot(四) Mybatis-MySql

Spring Boot(四) Mybatis-MySql

0.準備數據庫表


-- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` char(255) DEFAULT NULL,
  `remark` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of person
-- ----------------------------
INSERT INTO `person` VALUES ('1', '法師', '25', '男', null);
INSERT INTO `person` VALUES ('2', '錘子', '28', '男', null);
INSERT INTO `person` VALUES ('3', '土豆', '18', '女', null);
INSERT INTO `person` VALUES ('4', '甜心', '19', '女', null);

一.pom.xml文件添加maven依賴

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <!--集成druid,使用連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.0</version>
        </dependency>
    

注意:druid是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池,據說是“目前最好的連接池”。

二.修改配置文件application.properties

server.port=9997
# 數據庫連接配置
spring.datasource.name=spring-boot-mybatis-mysql
spring.datasource.url=jdbc:mysql://47.105.66.132:3307/demo
spring.datasource.username=root
spring.datasource.password=xingying
# mybatis 配置
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=spring.boot.mybatis.mysql.model
# 使用druid數據源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

三.MyBatis配置

  1. 在resources目錄下面新建2個目錄:generator和mapping,用於存放mybatis的配置文件和映射文件

  2. 在包spring.boot.mybatis.mysql下新建包mapper和model,用於存放mybatis生成的代碼

  3. 在generator目錄下,新建文件generatorConfig.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\apache-maven-3.6.0-bin\repository\mysql\mysql-connector-java\8.0.17\mysql-connector-java-8.0.17.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <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="xingying">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="spring.boot.mybatis.mysql.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="spring.boot.mybatis.mysql.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名-->
        <table tableName="person" domainObjectName="Person" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>修改pom添加mybatis的maven插件
  <!-- mybatis generator 自動生成代碼插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>                                          ${basedir}/src/main/resources/generator/generatorConfig.xml
                    </configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
  1. 添加並導入包後打開View->Tool Windows->Maven Projects可看到如下插件

  1. 雙擊運行,運行完後項目目錄將會自動生成如下幾個文件:

  1. 打開PersonMapper.xml就是Mybatis的映射文件,裏面的內容其實就是Sql。

    注意:使用這個插件的時候,生成的的映射文件可能會有多個ResultMap,導致啓動的時候會報錯

    Result Maps collection already contains value for...

    這是因爲數據庫中可能有多個schema中都有同樣名字的一張表。這個時候簡單的辦法就是打開這個文件刪除掉多餘的配置即可。

    打開PersonMapper

//自動生成的沒有下面這個註解,如果在依賴注入的時候報錯,記得加上這個註解
//@Component
public interface PersonMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Person record);

    int insertSelective(Person record);

    Person selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Person record);

    int updateByPrimaryKey(Person record);
}
  1. 添加我們的service和controller
/*
Service 接口
 */
public interface IPerson {
    int deleteByPrimaryKey(Integer id);

    int insert(Person record);

    int insertSelective(Person record);

    Person selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Person record);

    int updateByPrimaryKey(Person record);
}

/*
Person Service
 */
@Service
public class PersonImpl implements IPerson {

    /*
    注入 personMapper
     */
    @Autowired
    private PersonMapper personMapper;

    @Override
    public int deleteByPrimaryKey(Integer id) {
        return personMapper.deleteByPrimaryKey(id);
    }

    @Override
    public int insert(Person record) {
        return personMapper.insert(record);
    }

    @Override
    public int insertSelective(Person record) {
        return personMapper.insertSelective(record);
    }

    @Override
    public Person selectByPrimaryKey(Integer id) {
        return personMapper.selectByPrimaryKey(id);
    }

    @Override
    public int updateByPrimaryKeySelective(Person record) {
        return personMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Person record) {
        return personMapper.updateByPrimaryKey(record);
    }
}

@RestController
@RequestMapping("/person")
public class PersonController {

    @Autowired
    public IPerson person;

    @RequestMapping(method = RequestMethod.GET)
    public Person get(@RequestParam Integer id) {
        return person.selectByPrimaryKey(id);
    }
}

注意:如果personMapper下方紅線報錯,是因爲PersonMapper沒有配置依賴注入掃描註解,可在類上方增加@Component註解。當然也可以修改idea的錯誤提示,降低Autowired檢測的級別,將Severity的級別由之前的error改成warning或其它可以忽略的級別。

  1. 啓動類新增註解@MapperScan("spring.boot.mybatis.mysql.mapper")

  2. 測試運行

四、更優雅的方式

    通過上面的過程,可以發現又出現了一系列的配置文件,如果我們想更優雅一點的編碼,Mybatis爲此也提供了,不需要配置文件的方式。注意,是更優雅一些不是更好一些,至於哪種方式更好要結合實際。

只需要在PersonMapper接口的方法上添加相應的SQL註解即可

package spring.boot.mybatis.mysql.annotate.mapper;

import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import spring.boot.mybatis.mysql.annotate.model.Person;

@Component
public interface PersonMapper {

    @Delete("DELETE FROM person WHERE id =#{id}")
    int deleteByPrimaryKey(Integer id);

    @Insert("INSERT INTO person(name,age,gender,remark) VALUES(#{name}, #{age}, #{gender},#{remark})")
    int insert(Person record);

    @Select("SELECT * FROM person WHERE id = #{id}")
    @Results({
            @Result(property = "id",  column = "id"),
            @Result(property = "name", column = "name"),
            @Result(property = "age", column = "age"),
            @Result(property = "gender", column = "gender"),
            @Result(property = "remark", column = "remark")
    })
    Person selectByPrimaryKey(Integer id);

    @Update("UPDATE person SET name=#{name},age=#{age} WHERE id =#{id}")
    int updateByPrimaryKey(Person record);
}
  • @Select 是查詢類的註解,所有的查詢均使用這個
  • @Result 修飾返回的結果集,關聯實體類屬性和數據庫字段一一對應,如果實體類屬性和數據庫屬性名保持一致,就不需要這個屬性來修飾。
  • @Insert 插入數據庫使用,直接傳入實體類會自動解析屬性到對應的值
  • @Update 負責修改,也可以直接傳入對象
  • @delete 負責刪除

想要了解更多特性,可以參考Mybatis官網

五、踩坑記

  1. Service中注入personMapper報錯

    PersonMapper類上加註解@Component

  2. 啓動的時候報錯

    Result Maps collection already contains value for...

    這是因爲數據庫中可能有多個schema中都有同樣名字的一張表。這個時候簡單的辦法就是打開這個文件刪除掉多餘的配置即可。

示例代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章