MyBatis简介

MyBatis(一)
首篇介绍JDBC、Hibernate、MyBatis三种访问数据库的方法和优缺点
JDBC:
所有的java程序都是通过JDBC连接数据库通过SQL对数据库编程的。JDBC是SUN公司提出的一系列接口规范,具体实现由各个数据库厂商实现,
(所以我们得在自己的程序中根据不同的数据库引入不同的驱动jar包)。传统的JDBC编程,为我们实现了连接数据库的功能,但是工作量大、代码复杂,于是ORM框架孕育而生。
不过所有ORM框架都是基于JDBC进行封装的,只是它们的封装强度不同。

--使用SQL Server 2008 建如下表
CREATE TABLE [dbo].[T_RESOURCE](
    [RESOURCE_ID] [varchar](50) NULL,
    [RESOURCE] [varchar](50) NULL
) ON [PRIMARY]

GO

我们先看一段纯原生的JDBC获取单据主表的实现代码

package com.mybatis01.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainTest {
    /**
     * 取得Connection
     * @return
     * @author kang
     */
    private Connection getConnection(){
        
        Connection conn = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=mybatis";
            String user = "sa";
            String password = "1";
            conn = DriverManager.getConnection(url, user, password);
            
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    
    
    public List<Map<String,Object>> getResourceList(){
        List<Map<String,Object>> resultListMap = new ArrayList<Map<String,Object>>();
        StringBuffer whereSQL = new StringBuffer();
        Map<String,Object> map = null;
        whereSQL.append("where 1=1 ");
        
        StringBuffer querySQL = new StringBuffer();
        querySQL.append("select top 10 * from T_RESOURCE ");
        querySQL.append(whereSQL);
        
        Connection conn = this.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        
        try {
            ps = conn.prepareStatement(querySQL.toString());
            rs = ps.executeQuery();
            while(rs.next()){
                map = new HashMap<String, Object>();
                String resource_id = rs.getString("resource_id");
                String resource = rs.getString("resource");
                map.put("resource_id", resource_id);
                map.put("resource", resource);
                resultListMap.add(map);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
        
            try {
                ps.close();
                rs.close();
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
        
        
        return resultListMap;
        
    }
    public static void main(String[] args) {
        
        MainTest test = new MainTest();
        List<Map<String,Object>> listMap = test.getResourceList();
        for(Map<String,Object> map:listMap){
            System.out.println(map.get("resource_id")+"---------"+map.get("resource"));
        }
    }
}
大致步骤如下:
1、使用JDBC获取Connection
2、打开Statement对象
3、Statement执行SQL返回结构ResultSet对象
4、根据ResultSet对象获得目标数据
5、关闭ResultSet、Statement、Connection

代码量略多,不建议使用JDBC的方式;不过笔者在很多小型项目中也有使用经过简易封装的JDBC的方式做开发,主要原因是其开发难度小,调试方便,新手接手快。
但是在中大型项目中我们很少使用JDBC进行编程,一般情况下会使用ORM框架,ORM(Object Relational Mapping)简单的说就是数据库的表和简单java对象的映射关系模型,
主要解决数据库数据和POJO对象的相互映射,通过这个映射可以简单迅速的将数据库的数据转化为JAVA的POJO对象。

Hibernate:

论ORM框架,那Hibernate无疑是必须要谈的。Hibernate是建立在POJO通过XML映射文件(或注释)提供的规则映射到数据库表上的,它提供的是一种全表映射的模型。
Hibernate对JDBC的封装程度比较高,基本无需编写SQL语言使用简单的HQL就可以了。


1、首先我们提供hbm.xml文件,制定映射规则,描述POJO和数据库的映射关系,hibernate通过映射配置文件可以把数据库的数据映射到POJO上,通过POJO操作数据库记录
<?xml version="1.0"?>
???? <!DOCTYPE hibernate-mapping PUBLIC
??????? "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">?
???? <!-- 映射文件开始 -->???
<hibernate-mapping>
    ??<class name="com.mybatis01.hibernate.ResourceBean" table="T_RESOURCE">?
        ???? <id name="resource_id"  type="string">
                <column name="resource_id">
        ????     <generator class="native" />
        ???? </id>
        ???? <property name="resource" type="string" column="resource" ?not-null="true" length="50">??
        ???? </property>
    ?</class>
</hibernate-mapping>

2、配置Hibernate的配置信息,hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
        <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=mybatis</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password">1</property>>
        <mapping resource="resource.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
3、建立Hibernate的工厂对象(SessionFactory),用它来做全局对象,生产Session对象
public class HibernateUtil {

    private static final SessionFactory  sessionFactory;
    static{
        
        Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
        sessionFactory = cfg.buildSessionFactory();
    }
    public static SessionFactory getSessionFactory(){
        
        return sessionFactory;
    }
}
4、测试
public static void main(String[] args) {
    Session session = null;
    session = HibernateUtil.getSessionFactory().openSession();
    ResourceBean rb = (ResourceBean)session.get(ResourceBean.class, 1);
    System.out.println(rb.getResource()+"++++++"+rb.getResource_id());
}

Hibernate的优点如下:
1、消除JDBC带来的大量代码,提高编程简易性和可读性
2、提供级联、缓存、映射、一对多等功能
Hibernate的缺点如下:
1、全表映射带来的不便,比如更新的时候要发送所有的字段
2、对多表关联和复杂的SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装成POJO
3、不能有效的支持存储过程
4、无法对SQL做优化

MyBatis

为了弥补Hibernate的不足,一个半自动映射的框架MyBatis应运而生,因为需要手工匹提供的POJO、SQL和映射关系所以叫半自动。
MyBatis的前身是Apache的一个开源框架ibatis,后迁移到google code更名为MyBatis,再后迁移到Github,目前由github维护。
0、建立POJO对象
public class Resource {
    private String resource_id;
    private String resource;
        //省略get、set
}
1、Mybatis的基础配置 mybatis_config.xml
<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
                <property name="url" value="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=mybatis" />
                <property name="username" value="sa" />
                <property name="password" value="1" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="resource.xml"/>
    </mappers>
</configuration>
2、resource.xml对象映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ServiceImpl.ResourceMapper">
    <select id="getResource" parameterType="int" resultType="com.bean.Resource">
    select * from T_RESOURCE where resource_id=#{id}
    </select>
</mapper>
SQL的列名和POJO的属性名保持一致,这时MyBatis会自动提供映射规则
3、ResourceMapper.java,建立SqlSessionFactory
public interface ResourceMapper {

    public  Resource getResource(int id);    
}
4、MyBatisUtil
public class MyBatisUtil {

    
    private static SqlSessionFactory sqlSessionFactory = null;
    public static SqlSessionFactory getSqlSessionFactory(){
        
        InputStream inputStream = null;
        if(sqlSessionFactory==null){
            String resource = "mybatis_config.xml";
            try {
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return sqlSessionFactory;
    }
}
5、Test
    public static void main(String[] args) {
        SqlSessionFactory sessionFactory = MyBatisUtil.getSqlSessionFactory();
        SqlSession session = sessionFactory.openSession();
        ResourceMapper resourceMap = session.getMapper(ResourceMapper.class);
        Resource resource = resourceMap.getResource(1);
        System.out.println(resource);
    }
    
以上我们队JDBC和、Hibernate、MyBatis都作了一个的介绍,那在什么情况下选择这些ORM策略呢。目前纯粹的JDBC极少用到生产的项目中去,
Hibernate作为主流的ORM框架,确实编辑简单但是其自身的限制也很明显,Hibernate只适用于场景不太复杂,要求性能不太苛刻的时候使用。
如果我们要求一个灵活的、可以动态生成映射关系的框架,就选择MyBatis,它几乎代替了JDBC    ,工作量比hibernate略大。
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值