一、版本
软件版本:
- IntelliJ IDEA:2022.1.4
- Navicat for MySQL:16.0.14
- MySQL数据库:8.0.30
组件版本:
- MySQL驱动:8.0.30
- MyBatis:3.5.10
- JDK:Java17
- JUnit:4.13.2
- Logback:1.2.11
二、 MyBatis下载
gitHub下载地址:https://github.com/mybatis/mybatis-3
如上图:框架一般都是以jar包的形式存在。后续的项目使用maven直接引入,所以这个jar我们不需要。官方手册需要。
三、MyBatis入门程序开发步骤
1、写代码前准备:
(1)准备数据库表:汽车表t_car,字段包括:
- id:主键(自增)【bigint】
- car_num:汽车编号【varchar】
- brand:品牌【varchar】
- guide_price:厂家指导价【decimal类型,专门为财务数据准备的类型】
- produce_time:生产时间【char,年月日即可,10个长度,'2022-10-11'】
- car_type:汽车类型(燃油车、电车、氢能源)【varchar】
(2)使用navicat for mysql工具建表
(3)使用navicat for mysql工具向t_car表中插入两条数据,如下:
(4)创建Project:建议创建Empty Project,设置Java版本以及编译版本等
(5)设置IDEA的maven
(6)创建Module:普通的Maven Java模块
2、开发步骤:参考 MyBatis中文网步骤即可
步骤1:打包方式:jar(不需要war,因为mybatis封装的是jdbc。)pom.xml文件下编写
<groupId>com.powernode</groupId>
<artifactId>mybatis_001_introduction</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式-->
<packaging>jar</packaging>
步骤2:引入依赖(mybatis依赖 + mysql驱动依赖)pom.xml文件下编写
<!--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.30</version>
</dependency>
步骤3:在resources根目录下新建mybatis-config.xml配置文件(可以参考mybatis手册拷贝)
<?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>
<!--sql映射文件创建好之后,需要将该文件路径配置到这里-->
<mapper resource=""/>
</mappers>
</configuration>
注意1:mybatis核心配置文件的文件名可以是任意的,大家通常命名为mybatis-config。
注意2:mybatis核心配置文件存放的位置也可以随意。一般情况会放在resources根下,相当于放到了类的根路径下。
注意3:从官方的文档中理解从 XML 中构建 SqlSessionFactory:①:在mybatus中有一个对象叫SqlSessionFactory,SqlSessionFactory对象的创建需要这个XMl。
注意4:mybatis中的两个主要配置文件:
①:mybatis-config.xml(核心配置文件,主要配置链接数据库的信息等,仅一个)
②:XxxxMapper.xml(这个文件是专门用来编写SQL语句的配置文件,一个表一个)
步骤4:在resources根目录下新建CarMapper.xml配置文件(可以参考mybatis手册拷贝)
<?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">
<!--namespace先随意写一个-->
<mapper namespace="insertCar">
<!--insert sql:保存一个汽车信息-->
<insert id="insertCar">
insert into t_car
(id,car_num,brand,guide_price,produce_time,car_type)
values
(null,'133','名爵-7',12.34,'2023-10-15','氢能源')
</insert>
</mapper>
注意1:sql语句最后结尾可以不写“;”
注意2:CarMapper.xml文件的名字不是固定的。可以使用其它名字。
注意3:CarMapper.xml文件的位置也是随意的。这里选择放在resources根下,相当于放到了类的根路径下。
步骤5:将CarMapper.xml文件路径配置到mybatis-config.xml:
注意:因为resource是自动从跟目录下查找,所以直接复制过来就可以
步骤6:编写MyBatisIntroductionTest代码
- 在mybatis中,负责执行SQL语句的对象:SqlSession。
- SqlSession:是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话。
- 生成SqlSession对象:需要先用sqlSessionFactoryBuilder对象的build方法获取SqlSessionFactory对象,再通过SqlSessionFactory工厂来生产SqlSession对象。
- mybatis的核心对象包括:
- SqlSessionfactionBuilder
- SqlSessionFactory
- SqlSession
SqlSessionfactionBuilder --> 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;
/**
* @author wuw
* @since 2023-01-31 15:07:13
*/
public class MyBatisIntroductionTest {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
// 1.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 3.创建SqlSession对象
sqlSession = sqlSessionFactory.openSession();
// 4.执行SQL
int count = sqlSession.insert("insertCar");
System.out.println("更新了几条记录:" + count);
// 5.提交
sqlSession.commit();
} catch (Exception e) {
// 回滚
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 6.关闭
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
注意1:默认采用的事务管理器是:JDBC。JDBC事务默认是不提交的,需要手动提交。
步骤7:运行程序,查看运行结果,以及数据库表中的数据
四、引入JUnit
JUnit是专门做单元测试的组件。
- 在实际开发中,单元测试一般是由我们Java程序员来完成的。
- 我们要对我们自己写的每一个业务方法负责任,要保证每个业务方法在进行测试的时候都能通过。
- 测试的过程中涉及到两个概念:
- 期望值
- 实际值
- 期望值和实际值相同表示测试通过,期望值和实际值不同则单元测试执行时会报错。
- 这里引入JUnit是为了代替main方法。
一、使用JUnit步骤:
第一步:创建新模块:
第二步:引入依赖
<?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.powernode</groupId>
<artifactId>junit-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
第三步:
- 编写单元测试类【测试用例】,测试用例中每一个测试方法上使用@Test注解进行标注。
- 测试用例的名字以及每个测试方法的定义都是有规范的:
- 测试用例的名字:XxxTest
- 测试方法声明格式:public void test业务方法名(){}
// 测试用例
public class CarMapperTest{
// 测试方法
@Test
public void testInsert(){}
@Test
public void testUpdate(){}
}
建包写方法:
在test建相应的包和测试类并测试
五、引入日志框架logback
- 引入日志框架的目的是为了看清楚mybatis执行的具体sql。
- 启用标准日志组件,只需要在mybatis-config.xml文件中添加以下配置:【可参考mybatis手册】
mybatis-config.xml文件配置:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
标准日志也可以用,但是配置不够灵活,可以集成其他的日志组件,例如:log4j,logback等。
- logback是目前日志框架中性能较好的,较流行的,所以我们选它。
引入logback的步骤:
第一步:引入logback相关依赖:mybatis.config.xml文件
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
第二步:引入logback相关配置文件(必须:①:文件名叫做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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%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>
- 再次执行单元测试方法testInsertCar,查看控制台是否有sql语句输出
六、MyBatis工具类SqlSessionUtil的封装
- 每一次获取SqlSession对象代码太繁琐,封装一个工具类
package com.powernode.mybatis.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* @author wuw
* @since 2023-02-01 13:18:48
*/
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
/**
* 类加载时初始化sqlSessionFactory对象
*/
static {
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
*
* @return 新的会话对象
*/
public static SqlSession openSession() {
return sqlSessionFactory.openSession(true);
}
}
- 测试工具类,将testInsertCar()改造
-
@Test public void testInsertCar(){ SqlSession sqlSession = SqlSessionUtil.openSession(); // 执行SQL int count = sqlSession.insert("insertCar"); System.out.println("插入了几条记录:" + count); sqlSession.close(); }