关于持久层的框架有如下这些:更多关于三层架构的内容,大家可以移步至:✏️✏️✏️ MVC 三层架构案例详细解说_mvc三层架构-CSDN博客
- MyBatis
- Hibernate(实现了JPA规范)
- jOOQ
- Guzz
- Spring Data(实现了JPA 规范)
- ActiveJDBC
- ......
SQL语句写牢在了Java程序当中了,不灵活,改SQL的话,就要改Java代码,违反了开闭原则OCP。关于JDBC的更多详细内容,大家可以移步至:✏️✏️✏️ JDBC_ChinaRainbowSea的博客-CSDN博客
给 ? 占位符传值是繁琐的,不能自动化
将效果集封装成Java对象也是比力繁琐的,不能自动化
关于这些自动化的问题,以及OCP开闭原则,运用下面我们正在学习的MyBatis 可以得到一个很好的办理方案。
打开MyBatis 代码可以看到它的包结构中包罗:ibatis
- MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁徙到了[google code](https://baike.baidu.com/item/google code/2346604?fromModule=lemma_inlink),并且改名为MyBatis。2013年11月迁徙到Github。
- iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包罗SQL Maps和Data Access Objects(DAOs)。
- 当前,最新版本是MyBatis 3.5.13,其发布时间是2023年03月11日。
O (object) :Java虚拟机中的Java对象。
R(Relational):关系型数据库
M(Mapping):将Java虚拟机中的Java对象映射到数据库表中一行记录,或是将数据库表中一行记录映射成Java虚拟机中的一个Java对象。
ORM示图:
MyBatis 框架就是一个ORM框架。
java 对象 < ------ > 数据库表中的一条记录
MyBatis 是一个半自动化的ORM,由于MyBatis 框架中SQL语句是必要程序员自己写的。复制代码
- 像User 这样在图中,有特殊的称呼:
- 有的人把它叫做:pojo(普通Java类)
- 有的叫做: JavaBean (咖啡豆)
- 有的叫做: domain(领域模型)
4. MyBatis第一个入门程序
- 支持定制化SQL,存储过程,基本映射以及高级映射
- 避免了几乎所有的 JDBC代码中手动设置参数以及获取效果集。
- 支持XML 开辟,也支持注解开辟。【为了保证 SQL 语句的灵活,所有MyBatis 大部分采用 XML方式开辟。】
- 将接口和 Java 的 POJOs(Plain Ordinary Java Object ,简单平凡的Java对象)映射成数据库中的记录
- 体积小,好学,两个jar 包,两个 XML 配置文件
- 完全做到 SQL 解耦合
- 提供了基本映射标签
- 提供了高级映射标签
- 提供了XML标签,支持动态SQL的编写。
准备数据库表:汽车表t_car,字段包罗:
id:主键(自增)【bigint】
car_num:汽车编号【varchar】
brand:品牌【varchar】
guide_price:厂家指导价【decimal范例,专门为财务数据准备的范例】
produce_time:生产时间【char,年月日即可,10个长度,'2022-10-11'】
car_type:汽车范例(燃油车、电车、氢能源)【varchar】
mybatis依赖 ,mysql依赖
注意:
关于这两点的注意事项,该文章的背面,会详细说明。请继续看下去。
- 第一,这个文件名不是必须叫 mybatis-config.xml,可以用其他的名字,只是大家都采用这个名字。
- 这个文件存放的位置也不是固定的,可以随意,但一样平常情况下,会放到类的根路径下
在这个配置文件当编写SQL语句。在resources根目录下新建CarMapper.xml配置文件(可以参考mybatis手册拷贝)
这个文件名也不是固定的,放的位置也不是固定的,我们这里给它起个名字,叫做:CarMapper.xml (mapper 英文单词是“映射”的意思),把它临时放到类的根路径下。
注意编写的是 insert 插入的SQL语句所以,在该 xml 文件中用, 标签举行定义编写。如下:
而在 标签当中,必要定义一个 id 属性的值,该复制代码
- insert语句,id是这个条SQL语句的唯一标识,这个id就代表了这条SQL语句
注意1:sql语句末了结尾可以不写“;”由于我们的 id 是主键,自增的,所以可以不赋值。为 null ,让其举行一个自增的效果。复制代码
- <insert id="insertCar">
- insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
- values (null,'1003','丰田霸道',30.0,'2000-10-11','燃油车')
- </insert>
- // 因为我们的 id 是主键,自增的,所以可以不赋值。为 null ,让其进行一个自增的效果。
第五步: 编写MyBatis 测试程序(使用MyBatis的类库,编写myBatis 程序,该数据库,做增删改查就行了)复制代码
- [/code]注意:resource 属性会自动从类的根路径下开始查找资源。
- [/indent][align=center][img]https://img2024.cnblogs.com/blog/3084824/202405/3084824-20240524211254082-1644292152.png[/img][/align]
- [code]<?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>
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
- <property name="username" value="root"/>
- <property name="password" value="root"/>
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>
起首我们必要知道,在MyBatis 当中,负责执行SQL语句的是哪个对象,同时又该怎样获取到该对象。
负责执行 SQL语句的对象是: SqlSession
SqlSession 是专门来执行 SQL语句的,是一个Java程序和数据库之间的一次会话
想要获取到 SqlSession 对象,就必要先获取SqlSessionFactory 对象,通过SqlSessionFactory 工厂的openSession( ) 方法,来生产 SqlSession 对象。
那怎么湖获取SqlSessionFactory 对象
通过SqlSessionFactoryBuilder 对象的 build( ) 方法,来获取一个SqlSessionFactory 对象。
总结:注意事项:
MyBatis的核心对象包罗:
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
SqlSessionFactoryBuilder-->SqlSessionFactory-->SqlSession
该insert(id) 就是,我们上面 CarMapper.xml SQL映射文件当中编写的 SQL 语句(这里是 标签当中的 id 的属性值,保持同等)复制代码
- int count = sqlSession.insert("insertCar"); // 这个"insertCar"必须是sql的id
同时必要:完整执行代码:
执行 sqlSession.commit(); 提交数据给数据库(和JDBC是一样的); 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,必要手动提交。)
以及执行: sqlSession.close(); 关闭资源,注意:仅仅是关闭资源,并不会提交数据的。复制代码
- // 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
- sqlSession.commit();
- // 6. 关闭资源(只关闭是不会提交的)
- sqlSession.close();
运行效果:复制代码
- 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.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- public class MyBatisIntroductionTest {
- public static void main(String[] args) {
- // 1. 创建SqlSessionFactoryBuilder对象
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- // 2. 创建SqlSessionFactory对象
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- // 3. 创建SqlSession对象
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 4. 执行sql
- int count = sqlSession.insert("insertCar"); // 这个"insertCar"必须是sql的id
- System.out.println("插入几条数据:" + count);
- // 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
- sqlSession.commit();
- // 6. 关闭资源(只关闭是不会提交的)
- sqlSession.close();
- }
- }
MyBatis 第一个入门程序小总结:
第一: 在MyBatis中一定是有一个很重要的对象,这个对象是:SqlSessionFactory对象
第二: SqlSessionFactory 对象的创建必要 xml
xml 是什么?它是一个配置文件
MyBatis中有两个主要的配置文件:4.3 MyBatis 的第一个入门程序的细节问题
t_user 表,一样平常会对应一个UserMapper.xml
- mybatis-config.xml ,这是核心配置文件,主要配置连接数据库的信息等(一样平常是第一个数据库一个),同样的与之对应的通过mybatis-config.xml 的配置文件创建的对象 SqlSessionFactoryBuilder,SqlSessionFactory 也是一个数据库一个对象 。
- XxxMapper.xml ,这个是专门用来编写SQL语句的配置文件(一个数据表一个)。
t_student 表,一样平常会对应一个StudentMapper.xml
- 在MyBatis 中的SQ语句的结尾“;” 可以省略的。
- 在 MyBatis 当中的 SQL语句错误的,异常信息是:java.sql.SQLSyntaxErrorException 该异常表示是你的SQL语句写的不对,SQL语法大概存在问题。
- 在MyBatis 当中的工具类: Resource.getResourceAsStream( ) 方法。
小本领:以后凡是遇到 resource 这个单词,大部分情况下,这种加载资源的方式就是从(resource)类路径下开始检索加载的。5. 关于MyBatis核心配置文件的名字和路径详解
例如: 下面三种获取 IO流文件的,检索方式都是从类路径下开始的。采用从 (resource)类路径 加载文件的优点:复制代码
- InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
- InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 使用类加载器
而下面这个是:从体系的绝对路径开始加载的复制代码
- 采用这种方式,从类的路径当种加载资源,项目的移植性很强,项目从Windwos移植到Linux,没有路径上的问题
采用体系的绝对路径加载文件资源的缺点:复制代码
- InputStream stream = new FileInputStream("E:\\mybatis-config.xml");
复制代码
- 可移植性差,程序不够健壮,可能移植到其他的操作系统当中,导致以上路径无效,比如Linux,因为Linux系统是没有所谓的D盘,C盘之类的说法。所以想要移植到Linux当中运行的话,还需要修改Java代码才行。这样就违背了OCP原则了。
MyBatis 的核心配置文件就是,我们上述的名为 mybatis-config.xml 的配置文件。
已经验证过了,mybatis 核心配置文件的名字,不一定是:mybatis-config.xml 。mybatis 核心配置文件存放的路径,也不一定是类的根路径,可以放到其他的位置,但是为了项目的移植性。健壮性,最好将这个配置文件放到类路径下面。
同理的对应的 SQL 映射文件 XxxMapper.xml 文件的路径也可以不放在根(类)路径下,不过如果 SQL 映射文件 XxxMapper.xml 文件是根据 体系的绝对路径 来的话,必要用 标签。如下:
重点:注意的是,无论是 MyBatis 的核心配置文件,还是对应的 SQL 映射文件 XxxMapper.xml 文件,如果文件寄义目录的话,一定要带上目录才行如下:
源码解析:MyBatis 工具类的:InputStream is = Resources.getResourceAsStream("mybatis-config.xml") 的底层调用的机制。
6. 关于 mybatis 的事务管理机制(深度剖析)复制代码
- > InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml")
- > ClassLoader.getSystemClassLoader() 获取系统的类加载器。
- > 系统类加载器有一个方法叫做:getResourceAsSteam
- > 它就是从类路径当中加载资源的
- > 通过源代码分析发现:
- > InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
- > 底层的源代码其实现就是:
- > InputStream is = ClasLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
- >
关于 mybatis 的事务管理机制:
在mybatis-config.xml 文件中,可以通过以下的配置举行 mybatis 的事务处理。
通过:** ** 标签举行设置即可。
type 的属性值包罗两个:在mybatis 中提供了两种事务管理机制。
type 背面的值,只有以上两个值可以选择,不区分巨细写。
- JDBC (jdbc)
- MANGED(managed)
MyBatis 框架自己管理事务,自己采用原生的JDBC 代码去管理事务
- 第一种 JDBC事务管理器
使用JDBC事务管理器的话,底层创建的事务管理器对象,jdbcTransaction对象。复制代码
- > conn.setAutoCommit(false);开启事务,false 是默认的,可以不用写
- > ...业务处理...
- > conn.commit(); 手动提交事务
我们可以举行一个 Debug 调试,举行一个检查复制代码
- 如果你编写的代码是下面的代码:
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- 表示没有开启事务,因为这种方式压根不会执行,com.setAutoCommit(false)
- 在JDBC事务中,没有执行com.setAutoCommit(false);那么autoCommit就是true.
- 如果autoCommit 是 true ,就表示没有开启事务,只要执行任意一条DML语句就提交了一次
这里我们用默认的 false ,也可以不填,都是 false
复制代码
- SqlSession sqlSession = sqlSessionFactory.openSession();
- SqlSession sqlSession = sqlSessionFactory.openSession(false);
下面我们设置为:true
<strong>在 JDBC事务管理器 下,SqlSession sqlSession = sqlSessionFactory.openSession( 不填,或者 false); 表示开启事务了(必要自己手动提交,sqlSession.commit()
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4