例項準備工作
為了便於理解,例項採用eclipse的普通工程加mysql作為講解。
其中資料庫用使用者作為演示的例項,在mysql資料庫中建立使用者表,其使用者結構及資料內容如下:
/*使用者表 */DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '使用者編號', `username` varchar(20) DEFAULT NULL COMMENT '使用者名稱', `password` varchar(20) DEFAULT NULL COMMENT '密碼', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;insert into `user`(`id`,`username`,`password`) values (1,'demo','123456');
在eclipse中建立一個java工程。目錄結構如下:
com.example.mybatis.config:用於存放mybatis的配置檔案
com.example.mybatis.entries:用於存放對應的使用者表對應的實體類
com.example.mybatis.mappers:用於存放mytabtis對應對映檔案
test:用於存放對應的測試用例
透過github下載mybatis,把裡面的mybatis-x.x.x.jar、log4j以及對應資料庫型別的驅動放到lib目錄下作為專案環境的依賴jar。
建立及配置MyBatis的資源配置檔案在com.example.mybatis.config建立一個名為mybatis-config.xml的檔案。檔案內容如下:
編寫配置檔案的測試用例,測試配置資訊是否正確。測試用例程式碼如下:
package com.example.mybatis.config;import static org.junit.Assert.*;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;public class MybatisConfigTest { @Test public void test() throws IOException { String resource = "com/example/mybatis/config/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); assertNotNull(sqlSessionFactory); }}
建立使用者的實體類在com.example.mybatis.entries目錄下建立使用者實體類檔案:User.java。
package com.example.mybatis.entries;/** * 使用者實體類 * @author root * */public class User { private Long id; private String username; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + "]"; }}
建立針對使用者表實現的對映介面類在com.example.mybatis.mappers目錄下建立一個介面類UserMapper.java的檔案。
package com.example.mybatis.mappers;import com.example.mybatis.entries.User;/** * User 介面類 * */public interface UserMapper { /** * 根據使用者編號獲取使用者詳情 * @param id * @return */ public User selectById(Long id);}
在com.example.mybatis.mappers目錄下建立一個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.mybatis.mappers.UserMapper"> <select id="selectById" resultType="com.example.mybatis.entries.User"> select * from user where id = #{id} </select></mapper>
注意:namespace一定要是上面介面類的路徑,其中select的屬性id一定是介面中方法的名稱。
把建立的user.xml新增到mybatis配置檔案的對映器中,即加入<mappers></mappers>中。
測試用例程式碼:
package com.example.mybatis;import static org.junit.Assert.*;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import com.example.mybatis.entries.User;import com.example.mybatis.mappers.UserMapper;public class GetUserInfoByIdInterfaceTest { @Test public void test() { String resource = "com/example/mybatis/config/mybatis-config.xml"; SqlSession sqlSession=null; try { InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession=sqlSessionFactory.openSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user= userMapper.selectById(1l); System.out.println(user.toString()); assertNotNull(user); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { sqlSession.close(); } }}
測試結果:
測試結果資料
總結mybatis之所以配置介面以後就能執行,因為在生產mapper的時候生成了一個代理,然後透過mapper呼叫介面方法的時候直接被MapperProxy的invoke截斷了,直接去呼叫了mybatis為我們制定的實現。