MyBatis的原理及應用
MyBatis是一個基於Java的持久層ORM關系映射框架,是一種支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。它避免了幾乎所有的 JDBC 代碼和手工設置參數以及抽取結果集。
MyBatis 使用簡單的 XML 或註解來配置和映射基本體,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
MyBatis原理
1.MyBatis應用程序Configuration對象根據XML配置文件或註解創建SqlSessionFactory工廠,獲取一個SqlSession,加載SQL配置信息,生成一個個MappedStatement對象(包括傳入參數映射配置、執行的sql語句、結果映射配置),並存儲在內存中。
2.SQL解析,SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession實例直接運行映射的sql語句
3.SQL執行,完成對數據的增刪改查,得到數據庫操作結果
4.結果映射將操作結果按照映射配置進行轉換,轉換成HashMap、JavaBean等
5.事務提交,用完之後關閉SqlSession,返回結果。
MyBatis應用
1.引入環境
mybatis-3.4.1.jar
mysql.connector-java-5.1.35-bin.jar
2. 設置主配置文件
a.設置別名 (兩種方法二選一)
<typeAliases> // 設置某一實體類的別名<typeAlias type="com.motianjie.entity.Dept" alias="Dept"/> // 設置某個包中的類都支持別名,該包下的類 <package name="com.motianjie.entity"/> </typeAliases>
b.設置數據庫數據源環境 可以多個(default表示默認使用的是哪個環境)
<environments default="mysqlEnvironment"> // id: 設置當前環境的身份id <environment id="mysqlEnvironment"> //transactionManager: 設置事務管理器 type:設置用哪個事務管理器 JDBC是使用默認的事務管理自動提交 <transactionManager type="JDBC"></transactionManager> // 數據源配置 //type:設置數據源類型 POOLED表示使用連接池策略 <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/utf8?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123123"/> </dataSource> </environment> </environments>
c.配置映射配置文件
<mappers> //resource: 當前服務器下的文件路徑 <mapper resource="com/motianjie/dao/deptMapper.xml"/> </mappers>
3.配置dao層的映射配置文件(deptMapper.xml)
1.提供了sql映射配置信息,通過該配置來實現數據庫表和實體類之間的映射關系
2.mapper 是整個sql映射配置文件的根元素
3.namespace: 設置命名空間 與當前項目的模塊中的dao接口全限定名對應
<mapper namespace="com.chinasofti.etc.dao.DeptMapper"> //根據id查詢部門信息 //select 設置查詢的SQL id:該sql的標記,是一個唯一標識 //sql 文件是直接寫在當前映射文件中的 //resultType 返回值類型 需要填寫全限定名或者是別名 //parameterType 參數類型,個數唯一 可以是全限定名,也可以是mybatis提供的簡寫類型 //#{deptno} 是mybatis的表達式 #{}是占位符 deptno是傳入的參數,單一個參數,mybatis會自動傳遞過來賦值 <select id="findDept" resultType="com.chinasofti.etc.entity.Dept" parameterType="java.lang.Integer"> select deptno,dname,loc from dept where deptno = #{deptno} </select> //insert 用於插入sql操作 //當執行該sql,mybatis會根據從當前傳入的對象 <insert id="saveDept" parameterType="Dept"> insert into dept values(#{deptno},#{dname},#{loc}) </insert> <update id="updateDept" parameterType="Dept"> update Dept set dname = #{dname} where deptno = #{deptno} </update> <delete id="deleteDept" parameterType="integer"> delete from dept where deptno = #{deptno} </delete> <select id="findAll" resultType="Dept"> select deptno,dname,loc from dept </select> // 查詢一張表中的部分字段信息 或多表查詢 通過返回map來實現 <select id="findMap" resultType="java.util.HashMap"> select dname,loc from dept </select> </mapper>
4.工具類
private static SqlSessionFactory sqlSessionFactory; static{ try { //通過mybatis的api讀取主配置文件 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); //創建造 SqlSessionFactory 工廠的對象 SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder(); //創建工廠 sqlSessionFactory = sessionFactoryBuilder.build(reader); } catch (IOException e) { e.printStackTrace(); } } //生產sqlSession sqlSession類與jdbc的Connection類似 public static SqlSession openSqlSession(){ return sqlSessionFactory.openSession(); }
5.測試
SqlSession session; DeptMapper deptMapper; @Before public void test() { session = MybatisUtil.openSqlSession(); //動態代理實現類 deptMapper = session.getMapper(DeptMapper.class); } @After public void after(){ session.commit(); session.close(); } @Test public void testFindDept(){ //該代理類實現了DeptMapper裏面的方法 System.out.println(deptMapper.getClass().getName()); Dept dept = deptMapper.findDept(10); System.out.println(dept); }
MyBatis的原理及應用