文章目录
- MyBatis概述
- 框架
- 特点
- 有关resources目录
- 开发步骤
- 从XML中构建SqlSessionFactory
- MyBatis中有两个主要的配置文件
- 编写MyBatis程序
- 关于第一个程序的小细节
- MyBatis的事务管理机制
- JDBC
- MANAGED
- 编写一个较为完整的mybatis
- junit测试
- mybatis集成日志组件
MyBatis概述
框架
- 在文献中看到的framework被翻译为框架
- Java常用框架:
-
- SSM三大框架:Spring + SpringMVC +MyBatis
-
- SpringBoot
-
- SpringCloud
-
- 等。。
- 枢架其实就是对通用代码的封装,提前写好子了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率
- 框架一般都法jar包的形式存在。(jar包中有class文件以及各种配置文件等。)
- SSM三大框架的学习顺序:MyBatis、Spring.SpringMVC(仅仅是建议)
特点
- 支持定制化SQL、存储过程、基本映射以及高级映射
- 避免了几乎所有的JDBC代码中手动设置参数以及获取结果集
- 支持XML开发,也支持注解式开发。【为了保证sql语句的灵活,所以mybatis大部分是采用XML方式开发。】
- 将接口和Java的POJOs(Plain Ordinary Java Object,简单普通的Java对象)映射成数据库中的记录
- 体积小好学:两个jar包,两个XML配置文件。
- 完全做到sql解耦合。
- 提供了基本映射标签。
- 提供了高级映射标签。
- 提供了XML标签,支持动态SQL的编写。
有关resources目录
放在这个目录当中的,一般都是资源文件,配置文件
直接访问在resources目录下的资源,等同于放到了类的根路径下。
开发步骤
- 第一步:打包方式jar
<packaging>jar<packaging>
- 第二部:引入依赖
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.38</version>
</dependency>
</dependencies>
- 第三步:编写MyBatis核心配置文件:mybatis-config.xml
注意:
第一:这个文件名不是必须叫做mybatis-config.xml,可以用其他的名字。只是大家都采用这个名字。
第二:这个文件存放的位置也不是固定的,可以随意,但一般情况下,会放到类的根路径下。
mybatis-config.xml文件中的配置信息不理解没关系,先把数据库的信息修改以下即可。其他的别动
<?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">
<transactionHanager type="JDBC/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Drivercom.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo"/>//这个是找到mysql并找到要操作的数据库
<property name="username" value="root"/>//mysql的账号
<property name="password" value="root"/>//mysql的密码
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>//配置Mapper的地方
</mappers>
</configuration>
- 第四步:编写XxxxMapper.xml文件。
在这个配置文件当中编写SQL语句
这个文件名也不是固定的,放的位置也不是固定的,这里给它起个名字,叫做CarMapper.xml
把它暂时放到类的根路径下。
<mapper namespace="fdsafdsa">//这个namespace暂时可以随便取
<!--insert语句,id是这条SQL语句的唯一标识。这个id就代表了这条SQL语句。-->
<insert id="insertCar">
insert into t_car(id, car_num, brand, guide_price, produce_time ,car_type)
values(null, '1083','丰田霸道',30.0," 2088-10-11','燃油车')
</insert>
</mapper>
- 第五步:在mybatis-config.xml文件中指定XxxxMapper.xml文件的路径:
<mapper resource="CarMapper.xml"/>
注意:resource属性会自动从类的路径下开始查找资源
- 第六步:开始编写MyBatis程序(使用mybatis的类库,编写mybatis程序,连接数据库,做增删改查就行了。)
从XML中构建SqlSessionFactory
从官方的这句话中,能想到什么
- 第一:在MyBatis中一定是有一个很重要的对象,这个对象是:SqlSessionFactory对象。
- 第二:SalSessionFactory对象的创建需要XML
XML是什么?
- 他一定是一个配置文件
MyBatis中有两个主要的配置文件
其中一个是:mybatis-config.xml,这是核心配置文件,主要配置连接数据库的信息等。(一个)
另一个是:XxxMapper.xml,这个文件是专门用来编写SQL语句的配置文件。(一个表一个)
- t_user表,一般会对应一个UserMapper.xml
- t_student表,一般会对应一个StudentMapper.xml
编写MyBatis程序
zaiMyBatis中,负责执行SQL语句的那个对象叫做什么?
- SqlSession
SqlSession是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话
要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来实现SqlSession对象。
那如何获取SqlSessionFactory对象?
通过SqlSessionFactoryBuilder对象的build方法,来获取一个SqlSessionFactory对象。
mybatis的核心对象包括:
- SqlSessionFactoryBuilder
- SqlSessionFactory
- SqlSession
SqlSessionFacotryBuilder --> SqlSessionFactory -->SqlSession
public class MyBatisIntroductionTest {
public static void main(string[] args) {
//获取SqlSessionFactoryBuilder对象
sqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
//Inputstream is = new FileInputStream( name: "mybatis-config.xml文件的路径");
InputStream is = Resources.getResourceAsStream( "mybatis-config.xml");
//Resources.getResourceAsStream默认就是从类的根路径下开始查找资源
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession():
//执行SQL语句
int count = sqlSession.insert( s: "insertCar"");//返回值是影响数据库表当中的记录条数。
System.out.println("插入了几条记录:" + count);
//手动提交
sqlSession.commit();
}
}
关于第一个程序的小细节
- mybatis中sql语句的结尾";"可以省略。
- Resources.getResourceAsStream
小技巧:以后凡是遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载。(开始查找)
优点:采用这种方式,从类路径当中加载资源,项目的移植性很强。项目从windows移植到linux,代码不需要修改,因为这个资源文件一直都在类路径当中。
- InputStream is = new FileInputstream(“d:\lmybatis-config.xml”);
采用这种方式也可以。
缺点:可移植性太差,程序不够健壮。可能会移植到其他的操作系统当中。导致以上路径无效,还需要修改java代码中的路径。这样违背了OCP原则。
- 己经验证了:
mybatis核心配置文件的名字,不一定是: mybatis-config.xml。可以是其它名字。
mybatis核心配置文件存放的路径,也不一定是在类的根路径下。可以放到其它位置。但为了项目的移植性,他壮性,最好将这个配置文件放到类路径下面。
- InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config .xml”);
classLoader.getSystemclassLoader()获取系统的类加载器。
系统类加载器有一个方法叫做:getResourceAsStream
它就是从类路径当中加载资源的。
通过源代码分析发现:
Inputstream is = Resources.getResourceAsStream("mybatis-config.xml");
底层的源代码其实就是:
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xm1");
- CarMapper.xml文件的名字是固定的吗? CarMapper.xml文件的路径是固定的吗?
都不是固定的。
resource属性:这种方式是从类路径当中加载资源
url属性:这种方式是从绝对路径当中加载资源。
MyBatis的事务管理机制
- 在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理
<transactionMapper type="JDBC"/>
- type属性的值就包括两个:JDBC和MANAGED(大小写无所谓)
- 在mybatis中提供了两种事务管理机制:JDBC事务管理器,MANAGED事务管理器
只要autoCommit是true,就表示没有开启事务。
只有autoCommit是false的时候,就表示开启了事务。
JDBC
mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务
conn.setAutoCommit(false);//开启事务
//...业务处理...
conn.commit();//手动提交事务
如果编写的是下面的代码
SqlSession sqlSession = sqlSessionFactory.openSession(true);
表示的是没有开启事务,因为这种方式压根不会执行:conn.setAutoCommit(false);
在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true。
如果autoCommit是true,就表示没有开启事务。只要执行任意一条DML语句就要提交一次。
如果你没有在JDBC代码中执行:conn.setAutoCommit(false);
的话,默认的autoCommit是false
MANAGED
mybatis不再负责事务的管理了,事务管理交给其他容器来负责,例如:spring,
我不管事务了,你来负责把
对于我们当前的单纯的只有mybatis的情况下,如果配置为:MANAGED
那么事务这块是没人管的。没有人管理事务表示事务压根没开启
编写一个较为完整的mybatis
package org.example;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisCompleteText {
public static void main(String[] args) {
SqlSession sqlsession = null;
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
sqlsession = sqlSessionFactory.openSession();//执行SQL语句,处理相关业务
int count = sqlsession.insert("insertCar");
System.out.println(count);
//执行到这里,没有发生任何异常,提交事务。终止事务。sqlsession.commit();
}catch (Exception e) {
//最好回滚事务
if (sqlsession != null) {
sqlsession.rollback();
}
e.printStackTrace();
}
finally {
//关团会话(释放资源>
if (sqlsession != null) {
sqlsession.close();
}
}
}
}
junit测试
为了保证自己写的模块方法没问题,需要对其进行测试
单元测试方法写多少个
一般是一个业务方法对应一个测试方法
测试方法的规范:public void testXxxx(){}
测试方法的方法名:以test开始,假设测试的方法是sum,这个测试方法名:testSum
@Test注释非常重要,被这个注解标注的方法就是一个单元测试方法
单元测试中有两个重要的概念
一个是实际值(被测试的业务方法的真正执行结果)
一个是期望值(执行了这个业务方法之后,你期望的执行结果是多少)
//写的模块
package org.example;
public class MathServer {
public int sum(int a,int b){
return a+b;
}
public int sub(int a, int b){
return a-b;
}
}
//测试
package service;
import org.example.MathServer;
import org.junit.Assert;
import org.junit.Test;
public class MathServerTest {
@Test
public void testSum(){
MathServer mathServer = new MathServer();
//获取实际值
int actual = mathServer.sum(1,2);
//获取期望值
int expected = 3;
//加断言进行测试
Assert.assertEquals(expected,actual);
}
@Test
public void testSub(){
MathServer mathServer = new MathServer();
//实际值
int actual = mathServer.sub(10,5);
//期望值
int expected = 5;
Assert.assertEquals(expected,actual);
}
}
绿色测试通过
mybatis集成日志组件
这玩意能让我们调试起来更加方便
在核心配置文件里面(mybatis-config.xml)中配置settings
这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为。
链接:https://mybatis.net.cn/configuration.html#settings
↑可以查看settings中可以设置什么,以及它的作用
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--开启mybatis自己对日志的实现-->
</settings>
常见的mybatis集成日志组件有哪些呢?(在上面代码value中设置的还有啥)
- SLF4J(沙拉风),是一个日志标准,其中有一个框架叫做logback,它实现了沙拉风规范
- LOG4J
- LOG4J2
- STDOUT_LOGGING
- …
其中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志,mybatis框架本身已经实现了这种标准
what is more标签是有它的顺序的在configuration标签中得按照它的标签顺序进行排序,不然会报错
集成logback日志框架。logback日志框架实现了slf4j标准
- 第一步:引入logback的依赖
<!--第一次引入也挺快的-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
- 第二步:引入logback所必须的xml配置文件
这个配置文件的名字必须叫做:logback.xml或logback_test.xml,不能是其他的名字
这配置文件必须放到类的根路径下,不能是其他的位置。
注意注意,不要用1.4开头的那个版本,会出现输出不了日志的情况
<!--logback配置文件的内容-->
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--控制台输出-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm: ss.SSS} [%thread] %-5level %logger{50} - %msg8n</pattern>
</encoder>
</appender>
<!--按照每天生成日志文件-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yYvy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度Xmsg:日志消息,%n是换行符--><pattern>%d{yyyy-MMN-dd HH:mm:ss.ssS} [%thread] %-5level %logger{50}- %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.sizeBasedTriggeringPolicy">
<MaxFilesize>100MB</MaxFilesize>
</triggeringPolicy>
</appender>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!--日志输出级别,logback日志级别包括五个:TRACE< DEBUG<INFO<WARN < ERROR -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</configuration>