Mybatis入門程式,mybatis入門
作為一個java的學習者,我相信JDBC是大家最早接觸也是入門層級的資料庫連接方式,所以我們先來回憶一下JDBC作為一種用於執行SQL語句的Java API是如何工作的。下面的一段代碼就是最基本的JDBC開發流程。
在上代碼之前要先匯入JDBC的jar包,由於我用的資料庫是mysql,所以要先導
入如下的jar包
接下來的就是載入資料庫驅動,擷取資料庫連結之類的工作了,當然了這些工作都是通過代碼來完成的。為了和接下的mybatis設定檔對比,我在這裡採用的預先處理的方式進行查詢,代碼如下:
public class Testjdbc { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 載入資料庫驅動 Class.forName("com.mysql.jdbc.Driver"); // 通過驅動管理類擷取資料庫連結 connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456"); // 定義sql語句 ?表示預留位置 String sql = "select * from user where username = ?"; // 擷取預先處理statement preparedStatement = (PreparedStatement) connection.prepareStatement(sql); // 設定參數,第一個參數為sql語句中參數的序號(從1開始),第二個參數為設定的參數值 preparedStatement.setString(1, "王五"); // 向資料庫發出sql執行查詢,查詢出結果集 resultSet = preparedStatement.executeQuery(); // 遍曆查詢結果集 while (resultSet.next()) { System.out.println(resultSet.getString("id") + " " + resultSet.getString("username")); } } catch (Exception e) { e.printStackTrace(); } finally { // 釋放資源 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
然後用過JDBC的人也都知道它有這樣那樣的缺點,總結下來有以下幾點:
解決方案:使用資料庫連接池管理資料庫
解決方案:將sql語句配置到xml設定檔中,這樣即使sql變化,也不需要對java代碼重新編譯
解決方案:同樣可以將佔位符和參數配置在xml檔案中
解決方案:將查詢的結果集自動對應為java對象
說完了JDBC,大家也都看到了JDBC的種種不便,於是Hibernate、Mybatis等等的對象關係映射架構便應運而生,而名義上雖說都是ORM架構,Hibernate和Mybatis在細枝末節上還是有很大不同的,但是本文是探討Mybatis架構。
首先Mybatis是什嗎?
Mybatis架構:
接下來用mybatis寫一個入門程式
首先講一下我們的需求,在我的資料庫裡有一張使用者的表,表結構如下
我現在要做的是根據使用者的id(主鍵)查詢使用者資訊
在開始擼代碼之前,先要搭好環境
eclipse本人採用的是java EE的版本,然後可以去https://github.com/mybatis/mybatis-3/releases該網站下載mybatis的jar包匯入到工程裡面去
再然後就是就是上面已經提到了的mysql的驅動包
除了上面架構圖所提到的sqlMapConfig.xml設定檔外,還需要一個包來存對應檔(對應檔是什麼後面會提到),即sqlMap。
最後建立log4j.properties檔案方便查看日誌
所以整個項目的架構如下
為方便查閱,這裡直接貼出整個項目代碼
首先是log4j.properties檔案
# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
然後是SqlMapconfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 和spring整合後 environments配置將廢除 --> <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></configuration>
這串設定檔無非是配置交易管理和資料庫連接池,每個ORM架構都是必備的所以不深究
緊接著就是我們的重頭戲對應檔了
對應檔命名:
User.xml, 而在mapper代理開發對應檔名稱叫xxxMapper.xml, 比如:UserMapper.xml
而我們在對應檔裡要乾的活就是配置sql語句,最直觀的對比就是hibernate直接在對應檔中將java對象映射為關係(即資料庫中的表),而在mybatis中細化了這種映射關係,具體了輸入映射和輸出映射
先把具體對應檔貼上來,然後一一解釋
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="test"> <select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User"> select * from user where id=#{id}; </select></mapper>
有一下幾點申明:
注意:使用mapper代理方法開發,namespace有特殊作用
User類如下:
之後就是將對應檔載入到全域設定檔SqlMapConfig檔案中去
就是在該檔案加上一句
<mappers>
<mapper resource="sqlMap/User.xml"/>
</mappers>
到這裡整個設定檔就完成了,接下來的工作就是編寫程式來測試了
按照之前的架構一步一步來,最後寫成的程式如下:
public class MybatisTest { @Test public void findUserByIdTest() throws IOException{ InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); User user=sqlSession.selectOne("test.findUserById",1); System.out.println(user); }}
在這裡值得注意的地方有兩個,第一個是輸入資料流(inputStream)來源於mybatis設定檔
第二個地方是是selectOne方法裡的兩個參數:
第一個參數:對應檔中statement的id,在這裡則要寫成 namespace+’.’+statement的id
第二個參數:指定和對應檔中所匹配的parameterType類型的參數
結果如下:
寫到這裡,Mybatis從設定檔到測試代碼整個Mybatis入門程式已經寫完了,請期待本人接下來的更新