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指令碼。
參考: