1. 程式人生 > >MyBatis的原理及應用

MyBatis的原理及應用

sql 關系 str dma 事務管理器 space ransac 文件的 讀取

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&amp;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的原理及應用