1. 程式人生 > >Mybatis一之開發dao的方法詳述

Mybatis一之開發dao的方法詳述

mybatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀的持久層的框架,是apache下的頂級專案。mybatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。mybatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO對映成資料庫中的記錄。

其中,開發dao有兩種方法,一種原始的dao開發方法,程式設計師需要寫dao介面和dao實現類。另一種是mapper代理方法,程式設計師只需要寫mapper介面相當於dao介面。下面看看這兩種寫法。

先配置好mybatis的核心配置檔案:SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 資料庫連線池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!-- 載入對映檔案 -->
    <mappers>
       <!-- <mapper resource="me/gacl/mapping/userMapper.xml"/> --> 
    </mappers>

</configuration>

原始dao開發方法

寫法一

1.編寫dao介面(UserDao)

public interface UserDao {  
    // 根據id查詢使用者資訊  
    public User findUserById(int id) throws Exception;  
}  

2.編寫dao實現類

public class UserDaoImpl implements UserDao {  
  
    // 需要向dao實現類中注入SqlSessionFactory  
    // 這裡通過構造方法注入  
    private SqlSessionFactory sqlSessionFactory;  
  
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {  
        this.sqlSessionFactory = sqlSessionFactory;  
    }  
  
    @Override  
    public User findUserById(int id) throws Exception {  
        SqlSession sqlSession = sqlSessionFactory.openSession();  
          
        //這裡的test.findUserById是與下面的對映檔案user.xml中的namespace+id有關。  
        User user = sqlSession.selectOne("test.findUserById", id);  
  
        // 釋放資源  
        sqlSession.close();  
  
        return user;  
  
    }  
}  

3.編寫對映檔案(user.xml)

<mapper namespace="test">  
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
        SELECT * FROM USER WHERE id=#{value}  
    </select>  
</mapper>  

不管是哪種寫法,對映檔案都要新增到核心配置檔案SqlMapConfig.xml的mappers標籤內。

4.編寫測試類

public class Test {
	
	public static void main(String[] args) throws Exception {
		 // mybatis配置檔案  
        String resource = "SqlMapConfig.xml";  
        // 得到配置檔案流  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
  
        // 建立會話工廠,傳入mybatis的配置檔案資訊  
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
        // 建立UserDao的物件  
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);  
        // 呼叫UserDao的方法  
        User user = userDao.findUserById(1);  
        System.out.println(user);  
		
	}

}

測試結果:

User [id=1, name=孤傲蒼狼, age=27]

這種方式還有一種形式,就是把實現類的工作移到測試類裡面完成,dao和到實現都不需要,只需要一個對映檔案和測試類。

寫法二

1.編寫對映檔案(user.xml)

<mapper namespace="test">  
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
        SELECT * FROM USER WHERE id=#{value}  
    </select>  
</mapper>  

新增對映檔案到核心配置檔案SqlMapConfig.xml的mappers標籤內。

2.編寫測試類

public class Test {

    public static void main(String[] args) throws IOException {
        //mybatis的配置檔案
        String resource = "SqlMapConfig.xml";
        //使用類載入器載入mybatis的配置檔案(它也載入關聯的對映檔案)
        InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
        //構建sqlSession的工廠
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //建立能執行對映檔案中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
        String statement = "test.getUser";//對映sql的標識字串
        //執行查詢返回一個唯一user物件的sql
        User user = session.selectOne(statement, 1);
        System.out.println(user);
    }
}

測試結果:

User [id=1, name=孤傲蒼狼, age=27]

mapper代理方法

1.編寫mapper.java(UserMapper.java相當於java介面)

public interface UserMapper {  
    // 根據id查詢使用者資訊  
    public User findUserById(int id) throws Exception;  
}  

2.編寫mapper.xml(UserMapper.xml)

<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">  
  
    <!--通過id查詢使用者表的記錄 -->  
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
        SELECT * FROM USER WHERE id=#{value}  
    </select>  
  
</mapper>  

新增對映檔案到核心配置檔案SqlMapConfig.xml的mappers標籤內。

注意:

(1)在mapper.xml中namespace等於mapper介面地址

(2)mapper.java介面中的方法名和mapper.xml中statement的id一致

(3)mapper.java介面中的方法輸入引數型別和mapper.xml中statement的parameterType指定的型別一致。

(4)mapper.java介面中的方法返回值型別和mapper.xml中statement的resultType指定的型別一致。

3.編寫測試類

public class Test {
	
	public static void main(String[] args) throws Exception {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
		//建立UserMapper物件,mybatis自動生成mapper代理物件
        UserDao userDao =session.getMapper(UserDao.class);  
        User user=userDao.findUserById(1);
        System.out.println(user.toString());
        session.close();  
	}
}

測試結果:

User [id=1, name=孤傲蒼狼, age=27]

總結

通過以上各種寫法的形式可以看出,寫法的形式上可以有多種,但本質上的區別是在拿到session物件後採用何種執行SQL的方式。

其核心區別為:

SqlSession session = sqlSessionFactory.openSession();
		//建立UserMapper物件,mybatis自動生成mapper代理物件
        UserDao userDao =session.getMapper(UserDao.class);  
        User user=userDao.findUserById(1);

  SqlSession session = sessionFactory.openSession();
        String statement = "test.getUser";//對映sql的標識字串
        //執行查詢返回一個唯一user物件的sql
        User user = session.selectOne(statement, 1);

這兩種session執行SQL的區別。

第一種是通過代理的方式,執行dao介面中的方法時,會呼叫其對應的對映檔案中的同名sql指令碼。

第二種方式可用dao,也可以不用dao,其實質為session直接根據namespace呼叫對應的對映檔案中的sql指令碼。

 

參考:

https://www.cnblogs.com/UUUz/p/9022110.html