第一个程序
一、resources目录
放在resources目录的一般是资源文件、配置文件,直接放在该路径的资源相当于放到了类的根路径下。
二、开发步骤
1.打包方式jar
<!--打包方式jar-->
<packaging>pom</packaging>
2.引入依赖
mybatis依赖
mysql驱动依赖
<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.30</version>
</dependency>
</dependencies>
3.编写mybatis核心配置文件-mybatis-config.xml
(从XML中构建SqlSessionFactory),通常放在类的根路径下
<?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>
<!--开启mybatis对标准日志的实现-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</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://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 执行xxxMapper.xml文件的路径-->
<mapper resource="carMapper.xml"/>
</mappers>
</configuration>
4.编写xxxMapper.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语句的唯一标识-->
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null ,'1003','丰田霸道',30,'2000-10-11','燃油车')
</insert>
</mapper>
5.在mybatis-config.xml文件中指定xxxMapper.xml文件的路径
(注意:resource属性会自动从类的根路径下开始查找资源)
<!-- 执行xxxMapper.xml文件的路径-->
<mapper resource="carMapper.xml"/>
6.编写MyBatis程序
- 在MyBatis中负责执行SQL语句的对象叫做SqlSession
- SqlSession是专门用来执行SQL语句的,是一个JAVA程序和数据库之间的一次会话。
- 要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来生产SqlSession对象。而SqlSessionFactory需要SqlSessionFactoryBuilder对象的build方法来获取。
public class MyBatisIntroduction {
public static void main(String[] args) throws Exception{
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");//默认从类的根路径下寻找
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);//一般一个数据库对应一个SqlSessionFactory对象
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行sql语句
int count= sqlSession.insert("insertCar");//返回值是影响数据库表当中的记录条数
System.out.println("插入了几条记录:"+count);
//手动提交
sqlSession.commit();
}
}
三、从XML中构建SqlSessionFactory对象
四、mybatis有两个配置文件
mybatis-config.xml 核心配置文件,主要配置连接数据库的信息等
xxxMapper.xml 编写SQL语句的配置文件(一个表一个)
五、一些细节
六、mybatis的事务管理机制
在mybatis-config.xml文件中,可以通过以下配置进行Mybatis的事务管理
<transactionManager type="JDBC"/>
type属性的值包括两个:
JDBC(jdbc)
MANAGED(managed)
在mybatis中提供了两种事务管理机制:
JDBC事务管理器
MANAGED事务管理器
JDBC事务管理器:
mybatis框架自己管理事务,采用原生的JDBC代码去管理事务
conn.setAutoCommit(false):开启事务。
…业务处理…
conn.commit();手动提交事务
MANAGED事务管理器:
mybatis不再负责事务的管理,交给其他容器来负责, 比如spring.
七、完整程序
xxxMapper.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="org.mybatis.example.BlogMapper">
<!--insert语句,id是这条SQL语句的唯一标识-->
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null ,'1003','丰田霸道',30,'2000-10-11','燃油车')
</insert>
</mapper>
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/powernode"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 执行xxxMapper.xml文件的路径-->
<mapper resource="carMapper.xml"/>
</mappers>
</configuration>
MyBatisCompleteTest.java
package com.mybatis;
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程序
*/
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();
}
}
}
}
pom.xml
<?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>org.example</groupId>
<artifactId>untitled</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式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.30</version>
</dependency>
<!-- 引入junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
程序改进-封装工具类
第一次改进
public static SqlSession openSession(){
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
//SqlSessionFactory对象:一个SqlSessionFactory对应一个environment,一个environment通常是一个数据库
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
缺点:sqlSessionFactory其实只需要创建一次就好了,不需要多次创。
第二次改进——最终版本
package 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;
import java.io.IOException;
/**
* mybatis工具类
*/
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
//工具类的构造方法是私有化的
//工具类中所有方法都是静态的,直接采用类名即可调用,不需要new对象
//为了防止new对象,构造方法私有化
private SqlSessionUtil(){}
//类加载时执行
//SqlSessionUtil工具类在进行第一次加载的时候,解析mybatis-config.xml文件,创建SqlSessionFactory对象
static{
try {
sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取会话对象
* @return 会话对象
*/
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
}
关于mybatis集成日志组件
mybatis常见的集成的日志组件
SLF4J(沙拉风),这是一个日志标准,其中有一个框架叫做logback,它实现了沙拉风规范。
LOG4J
LOG4J2
STDOUT_LOGGING
其中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志。只要开启即可。
开启方式:在mybatis-config.xml文件中使用settings标签进行配置开启。
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
这个标签应该出现在environments标签之前。
如果想使用更加丰富的配置,可以继承第三方的log组件
集成logback日志框架
logback日志框架实现了slf4j标准。
第一步:引入logback的依赖
<!--引入logback的依赖,这个日志框架实现了slf4j规范-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
第二步:引入logback所必须的xml配置文件。
这个配置文件的名字必须叫做:logback.xml或logback-test.xml。
必须放在类的根路径下
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件修改时重新加载,默认true -->
<configuration debug="false">
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!-- 输出日志记录格式 -->
<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>