### 1. MYBATIS簡介 MYBATIS是持久層框架,大大的簡化了持久層開發。 當使用MYBATIS框架時,開發人員不必再編寫繁瑣的JDBC代碼,只需要定義好每個功能對應的抽象方法與需要執行的SQL語句即可! ### 2. 基本使用 #### 2.1. 添加依賴 需要在`pom.xml`中添 ...
### 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。