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&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);
    }    

 

posted @ 2017-11-16 20:27  莫添杰  阅读(315)  评论(0编辑  收藏  举报