MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis 。MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
-
框架:
應用的半成品
一個框架程序員可以配置的選擇/選項越多,認爲這款框架的可擴展性強。
面向SQL的一個框架 SQL程序員入參自動裝配返回值自動裝配
可重用的公共結構
按一定規則組織的一組組件
-
組件
Component
對數據和方法的簡單封裝
封裝了特定功能和屬性的一個對象
-
持久化,ORM
持久化是程序數據在瞬時狀態和持久狀態間轉換的過程
ORM:(Object Relational Mapping)對象關係映射
第一步創建核心配置文件
第二步創建數據庫表對應的實體類
第三步創建Mapper配置文件,再加入核心配置文件
第四步加載核心配置文件,創建SqlSessionFactory,使用工廠產生SqlSession
第五步使用MyBatis的各種方法完成增刪查改操作
所使用的jar包需要:
Idea創建maven工程慢的解決方案:
-DarchetypeCatalog=internal:
第一步:
創建項目,我的完整版如下:
大配置(mybatis-config.xml)裏面寫連接數據庫的字符串:
package cn.ljl.test; import cn.ljl.dao.DeptDao; import cn.ljl.entity.Dept; 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 java.io.IOException; import java.io.InputStream; import java.util.List; public class MyBatisTest01 { /*查詢所有*/ @Test public void testall() { String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList"); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } } /*按照id查詢姓名*/ @Test public void testgetMapper() { System.out.println("mapper"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); List<Dept> list = dao.getAllList(); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //02.帶條件查詢 resultMap的使用 @Test public void testGetOneDeptResultMap() { System.out.println("resultMap"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); Dept dept = dao.getDeptResultMapById(1); System.out.println(dept.getUname()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
第二步:
-
編寫MyBatis配置文件 mybatis-config.xml(以下是我的mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!--根節點--> <typeAliases> <package name="cn.ljl.entity" ></package> </typeAliases> <environments default="development"> <!--環境--> <environment id="development"> <transactionManager type="JDBC"/><!--事務管理機制:JDBC|Managed--> <dataSource type="POOLED"> <!--UNPooled,JNDI--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatiits"/> <property name="username" value="sa"/> <property name="password" value="ljl19980427"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/ljl/dao/DeptDao.xml"/> </mappers> </configuration>
-
創建實體類:(Dept)
public class Dept { private Integer uid; private String uname; (不要忘記屬性封裝get,set) }
-
創建SQL映射文件 DeptDao.xml
(我這裏是三個方法)(這個是小配置)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPEmapper PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.ljl.dao.DeptDao"> <!--resultMap--> <resultMap id="deptResultMap" type="Dept"> <id property="uid" column="uid"></id> <result property="uname" column="uname"></result> </resultMap> <!--查詢所有--> <select id="getAllList" resultType="Dept"> select * from userinfo </select> <!--按照id查詢姓名--> <select id="getDeptById" parameterType="int" resultType="Dept"> select * from userinfo where uid=#{uid} </select> <!--按照id查詢姓名 返回resultMap--> <select id="getDeptResultMapById" parameterType="int" resultMap="deptResultMap"> select * from userinfo where uid=#{uid} </select> </mapper>
-
書寫測試類
package cn.ljl.test; import cn.ljl.dao.DeptDao; import cn.ljl.entity.Dept; 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 java.io.IOException; import java.io.InputStream; import java.util.List; public class MyBatisTest01 { /*查詢所有*/ @Test public void testall() { String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
(SqlSessionFactoryBuilder與SqlSessionFactory沒有關係,但是要用到) SqlSession session = factory.openSession(); List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList"); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } } /*按照id查詢姓名*/ @Test public void testgetMapper() { System.out.println("mapper"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); List<Dept> list = dao.getAllList(); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //02.帶條件查詢 resultMap的使用 @Test public void testGetOneDeptResultMap() { System.out.println("resultMap"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); Dept dept = dao.getDeptResultMapById(1); System.out.println(dept.getUname()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
這裏需要注意一個知識點:
* 在MyBatis中執行事務的方式(執行完畢某個操作成功後以後不進行數據回滾)
* 第一種方式:直接在openSession方法中添加參數true,自動提交的方式
* 第二種方式:在完成整個邏輯操作後,添加代碼session.commit();,完成事務的手動提交
以上就是上課的時候的一個小例子,下面介紹MyBatis的其他:
1、 mybatis配置
SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。
2、 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠
3、 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。
4、 mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。
5、 Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。
6、 Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的Java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。
7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。
輸出映射(返回的結果集可以有哪些類型)
1)基本類型
2)pojo類型
3)List類型
動態sql:動態的拼接sql語句,因爲sql中where條件有可能多也有可能少
1)where:可以自動添加where關鍵字,還可以去掉第一個條件的and關鍵字
2)if:判斷傳入的參數是否爲空
3)foreach:循環遍歷傳入的集合參數
4)sql:封裝查詢條件,以達到重用的目的
對單個對象的映射關係:
1)自動關聯(偷懶的辦法):可以自定義一個大而全的pojo類,然後自動映射其實是根據數據庫總的字段名稱和
pojo中的屬性名稱對應.
2)手動關聯: 需要指定數據庫中表的字段名稱和java的pojo類中的屬性名稱的對應關係.
使用association標籤
對集合對象的映射關係
只能使用手動映射:指定表中字段名稱和pojo中屬性名稱的對應關係
使用collection標籤
spring和mybatis整合
整合後會話工廠都歸spring管理
1)原生Dao實現:
需要在spring配置文件中指定dao實現類
dao實現類需要繼承SqlSessionDaoSupport超類
在dao實現類中不要手動關閉會話,不要自己提交事務.
2)Mapper接口代理實現:
在spring配置文件中可以使用包掃描的方式,一次性的將所有mapper加載
逆向工程:自動生成Pojo類,還可以自動生成Mapper接口和映射文件
注意:生成的方式是追加而不是覆蓋,所以不可以重複生成,重複生成的文件有問題.
如果想重複生成將原來生成的文件刪除