mybatis


Mybatis

三层架构

  1. 持久层 主要完成与数据库相关的操作,对数据库进行增删改查
  2. 业务层 主要根据功能需求完成业务逻辑的定义和实现
  3. 表现层 主要完成于最终软件使用用户交互,需要有交互界面

三层架构之间调用关系:表现层调用业务层,业务层调用持久层

原始jdbc操作

public void testJDBC() throw ClassNotFoundException,SQLException{
    Class.forName("com.mysql.jdbc.Driver");
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","user","root");
    String sql = "select id, username from db";
    PreparedStatement  statement = connection.prepareStatement(sql);
    ResultSet resultSet = statement.executeQuery();
    while(resultSet.next())
    {
        User user = new User();
        user.setId(resultSet.getInt("id"));
        ...
    }
    resultSet.close();
    statement.close();
    connection.close();
}

原始jdbc 操作分析

  1. 数据库连接创建,释放频繁造成系统资源浪费从而影响系统性能
  2. sql语句在代码中硬编码,造成代码不易维护
  3. 查询操作时,需要手动将结果集中的数据手动封装到实体中。

解决方案

  1. 使用数据库连接池初始化连接资源
  2. 将sql语句抽取到xml配置文件中
  3. 使用反射,内审等底层技术,自动将实体和表进行属性和字段的自动映射

Mybatis

基于ORM的半自动轻量级持久层框架,对jdbc 进行封装,半自动意味着需要手动编写sql,

ORM

ORM Object Relational Mapping 对象关系映射 O:对象模型:实体对象 R:关系型数据库的结构模型:数据库表 M:映射:将实体对象与数据库表建立映射关系

怎么将实体对象和数据库表建立映射关系

通过借助XML或者注解来完成映射关系的建立,一个实体对应一张数据库表,一个对象对应数据库表的一个记录

注意事项

  • 插入语句使用insert 标签
  • 在映射文件中使用parameterType 属性指定要插入的数据类型
  • sql语句中使用#{实体属性名}方式引用实体中属性值
  • 插入操作使用的API是sqlSession.insert("命名空间.id",实体对象);
  • 修改使用的API是sqlSession.update("命名空间.id",实体对象);

  • 插入操作设计数据库数据变化,所以使用sqlSession对象显示的提交事务,sqlSession.commit()

MyBatis 常用配置解析

  1. environments 标签,数据库环境的配置,支持多环境配置 其中,事务管理器(transactionManager)类型有两种 JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域 MANAGED: 这个配置几乎没做什么,它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期 例如:mybatis 与 spring 整合后,事务交给spring 容器管理
  2. 其中数据源(dataSource)常用类型有三种: UNPOOLED: 这个数据源的实现只是每次被请求时打开和关闭连接 POOLED: 这种数据源的实现利用池的概念将JDBC连接对象组织起来 JNDI: 这个数据源是为了能在如ELB 或应用服务器这类容器中使用,容器可以集中或外部配置数据源,然后放置一个JNDI上下文的数据源引用。

properties 标签

实际开发中,习惯将数据源的配置信息单独写在properties 文件,可以加载额外配置的properties;

typeAliases标签

类别别名是为java 类型设置一个短的名字 为了简化映射文件java类型设置,mybatis框架为我们设置好的一些常用的类型的别名 string->String,long->Long,int->Integer,double->Double,boolean->Boolean 或者

mappers

该标签的作用时加载映射的,加载方式有以下集中 1. 使用相对于类路径的资源引用 2. 使用完全限定资源定位符(URL) 3. 使用映射器接口实现类的完全限定名 4. 将包内的映射器接口实现全部注册为映射器,

Mybatis API 概述

sqlSession 工厂构建器 SqlSessionFactoryBuilder

常用API SqlSessionFactory build(InputStream inputStream) 通过加载mybatis 核心文件输入流的形式构建一个SqlSessionFactory对象

    String resourec= "/path/config.xml";
    InputStream input = Resources.getResourceAsStream(resource);
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder().build(input);

sqlSession 工厂对象SqlSessionFactory

SqlSessionFactory 有多个方法创建sqlSession 实例,常用有两个 1. openSession(),默认开启一个事务,但事务不会自动提交,需要手动提交 2. openSession(boolean autoCommit) 参数为是否自动提交,如果设置为true,那么不需要手动提交事务

sqlSession 会话对象

功能:执行语句,提交或回滚和获取映射器实例的方法

    <T> T selectOne(String statement,Object parameter)
    <E> List<E> selectList(String statement,Object parameter)
    int insert(String statement,Object parameter)
    int update(String statement,Object parameter)
    int delete(String statement,Object parameter)

操作事务方法 void commit() void rollback()

基本原理

  1. 核心配置文件:数据源,事务,引入映射配置文件
  2. 映射配置文件:主要配置了要执行的sql语句,传入参数,传出参数等等。
  3. 工厂对象,new SqlSessionFactoryBuilder().build(in) 进行了初始化配置,使用dom4j解析配置文件,将映射配置文件中的配置封装了一个个的MappedStatement对象,将这些对象封装成map集合 创建了sqlSessionFactory工厂
  4. 会话对象,本身不会直接操作数据库,委派给执行器来操作 sqlsession
  5. exector 执行器 根据key找到statement
  6. mappestatement jDBC 执行

Mybatis dao层开发

传统开发方式

  1. 编写UserMapper 接口
  2. 编写UserMapper 实现
  3. 编写UserMapper.xml 传统方式问题思考: 实现类中,存在mybatis模板代码重复 实现类调用方法,xml中的sql statement 硬编码到java代码中

代理开发方式

基于接口代理方式的开发只需要编写Mapper接口,MyBatis会为我们动态生成实现类的对象。 这种开发方式要求遵循一定的规范: 1.Mapper.xml映射文件中的namespace与mapper接口的全限定名相同 2.Mapper接口方法名和Mapper.xml映射文件中定义的每个statement的id相同 3.Mapper接口方法的输入参数类型和mapper.xml映射文件中定义的每个sql的parameterType的类型相同 4.Mapper接口方法的输出参数类型和mapper.xml映射文件中定义的每个sql的resultType类型相同