首頁 > 軟體

Spring + MyBatis設定詳細講解

2020-06-16 16:40:05

### 1. MyBatis簡介

MyBatis是持久層框架,大大的簡化了持久層開發。

當使用MyBatis框架時,開發人員不必再編寫繁瑣的JDBC程式碼,只需要定義好每個功能對應的抽象方法與需要執行的SQL語句即可!

### 2. 基本使用

#### 2.1. 新增依賴

需要在`pom.xml`中新增MyBatis的依賴:

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>

然後新增MyBatis整合Spring的依賴:

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>

其底層實現是基於JDBC的,所以,還需要新增`spring-jdbc`的依賴,需要注意的是:此次使用的版本必須與`spring-webmvc`的保持一致:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.9.RELEASE</version>
    </dependency>

根據使用的資料庫,新增資料庫連線驅動的依賴:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>

新增資料來源的依賴:

    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>

#### 2.2. 資料庫連線

在`src/main/resources`下建立`db.properties`檔案,用於設定資料庫連線的相關資訊:

#資料庫驅動
driver=com.mysql.cj.jdbc.Driver
#資料庫連線
url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
#資料庫使用者名稱
username=root
#資料庫密碼
password=
#資料庫連線池初始連線數
initialSize=3
#資料庫連線池最連線執行緒數
maxActive=5


在專案中準備名為`spring-dao.xml`的Spring組態檔,並載入以上資料庫的組態檔:

    <!-- 載入資料庫的組態檔 -->
    <util:properties id="dbConfig" 
        location="classpath:db.properties" />

然後,將以上讀取到的設定值應用於資料來源`BasicDataSource`中:

    <!-- 設定資料來源 -->
    <bean class="org.apache.commons.dbcp.BasicDataSource">
        <property name="url" 
            value="#{dbConfig.url}" />
        <property name="driverClassName"
            value="#{dbConfig.driver}" />
        <property name="username"
            value="#{dbConfig.username}" />
        <property name="password"
            value="#{dbConfig.password}" />
        <property name="initialSize"
            value="#{dbConfig.initialSize}" />
        <property name="maxActive"
            value="#{dbConfig.maxActive}" />
    </bean>

以上設定時,各檔案之間的關係如下圖所示:

完成後,可以通過單元測試,以測試是否可以正確的獲取到資料庫的連線:

    public class ConnectionTestCase {
    
        @Test
        public void getConnection() throws SQLException {
            AbstractApplicationContext ac
                = new ClassPathXmlApplicationContext(
                        "spring-dao.xml");
            
            DataSource dataSource = 
                    ac.getBean("dataSource", DataSource.class);
            
            System.out.println(dataSource.getConnection());
            
            ac.close();
        }
        
    }

#### 2.3. 建立實體類

每張資料表都應該有1個對應的實體類,所以,建立`cn.tedu.mybatis.entity.User`類,屬性的數量與型別請參考資料表的設計:

    public class User implements Serializable {

        private static final long serialVersionUID = 7323921614984096421L;
    
        private Integer id;
        private String username;
        private String password;
        private Integer age;
        private String phone;
        private String email;
        // SET/GET,toString()
    }

#### 2.4. 建立介面,宣告抽象方法

建立`cn.tedu.mybatis.mapper.UserMapper`介面,並在介面中宣告“插入使用者資料”的抽象方法:

    public interface UserMapper {
    
        Integer addnew(User user);
        
    }


關於抽象方法,在MyBatis中,執行的操作如果是增、刪、改,返回值均使用`Integer`,表示受影響的行數;方法的名稱可以自定義,只要不違反Java的命名規則即可,另外,不允許在介面中使用過載機制;引數也可以自定義,如果執行的是增加操作,引數應該是與資料表對應的實體類的型別。

#### 2.5. 設定介面所在的包

在MyBatis中,通過`MapperScannerConfigurer`類掃描持久層介面的,所以,應該在`spring-dao.xml`檔案中進行設定:

    <!-- MapperScannerConfigurer -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 設定介面檔案所在的包 -->
        <property name="basePackage"
            value="cn.tedu.mybatis.mapper" />
    </bean>

從FTP下載`somemapper.zip`壓縮包,得到`SomeMapper.xml`檔案。

在`src/main/resources`下建立名為`mappers`資料夾,然後將`SomeMapper.xml`重新命名為`UserMapper.xml`,並貼上到`mappers`資料夾下:

> 其實,這些XML檔案的名稱並不重要,可以自由命名,通常,推薦使用與介面檔案相同的名稱,便於管理。

然後,編寫`UserMapper.xml`檔案中的內容,首先,根節點必須是`<mapper>`,且根節點的`namespace`表示對應的介面檔案,然後,新增子節點,以對應介面中的抽象方法:

#### 2.7. 設定XML檔案的位置與資料來源

MyBatis通過`SqlSessionFactoryBean`獲取資料來源,並且掃描設定了SQL語句的XML檔案,最終由MyBatis框架來執行SQL語句,所以,需要在`spring-dao.xml`中設定`SqlSessionFactoryBean`:

    <!-- SqlSessionFactoryBean -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 資料來源,值為以上設定BasicDataSource節點的bean-id -->
        <property name="dataSource" 
            ref="dataSource" />
        <!-- XML檔案在哪裡 -->
        <property name="mapperLocations" 
            value="classpath:mappers/*.xml" />
    </bean>

#### 2.8. 單元測試

    public class UserMapperTestCase {
    
        AbstractApplicationContext ac;
        UserMapper mapper;
        
        @Before
        public void doBefore() {
            ac = new ClassPathXmlApplicationContext("spring-dao.xml");
            mapper = ac.getBean("userMapper", UserMapper.class);
        }
        
        @After
        public void doAfter() {
            ac.close();
        }
        
        @Test
        public void addnew() {
            User user = new User();
            user.setUsername("劉GB");
            user.setPassword("666");
            Integer rows = mapper.addnew(user);
            System.out.println("rows=" + rows);
        }
        
    }

### 3. 查詢資料

#### 3.1. 根據id查詢某個使用者的資訊

首先,在`UserMapper.java`介面中新增該功能對應的抽象方法:

User findById(Integer id);

> 查詢方法的返回可以根據所需要的型別來決定。

然後,在`UserMapper.xml`對映檔案中新增新的節點設定抽象方法對應的SQL語句:

    <select id="findById"
        resultType="cn.tedu.mybatis.entity.User">
        SELECT 
            id, username, 
            password, age, 
            phone, email
        FROM 
            t_user
        WHERE 
            id=#{id}
    <select>

> 執行查詢時,`<select>`節點中必須設定`resultType`屬性(或者是`resultMap`屬性)。

以上方法執行時,如果查詢到匹配的資料,則返回有效的User物件,如果沒有匹配的資料,則返回null。


IT145.com E-mail:sddin#qq.com