开发前的准备
准备数据库表:汽⻋表t_car
确定表中的字段以及字段的数据类型
- guide_price是decimal类型,专⻔为财务数据准备的类型
- produce_time可以用char类型 , 格式’2022-10-11’
使用navicat for mysql⼯具向t_car表中插⼊两条数据
配置IDEA中maven的相关设置
基于Maven开发一个MyBatis程序
编程步骤
第一步New Project: 如创建一个Empty Project,然后设置Project Structure(工程结构), 设置软件开发环境版本和Java的编译版本
第二步New Module: 创建普通的Maven工程,这样生成的目录更标准
第三步:配置Maven工程自动生成的pom.xml文件指定打包方式jar并引入相关依赖
<!--指定打包方式为jar的原因是mybatis封装的是JDBC不需要部署到服务器上即可运行-->
<groupId>com.powernode</groupId>
<artifactId>mybatis-001-introduction</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!--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>
第四步:在resources根目录下新建mybatis核心配置文件mybatis-config.xml , 配置文件的模板可以参考mybatis中文手册
- 这个文件名不是必须叫做mybatis-config.xml,只是大家都采用这个名字
- 这个文件存放的位置可以随意,但为了项目的移植性和健壮性,最好将这个配置文件放到类的根路径下面
- 放到resources目录下的资源文件和配置文件等同于放到了类的根路径下/src路径的一级目录下, 将来打包时都会放到target/classes目录下
resources/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">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/"/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<!--指定XxxMapper.xml文件的路径用来引入文件,resource属性自动会从类的根路径下开始查找并加载资源-->
<mapper resource=""/>
</mappers>
</configuration>
第五步:在resources目录下新建存放sql语句的配置文件XxxMapper.xml, 配置文件的模板可以参考mybatis中文⼿册
- 在命令行中执行的sql语句以分号结尾 , 但配置文件中的SQL语句结尾的分号";"可以省略
- 配置文件名和其存放的位置可以随意,一般命名规范XxxMapper.xml , 放在类的根路径下(resources目录下)
resources\CarMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">
<!--namespace先随意写⼀个-->
<mapper namespace="fdsafdsa">
<!--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>
第六步:在mybatis-config.xml核心配置文件中指定XxxMapper.xml文件的路径用来引入文件
- resource属性的方式引入:这种方式是从类路径当中加载资源
- url属性的方式引入:这种方式是从绝对路径当中加载资源 , url需要指定file:/// + 文件的绝对路径的形式 (注意是三个斜杠)
<!--resource属性的方式引入-->
<mapper resource="CarMapper.xml"/> :这种方式是从类路径当中加载资源。
<!--url需要指定file:/// + 文件的绝对路径的形式-->
<mapper url="file:///d:/CarMapper.xml"/>
第七步:使用ibatis的类库中的内置类连接数据库完成增删改查
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;
public class MyBatisCompleteTest {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
// 获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 获取SqlSessionFactory对象(一般情况下一个数据库对应一个SqlSessionFactory对象)
// ibatis包下的工具类Resources.getResourceAsStream方法默认从类的根路径下开始查找资源,底层是使用ClassLoader类加载器加载资源
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 获取执行sql语句的数据库操作对象SqlSession(开启会话)
// mybatis默认采⽤的事务管理器是JDBC,默认会开启事务,需要我们手动提交事务, 底层实际上会执行:conn.setAutoCommit(false)
sqlSession = sqlSessionFactory.openSession();
// 这种方式实际上是不建议的,因为没有开启事务
// sqlSession = sqlSessionFactory.openSession(true);
// 通过sql语句的id执行对应的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();
}
}
}
}
封装MyBatis⼯具类SqlSessionUtil
每⼀次获取SqlSession对象代码太繁琐,封装⼀个⼯具类SqlSessionUtil用来返回一个SqlSession会话对象
- 工具类中所有的方法都是静态的,不需要new对象直接采用类名即可调用(为了防止new对象构造方法可以私有化)
public class SqlSessionUtil {
private SqlSessionUtil(){}
// SqlSessionUtil工具类在进行第一次类加载的时候,解析mybatis-config.xml文件,创建SqlSessionFactory对象
// 服务器启动时初始化一次sqlSessionFactory对象
private static SqlSessionFactory sqlSessionFactory;
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//每调⽤⼀次openSession()可获取⼀个新的会话对象,该会话需手动提交事务
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
// 每调⽤⼀次openSession()可获取⼀个新的会话,该会话⽀持⾃动提交,一个数据库可以存在多个会话
// return sqlSessionFactory.openSession(true);
}
}