mybatis是一個持久層框架,其主要思想就是想將程序中大量的SQL語句剝離出來,配置在配置文件中,實現SQL的靈活配置.
使得SQL與程序代碼分離,即在不修改程序代碼的情況下,直接在配置文件中修改SQL.
mybatis的搭建步驟
下載jar包並部署包
mybatisjar下載網址:https://github.com/mybatis/mybatis-3/releases,mybatis壓縮包解壓后結構目錄如下
此外lib目錄下存放着編譯依賴包如下
最后只需把jar包放入項目的此lib 目錄下即可
或者選中項目右鍵 build path
進入此窗口
單擊第二個按鈕直接從本地進行添加jar,亦或者按下按鈕從此工作空間的項目中選擇jar進行添加
編寫mybatis核心配置文件
在此之前需要調整下xml的代碼提示(引入dtd文件)
請先看第6點
- 選擇window → preferences
- 搜索xml → xml catalog出現如下窗口
-
add → file system 選擇你所需要的文件dtd
這兩個文件都是經常使用的所以都添加進去
-
key 需要與配置文件中的
此部分相同
所以key是 -//mybatis.org//DTD Config 3.0//EN,那么dtd文件到哪里找呢?
- 所需的dtd文件都在mybatis解壓后的 mybatis-3.4.4\org\apache\ibatis\builder\xml 下面如圖
創建核心配置文件
- 找到如下窗口 → next
- 選擇第一個 → next
-
選擇第二個 → 選擇config → next→finish即可
- 此時創建好的xml文件便會自動生成如下代碼
編寫核心配置文件
話不多說直接上代碼
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 引入database.propeerties --> 7 <properties resource="database.properties"/> 8 <!-- 配置mybatis的log實現log4j --> 9 <settings> 10 <setting name="logImpl" value="LOG4J"/> 11 </settings> 12 <typeAliases> 13 <package name="cn.smbms.pojo"/> 14 </typeAliases> 15 <!-- 配置mybatis多套運行環境 --> 16 <environments default="development"> 17 <environment id="development"> 18 <!-- 配置事物管理,采用jdbc的事物管理 --> 19 <transactionManager type="JDBC"/> 20 <!-- POOLED:mybatis自帶的數據源,jndi:基於Tomcat的數據源 --> 21 <dataSource type="POOLED"> 22 <property name="driver" value="${driver}"/> 23 <property name="url" value="${url}"/> 24 <property name="username" value="${user}"/> 25 <property name="password" value="${pwd}"/> 26 </dataSource> 27 </environment> 28 </environments> 29 <!-- 將mapper文件加入到配置文件中 --> 30 <mappers> 31 <mapper resource="cn/smbms/dao/UserMapper.xml"/> 32 </mappers> 33 </configuration>
屬性 | 作用 |
configuration | 配置文件的根元素節點 |
propertes | 通過resource屬性從外表知道properties屬性文件,該屬性文件描述數據庫的相關配置 |
settings | 設置mybatis運行中的一些行為,比如此處設置mybatis的log日志實現為LOG4J,即使用log4j實現日志功能 |
environments | 表示配置mybatis的多套運行環境,將SQL映射到多個不同的數據庫上,元素節點中可配置多個,但必須指定默認運行環境 |
environment | 配置mybatis的一套運行環境,需指定運行環境id,事務管理,數據源配置等相關信息 |
mappers | 作用是告訴mybatis去哪里找SQL映射文件(該內容是開發者定義的映射SQL語句),整個項目可以有1個或多個 |
mapper | mappers的子元素節點,具體知道SQL映射文件的路徑,其中resource屬性表SQL映射文件的路徑 |
創建實體類並為其創建DAO接口
結構如下
創建sql映射文件
代碼如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="cn.smbms.dao.UserMapper"> 6 <!-- 查詢用戶表記錄數 --> 7 <select id="count" resultType="int"> 8 select count(1) as count from smbms_user 9 </select> 10 <!-- 查詢用戶列表 --> 11 <select id="getUserList" resultType="User"> 12 select * from smbms_user 13 </select> 14 </mapper>
- mapper:映射文件的根元素節點,只有一個屬性namespace
- namespace:用於區分不同的mapper,全局唯一.
- select:表示查詢語句,是mybatis最常用的元素之一,常用屬性如下
- id屬性:改命名空間下唯一標識符
- resultType屬性:表示SQL語句返回值類型,第一個select返回的是int,后者則是user類型
編寫測試類運行
工具類代碼如下
1 package cn.smbms.utils; 2 3 import java.io.InputStream; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 public class MyBatisUtil { 11 private static SqlSessionFactory factory; 12 static { 13 try { 14 //獲取mybatis-config.xml文件的輸出流 15 InputStream is=Resources.getResourceAsStream("mybatis-config.xml"); 16 factory=new SqlSessionFactoryBuilder().build(is); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 } 21 22 public static SqlSession createSqlSession() { 23 return factory.openSession(false); //默認true自帶提交事務 24 } 25 public static void closeSqlSession(SqlSession sqlSession) { 26 if(null!=sqlSession) { 27 sqlSession.close(); 28 } 29 } 30 }
測試類代碼方法一 基於mapper接口方式操作如下
public static void main(String[] args) { Logger logger = Logger.getLogger(Test.class); SqlSession sqlSession =null; List<User> userList = new ArrayList<>(); try { sqlSession = MyBatisUtil.createSqlSession(); userList = sqlSession.getMapper(UserMapper.class).getUserList(); for (User user : userList) { logger.debug("testGetUserList UserCode:"+user.getUserCode()+"and userName:"+user.getUserName()); } } catch (Exception e) { e.printStackTrace(); }finally { MyBatisUtil.closeSqlSession(sqlSession); } }
基於mapper接口方式操作此接口必須對應select映射SQL語句中的id對應
測試類代碼方法二 運行映射SQL語句
public static void main(String[] args) { Logger logger = Logger.getLogger(Test.class); SqlSession sqlSession =null; List<User> userList = new ArrayList<>(); try { sqlSession = MyBatisUtil.createSqlSession(); //直接運行已映射的SQL語句 userList = sqlSession.selectList("cn.smbms.dao.UserMapper.getUserList"); for (User user : userList) { logger.debug("testGetUserList UserCode:"+user.getUserCode()+"and userName:"+user.getUserName()); } } catch (Exception e) { e.printStackTrace(); logger.error(e); }finally { MyBatisUtil.closeSqlSession(sqlSession); } }
在使用SQLsession實例執行已映射的語句,沒有與id所對應的方法也不會出錯,即使UserMpper這個接口沒有也不會影響運行結果.