MyBatis基本工作原理

Application是程序员开发的Java代码,蓝色为MyBatis框架.

API是MyBatis提供的增删改查等功能接口.

老式SQL写法我们在Dao中写SQL: SELECT * FROM user WHERE user_name = ?;

而在MyBatis中没有完全封装JDBC,还需要预先写一下SQL语句,不过不用像之前那样大篇幅以及多设置了:(进行了简化)

看一下老式的Dao层写法: 通过用户ID查询用户返回用户实例:

///// * 通过用户ID查询用户实例返回给showUser
    public Customers queryCustomerByID(long cid) throws ClassNotFoundException, SQLException {
        Customers customer = null;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select * from Customers where customer_id = ?";
        try {
            conn = JDBCUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setLong(1, cid);
            rs = ps.executeQuery();
            while (rs.next()) {

                if (customer == null) {
                    customer = new Customers(
                            rs.getLong(1), 
                            rs.getString(2),
                            rs.getString(3),
                            rs.getString(4),
                            rs.getString(5),
                            rs.getLong(6),
                            rs.getDouble(7));
                }
            }
        } finally {
            JDBCUtil.close(rs, ps, null);
        }

        return customer;

    }/////* End queryCustomerByID

是不是很繁琐,尽管使用了有些日子,有些怀念,但是这样的冗余代码既然可以使用框架封装简化,为什么不用呢?

下面是在MyBatis中同样根据用户ID查用户返回用户实例: (customers.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="CustomersDao"> 
    <!-- CIns为CustomerInstance缩写,即用户实例 -->
    <select id="queryCInsByCid" parameterType="long" resultType="com.ykmimi.mybatis.entity.Customers">
        select * from Customers where customer_id = #{cid}
    </select>
</mapper>

mapper为映射,namespace是命名空间,当我们调用时就像调用某个Dao一样.

而select的 id 为 queryCInsByCid ,接收类型为long, 返回类型为Customers实例 (resultType指向了实体包中的Customers实体类)

假如这个程序里还有其他Dao层(老式写法),如: FoodsDao, PriceDao,那么只是将这些Dao类给转换了模式,变为了 namespace .这样的话好理解!

而命名空间mapper中包含的select或其他标签的 id ,即像是这个"Dao类中存在的一个方法" ,只不过简化了.

看图片知道,MyBatis进行了老式Dao层写法返回Customers实例的封装.而我们需要设置:

namespace (相当于Dao层名),

及内里功能标签的 id (相当于方法名),

parameterType (相当于方法参数类型设置) ,

resultType (相当于方法返回类型,只不过是全类名写法).

 那么这个SQL语句设置好后,程序运行,就会加载到JDBC,从而可以对数据库进行操作.

两个xml文件(看图),可以自定义名称,含有SQL语句的映射配置文件需在MyBatis配置文件中进行注册.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- <typeAliases> <package name="com.xm.bean"/> </typeAliases> <properties 
        resource=""></properties> -->
    <!-- 配置mybatis运行环境 -->

    <environments default="cybatis">
        <environment id="cybatis">
            <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
            <transactionManager type="JDBC" />
            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/ordersystem" />
                <property name="username" value="hr" />
                <property name="password" value="system" />
            </dataSource>
        </environment>

    </environments>

    <!-- 配置 mapper文件 -->
    <mappers>
        <mapper resource="com/ykmimi/mybatis/mapper/customers.xml" />
    </mappers>


</configuration>

最后,ORM表示Object, Relationship, Mapping

如图所示,

Application是Java程序代码,其中数据是对象类型

Relationship是关系型数据库/表

Mapping是框架的功能表示映射

那么,空口无凭,写一个小程序出来,看看MyBatis的作用吧!见下篇.

 

posted @ 2018-08-08 23:08  ukyo--BlackJesus  阅读(863)  评论(0编辑  收藏  举报