MyBatis 一文基础总结

1266315d6edc77fab66d2142faa6726e.jpeg

MyBatis 一文基础总结
老师的随堂上课笔记, 供参考~
1.框架概述

1.1 软件开发常用结构
1.1.1三层架构
三层的处理请求的交互:

用户---> 界面层--->业务逻辑层--->数据访问层--->DB 数据库

1.1.2 常用框架
常见的 J2EE 中开发框架:

MyBatis 框架

MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

Spring 框架:

Spring 框架为了解决软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前,非常复杂的企业级开发。Spring 解决了业务对象,功能模块之间的耦合,不仅在 javase,web 中使用,大部分 Java 应用都可以从 Spring 中受益。Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器。

SpringMVC 框架:

Spring MVC 属于 SpringFrameWork 3.0 版本加入的一个模块,为 Spring 框架提供了构建 Web 应用程序的能力。现在可以 Spring 框架提供的 SpringMVC 模块实现 web 应用开发,在 web 项目中可以无缝使用 Spring 和 Spring MVC 框架。

1.2 框架
1.2.1 框架定义
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。在框架基础上加入你要完成的功能。框架安全的,可复用的,不断升级的软件。

2.MyBatis框架入门
2.1MyBatis能做什么
一个框架,早期叫做ibatis, 代码在github

mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)
1)sql mapper :sql映射 可以把数据库表中的一行数据 映射为 一个java对象。 一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据

2) Data Access Objects(DAOs) : 数据访问 , 对数据库执行增删改查。

mybatis提供了哪些功能:

提供了创建Connection ,Statement, ResultSet的能力 ,不用开发人员创建这些对象了
提供了执行sql语句的能力, 不用你执行sql
提供了循环sql, 把sql的结果转为java对象, List集合的能力
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
//从数据库取出数据转为 Student 对象,封装到 List 集合
stuList.add(stu);
}
4.关闭资源

提供了关闭资源的能力,不用你关闭Connection, Statement, ResultSet

开发人员做的是: 提供sql语句 最后是: 开发人员提供sql语句--mybatis处理sql---开发人员得到List集合或java对象(表中的数据)

总结: mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC, 使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet 的创建,销毁,sql的执行。

2.2MyBaits的使用步骤
2.2.1 搭建MyBatis开发环境
1.下载MyBatis

https://github.com/mybatis/mybatis-3/releases
2.把MyBatis的jar包放入maven的本地仓库

2.2.2Mybatis的使用步骤
1.新建的student表

2.加入maven的mybatis坐标, mysql驱动的坐标

<!-- 加入mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>

<!-- mysql的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
3.创建实体类,student--保存表中的一行数据的

4.创建持久层的dao接口,定义操作数据库的方法

5.创建一个mybatis使用的配置文件叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。这个文件是xml文件。 6.创建mybatis的主配置文件:一个项目就一个主配置文件。主配置文件提供了数据库的连接信息和sql映射文件的位置信息

7.创建使用mybatis类,通过mybatis访问数据库

1、创建maven工程
2、创建Student表
3、创建Student类
4、创建接口StudentDao
5、创建StudentDao接口的映射文件(mapper文件)
<?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="net.zhenghou.dao.StudentDao">

<!--
select表示查询
id:你要执行的sql语法的唯一标识,mybatis会使用这个值来找到要执行的的sql语句
可以自定义,但是要求你使用接口中方法名称
-->
<select id="selectStudents" resultType="net.zhenghou.domain.Student">
select * from student
</select>
<!-- #{属性名},这个必须和类的属性一致-->
<insert id="insertStudent">
insert into student values(#{id},#{name},#{birthday},#{address})

</insert>
<update id="updateStudent">
update student set name=#{name},birthday=#{birthday},address=#{address} where id=#{id}
</update>
<delete id="deleteStudent">
delete from student where id=#{id}
</delete>
</mapper>
<!--

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
1. 指定约束文件
2.约束文件的作用:
检查当前文件中出现的标签,属性必须符合mybatis的要求
3.mapper是当前文件的根标签,必须的
namespace:叫做命名空间,唯一值,,可以自定义一个字符串,
一般我们要求是接口的全限定类名
4. 在当前文件中,可以使用特定的标签,标识数据库的特定操作
select的标签 :表示的是查询,selec语句
update标签:表示更新数据库的操作
insert标签:表示插入
delete标签,表示删除

-->


6.创建主配置文件
7.创建sqlSession执行sql语句
2.2.3 插入操作
1. StudentDao 的接口中加入一个抽象方法
2. 在StudentDao对应的映射文件StudentDao.xml中 插入操作
2.2.4 配置日志功能


2.2.5修改操作
2.2.6删除操作
2.3MyBatis对象分析
2.3.1Resources类
Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。

2.3.2 SqlSessionFactoryBuilder 类
SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 由 于

SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将

该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。

2.3.3 SqlSessionFactory 接口
SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用

只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。

➢ openSession(true):创建一个有自动提交功能的 SqlSession

➢ openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交

➢ openSession():同 openSession(false)

2.3.4 SqlSession接口
SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,一次会话以

SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。

SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将

其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。

2.3.5 创建工具类
public class MyBatisUtils {
private static SqlSessionFactory factory;
static{
try {
String config="mybatis.xml";
InputStream is = Resources.getResourceAsStream(config);
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}

//获取sqlSession的方法
public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
if(factory !=null){
sqlSession= factory.openSession();//非自动提交
}
return sqlSession;
}



}



3 MyBatis使用Dao 开发方式


3.1Dao开发
3.1.1传统Dao开发方式的分析
SqlSession的API方法定位到映射文件mapper中相应的sql语句,从而对数据库进行操作。

所以把这种由动态代理方式实现。

Mapper动态代理方式无需程序员实现Dao接口,接口是由MyBatis结合映射文件自动生成的动态代理实现的。

3.2 MyBatis框架Dao代理
3.2.1Dao代理实现CRUD
步骤:
去掉Dao接口的实现类

getMapper获取代理对象
接口 接口对象=sqlSession.getMapper(接口的class对象)
3.2.2原理

org.apache.ibatis.binding.MapperProxy@4d95d2a2
MapperProxy类的定义:

public class MapperProxy<T> implements InvocationHandler, Serializable {
......

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
....
MapperMethod mapperMethod = this.cachedMapperMethod(method);
return mapperMethod.execute(this.sqlSession, args);
}
重点的方法:

mapperMethod.execute(this.sqlSession, args);
public Object execute(SqlSession sqlSession, Object[] args) {
Object result;
Object param;
switch(this.command.getType()) {
case INSERT:
param = this.method.convertArgsToSqlCommandParam(args);
result = this.rowCountResult(sqlSession.insert(this.command.getName(), param));
break;
case UPDATE:
param = this.method.convertArgsToSqlCommandParam(args);
result = this.rowCountResult(sqlSession.update(this.command.getName(), param));
break;
case DELETE:
param = this.method.convertArgsToSqlCommandParam(args);
result = this.rowCountResult(sqlSession.delete(this.command.getName(), param));
break;
case SELECT:
if (this.method.returnsVoid() && this.method.hasResultHandler()) {
this.executeWithResultHandler(sqlSession, args);
result = null;
} else if (this.method.returnsMany()) {
result = this.executeForMany(sqlSession, args);
} else if (this.method.returnsMap()) {
result = this.executeForMap(sqlSession, args);
} else if (this.method.returnsCursor()) {
result = this.executeForCursor(sqlSession, args);
} else {
param = this.method.convertArgsToSqlCommandParam(args);
result = sqlSession.selectOne(this.command.getName(), param);
if (this.method.returnsOptional() && (result == null || !this.method.getReturnType().equals(result.getClass()))) {
result = Optional.ofNullable(result);
}
}
break;
case FLUSH:
result = sqlSession.flushStatements();
break;
default:
throw new BindingException("Unknown execution method for: " + this.command.getName());
}

if (result == null && this.method.getReturnType().isPrimitive() && !this.method.returnsVoid()) {
throw new BindingExcepti

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值