一、持久化和ORM的概念
持久化:持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
Java的持久化,通常是指使用SQL将数据存储在关系型数据库中。
持久化层:持久化层目前通用的是DAO ,也可以说为持久化层,作为基础层被业务逻辑层调用。DAO =Data Access Objects,也就是所谓的数据访问对象,这个对象是和数据打交道的。
ORM的概念:(Object Relational Mapping)对象关系映射,ORM主要是把对象模型和关系型数据库关系模型映射起来,并且使用元数据对这些映射进行描述。对象持久化或持久化层的实现有若干实现方式,例如通过JDBC调用SQL语句存储数据的方式,还有序列化对象的方式,就技术发展的现状来言,ORM是最好的方式。
映射主要包括:
实体类和数据库表的映射;
类的属性和数据库表字段的映射;
对象映射成数据表中的列(一条记录);
说明:对象持久化是一个基本概念,ORM是持久化的一种解决方案,而MyBatis是ORM的一个实现,是一个ORM工具。
二、MyBatis简介
1.什么是mybatis?
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录.。
mybatis 其实是对 jdbc api 的进一步封装,mybatis 不会直接和数据库进行打交道,最终和数据库打交道的仍然是 jdbc 。
mybatis 的最主要的两个功能:
- 将 xml(或注解)和参数映射为 sql 交给 jdbc 去执行(增、删、改、查)
- 对于查询,将 jdbc 查询出的结果集映射为对象,将映射好的对象返回给用户。
2.mybatis与hibernate的对比?
mybatis提供一种“半自动化”的ORM实现,是完成对JDBC的部分封装。比hibernate灵活。性能也比hibernate好。而且也比较轻量级。
3.mybatis原理:
从图中看,Mybatis主要包括3部分,接口层、数据处理层(映射文件)、基础支撑层(核心配置文件)。
mybatis在转化的过程中怎么知道数据库的哪个字段对应JavaBean中的哪个属性呢?
很简单,只要两者的名称一样,系统就能就能自动识别出来,比如在数据库中创建的user表的字段分别为id,username,password,address这四个,实体类的属性也是这四个一模一样,所以系统会自动将查询结果给我们转为User对象
4.mybatis中几个基本的组件
1.SqlSessionFactoryBuilder:这是一个SqlSessionFactory的构造器,它根据我们的xml配置文件或者Java代码来生成SqlSessionFactory。
2.SqlSessionFactory:这个有点类似于我们在JDBC中使用的Connection,我们到时候要根据SqlSessionFactory来生成是一个会话,也就是SqlSession。
3.SqlSession:它可以发送一条SQL语句去执行,并返回结果,从这个角度来说,它有点类似于PrepareStatement,当然,我们也可以利用SqlSession获取Mapper的接口,这个算是SqlSession的一个核心用法了。
4.Mapper:Mapper也可以发送一条SQL语句并返回执行结果,Mapper由两部分组成,一部分是Java接口,另一部分是XML配置文件或者注解。
5.mybatis的执行原理:
IO加载mybatis配置文件;
SqlSessionFactoryBuilder根据XML配置文件创建SqlSessionFactory;
SqlSessionFactory创建一个SqlSession对象,该对象包含了执行Sql语句的所有方法,完成对数据库的CRUD操作(根据SQL映射文件里的namespace+id找到对应的SQL语句);
执行完毕session关闭;
三、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>
<!-- 引用mybatis.properties配置文件 -->
<properties resource="mybatis.properties" />
<!--settings全局参数配置 一般默认配置即可-->
<settings>
<!-- 这个配置使全局的映射器启用或禁用缓存 -->
<!--<setting name="cacheEnabled" value="true" />-->
<!--Log4J日志文件配置-->
<setting name="logImpl" value="LOG4J" />
</settings>
<!--别名配置,下面语句在使用时就可以省略包名直接写类名而且不区分大小写-->
<typeAliases>
<package name="org.lanqiao.entity"/>
<package name="org.lanqiao.dao"/>
</typeAliases>
<!--环境配置-->
<environments default="development">
<!--可以配置多个数据库连接,选择不同的数据集合-->
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<!--注意一定要放在resources,放在java下无法解析-->
<mappers>
<mapper resource="org/lanqiao/dao/UserMapper.xml" />
</mappers>
</configuration>
全局settings详细配置
- <settings>
- <!-- 这个配置使全局的映射器启用或禁用缓存 -->
- <setting name="cacheEnabled" value="true" />
- <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
- <setting name="lazyLoadingEnabled" value="true" />
- <!-- 当启用时,true。否则,每种属性将会按需要加载 -->
- <setting name="aggressiveLazyLoading" value="true" />
- <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) -->
- <setting name="multipleResultSetsEnabled" value="true" />
- <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->
- <setting name="useColumnLabel" value="true" />
- <!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) -->
- <setting name="useGeneratedKeys" value="true" />
- <!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) -->
- <setting name="autoMappingBehavior" value="PARTIAL" />
- <!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 -->
- <setting name="defaultExecutorType" value="SIMPLE" />
- <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
- <setting name="defaultStatementTimeout" value="25000" />
- </settings>
简单测试代码
package org.lanqiao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.lanqiao.entity.User;
import java.io.IOException;
import java.io.Reader;
public class Test {
public static void main(String[] args) {
String resource = "mybatis-Config.xml";
try {
//加载Mybatis的配置文件
Reader reader = Resources.getResourceAsReader(resource);
//创建SqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能够执行SQL映射文件中SQL语句的SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//配置文件里的命名空间+id
User u = sqlSession.selectOne("org.lanqiao.dao.UserMapper.selectByPrimaryKey",1);
System.out.println("用户名:"+u.getUserName());
} catch (IOException e) {
e.printStackTrace();
}
}
}