mybatis微讲

1.mybatis的简介
主要介绍mybati是什么,可以干什么,有什么优缺点:
①MyBatis 是一款’持久层框架’,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
②一般情况下,可以将MyBatis分为三层,第一层也就是接口层,可以提供外部使用的借口APL,开发人员可以通过本地apl来操作数据库,这样就可以很好的接收到调用请求,并且会调用数据处理层来完成具体的数据处理,可以有效的完成数据处理的工作。
第二层也就是数据处理层,它主要的功能负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。也是在第一层发出调用请求之后,会根据详细的请求数据完成一次数据操作。
第三层是基础支撑层,可以负责最基础的功能支撑,其中包括连接管理、事务管理、配置加载以及缓存处理,以上东西都是可以共用的,作为基础的组件,为上一层的数据处理提供支撑。
③缺点:1.编写SQL语句时工作量很大,尤其是字段多、关联表多时。
2.SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
3.二级缓存机制不佳
4.框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

2.开始创建项目
简单的项目只需要两个jar包即可
这里写图片描述
1.先配置xml文件
mybatis-config.xml,这里包含了对mybatis的核心配置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)

<?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">
  <!-- 注意头部信息  是config.dtd -->
  <configuration>
      <environments default="development">
          <environment id="development">
              <transactionManager type="JDBC"></transactionManager><!-- type="Managered" -->
              <dataSource type="POOLED">
                  <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                  <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
                  <property name="username" value="scott"/>
                  <property name="password" value="tiger"/>

              </dataSource>
          </environment>
      </environments>
      <!--这里稍后介绍-->
      <mappers>
          <!--直接映射到相应的mapper文件-->
          <mapper resource="com/aaa/mybatis/dao/mapper/mapper.xml"/>
          <!--扫描包路径下所有xxMapper.xml文件-->
          <package name="com.aaa.mybatis.dao.mapper"/>
      </mappers>
  </configuration>
这里对`<transactionManager type="JDBC"></transactionManager><!-- type="Managered" -->`简单解释一下。

JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
Managered:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false.

2.开始mybatis的中心
①每个基于 MyBatis 的应用都是以一个 SqlSessionFactory的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
②这里采用静态单例模式

public class SqlSessionFactoryUtil {

    //加入私有构造,保证该类在其他地方不能实例化
    private SqlSessionFactoryUtil(){};

    private static SqlSessionFactory sqlSessionFactory; 
    //静态块,在类的加载的时候,只执行一次
    static{
        Reader reader=null;
         try {
             //读取主配置文件到字符流里面
             reader = Resources.getResourceAsReader("mybatis-config.xml");
            //利用字符流里面的配置,再利用mybatis提供的SqlSessionFactoryBuilder(工厂建造类) 创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }finally{
            if(reader!=null){
                try {
                //关闭字符流
                    reader.close();
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }
    }
    //提供一个创建SqlSession的方法供外部调用
    public static SqlSession openSqlSession(){
        //利用前面创建工厂类,去获取SqlSession
        return sqlSessionFactory.openSession();
    }
}

③根据官网内容对个别类和接口进行介绍
1.SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。

2.SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

3.SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理作用域中,比如 Servlet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭

3.创建实体和接口
1.这里的实体里面的属性名最好要对应数据库中的列名,不过列名是这种形式(dName)时,最好改一下,可以改成这样deptName,因为dName加上getter和setter方法是,会获取不到值。
这里写图片描述这里写图片描述
错误的这里写图片描述
接下来是dao接口
这里写图片描述

4.设置mapper,映射SQL语句
在上述的内容都设置完之后,开始设置与dao相对应的mapper(我觉得这句话我说的不怎么对,专业术语怎么说来着?)
注意:此时的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.aaa.mybatis.dao.DeptDao">
      <select id="getList" resultType="com.aaa.mybatis.entity.Dept">
          select deptNo,dname deptName,loc from dept
      </select>
    </mapper>

这里写图片描述
这里写完之后就要在主配置文件mybatis-config.xml中进行配置了,代码在最上面。
5.编写测试类
SqlSessionFactory中获取 SqlSessionSqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法,通过 SqlSession 实例来直接执行已映射的 SQL 语句

@Test
public void test(){
    @Test
    public void test(){
        SqlSession openSqlSession = SqlSessionFactoryUtil.openSqlSession();
        try {
            DeptDao depeDao = openSqlSession.getMapper(DeptDao.class);
            List<Dept> deptlist = depeDao.getList();
            if(deptlist!=null && deptlist.size()>0){
                for(Dept dept : deptlist){
                    System.out.println(dept.getDeptName()+","+dept.getDeptNo());
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //不要忘了关闭,且必须在finally中关闭
            openSqlSession.close();
        }
    }
}

6.mybaits运行原理图
图一引用自:http://www.cnblogs.com/luoxn28/p/6417892.html
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值