Mybatis
三层架构
- 持久层 主要完成与数据库相关的操作,对数据库进行增删改查
- 业务层 主要根据功能需求完成业务逻辑的定义和实现
- 表现层 主要完成于最终软件使用用户交互,需要有交互界面
三层架构之间调用关系:表现层调用业务层,业务层调用持久层
原始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 操作分析
- 数据库连接创建,释放频繁造成系统资源浪费从而影响系统性能
- sql语句在代码中硬编码,造成代码不易维护
- 查询操作时,需要手动将结果集中的数据手动封装到实体中。
解决方案
- 使用数据库连接池初始化连接资源
- 将sql语句抽取到xml配置文件中
- 使用反射,内审等底层技术,自动将实体和表进行属性和字段的自动映射
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 常用配置解析
- environments 标签,数据库环境的配置,支持多环境配置 其中,事务管理器(transactionManager)类型有两种 JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域 MANAGED: 这个配置几乎没做什么,它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期 例如:mybatis 与 spring 整合后,事务交给spring 容器管理
- 其中数据源(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. 使用相对于类路径的资源引用
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()
基本原理
- 核心配置文件:数据源,事务,引入映射配置文件
- 映射配置文件:主要配置了要执行的sql语句,传入参数,传出参数等等。
- 工厂对象,new SqlSessionFactoryBuilder().build(in) 进行了初始化配置,使用dom4j解析配置文件,将映射配置文件中的配置封装了一个个的MappedStatement对象,将这些对象封装成map集合 创建了sqlSessionFactory工厂
- 会话对象,本身不会直接操作数据库,委派给执行器来操作 sqlsession
- exector 执行器 根据key找到statement
- mappestatement jDBC 执行
Mybatis dao层开发
传统开发方式
- 编写UserMapper 接口
- 编写UserMapper 实现
- 编写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类型相同