文章目录
一、初识mybatis项目
1. 开发步骤
- 第一步:配置pom.xml文件,配置打包方式jar
~~~
<packing>jar</packing>
~~~
- *第二步:引入依赖
-mybatis依赖
-mysql驱动依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
- *第三步:编写mybatis核心配置文件,mybatis-config.xml(可以在mybatis中文网找到相关配置例子)
-
附上链接:MyBatis中文网
-
注意:
第一,这个文件名不是必须叫做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">
<!--.dtd是文件约束-->
<configuration>
<!--开始mybatis对标准日志的实现-->
<!-- <settings>-->
<!-- <setting name="logImpl" value="SLF4J"/>-->
<!-- </settings>-->
<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://127.0.0.1:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 在类的根路径下开始查询加载文件(相对路径)-->
<mapper resource="CarMapper.xml"/>
<!-- 在系统路径下开始加载资源(绝对路径)-->
<!-- <mapper url="file:///d:/CarMapper.xml"/>-->
</mappers>
</configuration>
- *第四步:编写XxxMapper.xml文件
在这个配置文档中编写SQL语句
这个文件名也不是固定的,放的位置也不是固定的,我们在这里给他起个名字CarMapper.xml
把他暂时放在类的根路径下
<?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="dfja">
<!-- insert语句 ,id是这条sqL语句的唯一标识,这个id就代表了这条SQL语句-->
<insert id="insertCar">
insert into t_car
(id,car_num,brand,guide_price,produce_time,car_type)
values
(null,'1003','丰田霸道',30.00,'2000-10-11','燃油车')
</insert>
</mapper>
- *第五步:在mybatis-config.xml文件指定XxxxMapper.xml文件的路径,
<mapper resource="CarMapper.xml"/>
注意:resource属性会自动从类的根路径下开始查找资源。
- *第六步:开始编写mybatis程序。(使用mybatis的类库,编写mybatis程序,链接数据库,做增删改查就行了)
在mybatis中,负责执行SQL语句的对象叫做什么呢?
SqlSqssion
SqlSession是专门用来执行SQL语句的,是数据库与java程序之间的一次会话。
要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂生产SqlSession对象
怎么获取SqlSessionFactory对象呢?
需要先获取SqlSessionFactoryBuilder对象
通过SqlSessionFactoryBuilder对象的build方法,来获取SqlSessionFactory对象
SqlSessionFactoryBuilder --> SqlSessionFactory -->SqlSession
package com.mybatis.test.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 java.io.IOException;
import java.io.InputStream;
public class MybatisIntroductionTest {
public static void main(String[] args) throws IOException {
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
/**
* mybatis核心配置资源的路径()
* Resources.getResourceAsStream()就是从类的根路径下开始查找资源
*/
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//一般情况下一个数据库对应一个SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取SqlSession对象
//如果使用的事务管理器是JDBC的话,底层实际上还是会执行:conn.setAutoCommit(false);
SqlSession sqlSession = sqlSessionFactory.openSession();//使用JDBC获得是JDBCTransaction
//执行Sql语句
int count = sqlSession.insert("insertCar");//影响数据库表当中记录的条数
System.out.println("插入了几条记录"+count);
sqlSession.commit();//底层实际上还是会执行conn.commit();
}
}
其他注意事项
1. 从XML中构建SqlSessionFactory
通过官方的,你能想到什么呢?
第一,在Mybatis中一定有一个很重要的对象,SqlSessionFactory对象
第二,SqlSessionFactory对象的创建需要XML
XML是什么?
它一定是一个配置文件。
2.mybatis中有两个主要的配置文件。
其中一个是,mybatis-config.xml,这是核心配置文件,主要配置链接数据库的信息等。(一个)
另一个是:xxxxMapper.xml,这个文件时专门用来编写SQL语句的配置文件(一个表一个)
t_user表,一般会对应一个UserMapper.xml
t_student表,一般会对应一个StudentMapper.xml
3关于第一程序的小细节
-
mybatis中sql语句结尾的";"可以省略
-
Resource.getResourceAsSream()
小技巧:一般情况下,遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载。(开始查找)
优点:采用这种方式,从类路径中加载资源,项目的移植性很强。项目从windows移植到linux,代码不需要修改,因为这个资源文件一直都在类路径当中。
InputStream is=new FileInputStream(“d:\mybatis-config.xml”)
采用这种方法也可以
缺点:可移植性太差,程序不够健壮,可能会移植到其他的操作系统中。导致以上路径无效,还需要修改java代码中的路径,这样违背了OCP原则。
*已经验证了:
mybatis核心配置文件的名字,不一定是mybatis-config.xml,可以是其他名字。
mybatis核心配置文件存放的路径,也不一定是在类的根路径下,可以放在其他位置。但为了项目的移植性,健壮性,最好将这个配置文件放到类路径下。
*InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config.xml”)
ClassLoder.getSystemClassLoder() 获取系统的类加载器
系统类加载器有一个方法叫做:getResourceAsStream
它就是从类路径当中加载资源的
通过源代码分析
InputStream is=Resource.getResourceAsStream(“mybatis-config.xml”)
底层的源代码其实就是:
InputStream is=ClassLoder.getSystemClassLoder.getResourceAsStream(“mybatis-config.xml”)
*CarMapper.xml的文件名字是固定的码?CarMapper.xml的路径是固定的码?
答:都不是固定的
相对路径resource是在类路径中加载文件
绝对路径 url是在系统路径加载文件
4. 关于mybatis的事务管理机制(深度剖析)
4.1在mybatis-config.xml文件中,可以通过一下的配置进行mybatis的事务管理
<transactionManager type="JDBC">
- type的属性包括两个
JDBC
MANAGED
注意:type后面的值,只有以上两个值可选,不区分大小写
4.2 在mybatis中提供了两种事务管理机制:
第一种:JDBC事务管理器
第二种:MANAGED事务管理器
4.2.1JDBC事务管理器:
mybatis框架自己管理实务,自己采用原生的JDBC代码去管理实务
conn.setAutoCommit(false);//开启事务
......业务处理.......
conn.commit();手动提交事务
使用JDBC事务管理器的话,底层创建的事务管理器对象:JdbcTransaction
如果编写的代码是下面的代码:
SqlSession sqlSession = sqlSessionFactory.openSession(true);
表示没有开启事务,因为这种方式压根不会执行:conn.setAutoCommit(false);
在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true
如果autoCommit是true,就表示没有开启事务。只要执行任意一条DML语句就提交一次。
4.2.2MANAGED事务管理器
mybatis不再负责事务管理了。事务交给其他容器负责。例如:spring
对于我们单mybatis的情况下,如果配置为MANAGED
那么事务这块是没人管的。没人管理事务表示事务没有开启。
*JDBC中的事务
如果你没有在JDBC代码中执行:conn.setAutoCommit(false);的话,默认autoCommit是true;
5. 关于mybatis集成的日志组件。让我们调试起来更加方便
5.1mybatis常见的集成日志组件有哪些?
SLF4J(沙拉风) :沙拉风是一个日志标准,其中一个框架叫做logback,它实现了沙拉风规范。
LOG4J
LOG4J2
STDOUT_LOGGING(标准日志)
……
注意:LOG4J,LOG4J2,logback都是同一个作者开发的。
5.2其中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志,mybatis框架本身已经实现了这种标准。
5.2.1只要开启即可,怎么开启呢?在mybatis-config.xml文件中使用setttings标签进行配置开启。
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
这个标签在编写时要注意,他应该出现在environments这个标签前。注意顺序。当然,不需要记忆这个顺序。
因为有dtd文件进行约束,我们只要参考dtd约束即可。
这种实现也是可以的,可以看到一些信息,比如:链接对象是什么时候创建,什么时候关闭,sql语句是怎样的。
但是没有详细的日期,线程名字,等,如果你想使用更加丰富的配置,可以继承第三方log组件。
5.2.2继承logback日志框架
logback日志框架实现了slf4j标准。(沙拉风:日志门面。日志标准)
第一步:引入logback依赖。
第二步:引入logback所必须的xml配置文件。
这个配置文件的名字必须叫做logback.xml或者logback-test.xml,不能是其他的名字。
这个配置文件必须放到类的根路径下,不能是其他位置。
主要配置日志输出相关的级别及日志具体的格式。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义⽇志⽂件的存储地址-->
<property name="LOG_HOME" value="/home"/>
控制台输出
<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} - %msg%n</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{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncode
r">
<!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logge
r{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>