1. 建数据库表
添加两条数据
2. 开发步骤
1.新建一个maven模块
项目结构
resources
放在这个目录当中的一般都是资源文件,配置文件
直接放到resources目录下的资源,等同于放到类的根路径下
2.开发步骤
-
1.(pom.xml)打包方式jar <packaging>jar</packaging>
-
2.(pom.xml)引入依赖
- 从maven仓库查找
- mybatis依赖
- mysql驱动依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.powenode</groupId> <artifactId>mybatis-001-introduction</artifactId> <version>1.0-SNAPSHOT</version> <!--打包方式--> <packaging>jar</packaging> <dependencies> <!--mybatis依赖--> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!--mysql驱动依赖--> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> </dependencies> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> </project>
- 从maven仓库查找
-
3.编写mybatis核心配置文件:mybatis-config.xml
文件名不是必须叫mybatis-config.xml,可以用其他名字
文件的位置一般情况下放到类的根路径下(resources),不是固定的
修改连接数据库信息<?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> <!--指定XxxMapper.xml文件的路径--> <!--resource属性自动从文件的根路径下获取资源--> <mapper resource="CarMapper.xml"/> </mappers> </configuration>
-
4.编写XxxxMapper.xml文件
在这个文件当中编写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 namespace="org.mybatis.example.BlogMapper"> <!--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.0, '2000-10-11', '燃油车') </insert> </mapper>
-
5.在mybatis-config.xml文件中指定XxxMapper.xml文件的路径
<mapper resource="CarMapper.xml"/>
resource属性自动从文件的根路径下获取资源 -
6.编写mybatis程序(使用mybatis的类库,编写mybatis程序,连接数据库,做增删改查)
在mybatis中,负责执行SQl语句的对象
SqlSession
SqlSession是专门用来执行SQL语句的,是一个java程序和数据库之间的一次会话
要想获取SqlSession对象,需要先获取SqlSessionFactory对象
通过SqlSessionFactory工厂来生产SqlSession对象
怎么获取SqlSessionFactory对象?
需要首先获取SqlSessionFactoryBuilder对象
通过SqlSessionFactoryBuilder对象的build方法,来获取一个SqlSessionFactory对象
mybatis的核心对象包括
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
SqlSessionFactoryBuilder --> SqlSessionFactory --> SqlSession
package com.powernode.mybatis.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.InputStream; public class MyBatisIntroductionTest { public static void main(String[] args) throws Exception { // 获取SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 获取SqlSessionFactory对象 // Resources.getResourceAsStream默认是从类的根路径下查找资源 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 一般情况下一个数据库对应一个SqlSessionFactory对象 // build的参数需要传入一个指向mybatis-config.xml文件的流 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 执行sql语句 // 参数传的是sql语句的id // 返回值是影响数据库表中的记录条数 int count = sqlSession.insert("insertCar"); System.out.println("插入了几条记录:" + count); // 手动提交 sqlSession.commit(); } }
采用正规的方式,写一个完整的MyBatis程序
package com.powernode.mybatis.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; /** * 采用正规的方式,写一个完整的MyBatis程序 * @author b * @version 1.0 * @since 1.0 */ public class MyBatisCompleteTest { 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 (IOException e) { // 回滚事务 if (sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); } finally { // 关闭会话(释放资源) if (sqlSession != null) { sqlSession.close(); } } } }
3. mybatis中有两个主要的配置文件
mybatis-config.xml:核心配置文件,主要配置连接数据库的信息等(一个)
XxxxMapper.xml:这个文件用来专门编写sql语句的配置文件(一个表一个)
4.关于第一个程序的小细节
- mybatis中sql语句的结尾";"可以省略
- Resources.getResourceAsStream
小技巧:以后凡是遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的路径下开始加载(开始查找) - 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.xml”);
5.关于mybatis的事务管理机制
- 在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理
<transactionManager type=“JDBC”/> - type属性的值包括两个:
JDBC(jdbc)
MANAGED(managed) - 在mybatis中提供了两种事务管理机制
-
JDBC事务管理机制
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语句就提交一次 -
MANAGED事务管理机制
mybatis不再负责事务的管理,事务管理交给其他容器来负责。例如:spring
-
6.在MyBatis中引入JUnit
在pom.xml中添加junit依赖
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
在test中新建包,以及创建CarMapperTest类
在CarMapperTest类中编写MyBatis代码
package com.powernode.mybatis.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.junit.Test;
import java.io.IOException;
public class CarMapperTest {
// 单元测试方法一般是一个业务方法对应一个测试方法
// 测试方法规范:public void testXxxx(){}
// @Test注解非常重要,被这个注解标注的方法就是一个单元测试方法
@Test
public void testInsertCar(){
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 (IOException e) {
// 回滚事务
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 关闭会话(释放资源)
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
运行,测试,绿色就是没问题
7. 关于mybatis集成日志组件
-
mybatis常见的日志组件:
SLF4J(沙拉风):沙拉风是一个日志标准,其中有一个框架叫logback,它实现了沙拉风规范
LOG4J
LOG4J2
STDOUT_LOGGING
… -
STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志
只要开启即可,在mybatis-config.xml文件中使用settings标签进行配置开启<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
这种实现可以看到一些信息,比如:连接对象什么时候创建,什么时候关闭,sql语句是怎样的
但是没有详细的日期,线程名字等,想使用更加丰富的配置,可以集成第三方的log组件
-
集成logback日志框架
logback日志框架实现了slf4j规范- 在pom.xml中引入logback依赖
<!--引入logback依赖--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency>
- 引入logback必须的xml配置文件
这个配置文件的名字必须叫做:logback.xml或者logback-test.xml
这个配置文件必须放到类的根路径下<?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>[%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </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>
- 在pom.xml中引入logback依赖