前言
- Mybatis框架优点
- 半自动化管理
- 作用于DAO层
- 动态、小巧灵活
- Mybatis框架特点
- 基于SQL语法、简单易学。
- 便于调试、能了解底层封装过程。
- SQL语句封装在配置文件中,便于管理,降低成语耦合。
数据持久化概念:持久化式程序数据在瞬时状态和持久状态的之间的转化过程。
----
瞬时状态 === 表示在内存中的文件,数据。通俗就是临时文件,用完就会被清理。
持久状态 === 表示储存在光盘,磁盘,数据库等等中的数据。可以一直携带~保存
----
什么是ORM:(Object Relational Mapping)即对象/关系映射。
- ORM(Object Relational Mapping)
- 编写程序的时候,以面向对象的方式处理数据。(即:一个实体类对应一张表)
- 保存数据的时候,却以关系型数据库的方式储存。(即:类属性对应数据库字段)
- OBM解决方案包含下面四个部分
- 在持久化对像执行增、删、改、查操作。
- 对持久化对象提供一种查询语言或者API。
- 对象关系映射工具。
- 提供与是事务对象交互、执行检查、延迟加载以及其他优化。
结言:
MyBatis是ORM解决方案,基于OBM在对象模型和关系数据库之间搭建了一座桥梁。
实现这么一些持久化对象的操作。
MyBatis环境搭建
准备工作:
1、下载Mybatis的Jar包
(源码文件)
(中文的mybatisAPI文档,不懂时进行查看)
2、部署jar包到项目下 -- 放入项目的lib包中。
3、编写MyBatis核心配置文件。( 可在文档中复制。)
4、创建实体类-POJO。
5、DAO层-SQL映射文件(mapper.xml)
6、创建测试类
* 读取核心配置文件。
* 创建SqlSessionFactory对象,读取配置文件。
* 通过SqlSessionFactory工厂对象创建SqlSession对象。
* 通过SqlSession对象调用mapper文件进行数据操作。
核心配置文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 读取同目录下的info文件 -->
<properties>
<property name="dbName" value="root"></property>
<property name="dbPass" value="linux"></property>
<property name="dbPath" value="jdbc:mysql://localhost:3306/smbms"></property>
<property name="jdbcPath" value="com.mysql.jdbc.Driver"></property>
</properties>
<!-- 设置日志文件输出 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 为类设置别名 --><!-- 为pojo包下的所有类设置别名 ,别名就是实体类的类名 -->
<typeAliases>
<package name="pojo"></package>
</typeAliases>
<!-- 设置Mybatis的运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用JDBC事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="username" value="${dbName}"></property>
<property name="password" value="${dbPass}"></property>
<property name="url" value="${dbPath}"></property>
<property name="driver" value="${jdbcPath}"></property>
</dataSource>
</environment>
</environments>
<!-- 配置SQL映射文件 -->
<mappers>
<mapper resource="dao/User/userMapper.xml"></mapper>
<mapper resource="dao/Provider/providerMapper.xml"></mapper>
</mappers>
</configuration>
SQL映射文件:
<?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文件相当于每个实现类 命名空间必须于我们所定义的接口一致 -->
<mapper namespace="dao.User.userMapper">
<!-- 设置查询语句 id == 接口定义的方法 resultType是接口定义的返回类型-->
<select id="count" resultType="int">
select count(1) from smbms_user
</select>
<!-- 同上注意!!!!select!!!里面千万不能写注释 -->
<select id="listAll" resultType="User">
select userName from smbms_user
</select>
</mapper>
具体的测试类:关联sql映射文件和核心文件
package test;
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.apache.log4j.Logger;
import pojo.User;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 描述:
*
* @author Unruly
* @ClassName userTest
* @create 2018-08-25 21:29
*/
public class userTest {
private static Logger log = Logger.getLogger(userTest.class);
public static void main(String[] args) {
int count = 0; // 接收值
List<User> list = new ArrayList<User>(); // 接收列表
SqlSession sqlSession = null; // 声明sql会话对象
try {
/*
创建sqlSession对象后要怎么办呢?
-- mybatis的核心对象是sqlsessionFactory对象。用于创建sql会话
那么sqlsessionfactory对象怎么获取呢?
-- 用sqlsessionfactorybuilder对象的build的方法创建
-- build提供多重载。
这里使用读取字节流的方式将核心配置文件读取进入输入流
然后使用build方法加载核心配置文件创建sql会话工厂
最后使用sql会话工厂的openSession(boolean commit); 默认true,自动提交
创建sqlSession会话对象
sqlSession会话对象有对sql语句执行的所有操作
*/
// 1.读取流文件
InputStream is = Resources.getResourceAsStream("Mybatis-config.xml");
// 2.创建工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 3.打开数据库会话
sqlSession = factory.openSession();
// 4.执行sql映射文件的sql语句
count = sqlSession.selectOne("dao.User.userMapper.count");
list = sqlSession.selectList("dao.User.userMapper.listAll");
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
/* 测试输出结果 */
log.info("总数测试 ============ count = "+count);
for(User user : list){
log.info("数据测试 =============== 姓名:"+user.getUserName());
}
}
}
MyBatis基本要素-核心类和接口
- MyBatis的核心接口和类
- Mybatis-config.xml 系统核心配置文件
- Mapper.xml SQL映射文件
-
- SqlSessionFactoryBuilder ( 用于加载核心文件,建立sql会话工厂 )
- 用过即丢,其生命周期只存在方法体内。
- 可重用其创建多个SqlSessionFactory实例。
- 负责构建核心SqlSessionFactroy,并提供多个builder的重载。
- SqlSessionFactoryBuilder ( 用于加载核心文件,建立sql会话工厂 )
-
- SqlSessionFactory ( 用户创建sql会话对象的工厂 )
- SqlSessionFactroy是每个Mybatis应用核心。
- 作用:创建SqlSession实例。
- --->SqlSession session = sqlSessionFactory.openSession(boolean)
- 作用域:Application。
- 模式单例:存在于整个应用运行时,并且同时只存在一个实例对象。
- SqlSessionFactory ( 用户创建sql会话对象的工厂 )
-
- SqlSession ( 用于执行sql映射文件的sql语法 )
- 包含了执行sql语句的所有方法。
- 生命周期对应于一此数据库会话,会话结束必须关闭。
- 线程级别,不能共享。
- 在SqlSession里可以执行多次SQL语句,但一旦关闭就要重新创建。
- SqlSession ( 用于执行sql映射文件的sql语法 )
优化代码测试
Sql映射文件:
<?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">
<!-- namespace用于区分不同的mapper,全局唯一 -->
<mapper namespace="dao.Provider.providerMapper">
<!--
id表示唯一标识 resultType表示返回的类型
当我们定义了接口的时候,那么所对应的接口相当于映射器
那么此使id = 接口定义的方法名称
以便使用getMapper()方法之后的方法能映射到此sql映射文件的节点方法
-->
<select id="count" resultType="int">
select count(1) from smbms_provider;
</select>
<!--
查询学生列表集合 因为在核心配置文件使用了pageck别名包,
所以这里的类的别名就是实体本名-Provider
否则:resultType必须为完整包-类名称
pojo.Provider
-->
<select id="selectAll" resultType="Provider">
select * from smbms_provider
</select>
</mapper>
工具类:(因为factory只需要一个,但是sqlSession需要频繁打开,所以建立工具类)
package Utils;
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 java.io.IOException;
import java.io.InputStream;
/**
* 描述:
*
* @author Unruly
* @ClassName MybatisUtil
* @create 2018-08-25 11:35
*/
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
/*
* 加载静态块读取mybatis核心文件,创建sql会话工厂。
*/
static {
try {
// 读取文件进入输入流
InputStream is = Resources.getResourceAsStream("Mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建sqlSession对象的方法 带参
* @param commit 表示是否自动提交事务:true自动提交、false关闭自动
* @return 返回一个sqlSession对象
*/
public static SqlSession createSqlSession(boolean commit){
return sqlSessionFactory.openSession(commit);
}
/**
* 创建sqlSession对象的方法 无参 自动提交事务
* @return 返回一个sqlSession对象
*/
public static SqlSession createSqlSession(){
return sqlSessionFactory.openSession();
}
/**
* 关闭sqlSession对象的方法
* @param sqlSession 一个SQL会话对象
*/
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession!=null){
sqlSession.close();
}
}
}
优化简便后的测试类:
package test;
import Utils.MybatisUtil;
import dao.Provider.providerMapper;
import dao.User.userMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import pojo.Provider;
import java.util.ArrayList;
import java.util.List;
/**
* 描述:
*
* @author Unruly
* @ClassName providerTest
* @create 2018-08-25 20:26
*/
public class providerTest {
private static Logger log = Logger.getLogger(providerTest.class);
public static void main(String[] args) {
int count = 0;// 接收方法返回值
List<Provider> list = new ArrayList<Provider>(); // 接收
SqlSession sqlSession = null; // 创建sqlSession对象
/*
因为sqlsessionfactory对象是一个工厂,采用单例模式
生命周期处于应用运行期间,所以我们只需要一个sql会话工厂对象
因为使用工具类创建这个对象达到优化代码的效果。
*/
try {
// 通过工具类创建sqlSession对象
sqlSession = MybatisUtil.createSqlSession();
// 通过接口映射器来执行sql映射文件执行sql映射文件的count方法
count = sqlSession.getMapper(userMapper.class).count();
list = sqlSession.getMapper(providerMapper.class).selectAll();
} catch (Exception e) {
e.printStackTrace();
}finally {
// sqlSession对象声明周期再一次数据库访问期间
// 用完必须关闭,sqlSession对象Servlet中的request
MybatisUtil.closeSqlSession(sqlSession);
}
log.info("测试=========count = "+count);
for (Provider p : list){
log.info("查询测试============providerName:"+p.getProName());
}
}
}
基本要素-核心配置文件
- Configuration 配置 === 所有元素的根节点
- properties 可以配置在Java属性配置文件中
- settings 修改MyBatis在运行时的行为方式
- typeAliases 为Java类型命名一个别名(简称)
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理
- dataSource 数据源
- environment 环境变量
- mappers 映射器
- mapper sql映射文件资源
注意:MyBatisConfig配置文件有一定顺序不能乱否则报错。
配置properties的两种方式:
1、引用外部properties文件
<properties resource = "info.properties"></properties>
2、在XML文件中直接引用
<properties resource = "info.properties">
<properties name="dbName" value="root">
<properties name="dbPass" value="linux">
<properties name="dbPath" value="jdbc:mysql://localhost:3306/datasource">
<properties name="jdbcPath" value="com.mysql.jdbc.Driver">
</properties>
3、同时引用和设置。
(但是这里引用的文件的优先级>内容设置的properties)
(也就是说外部文件的属性值,会覆盖xml内设置的)