文章目录
一.Mybatis概述
1.1 概念介绍
- Mybatis原名iBatis,是一个基于java持久层的框架,采用了ORM思想,内部封装了JDBC,因此,开发人员只需要关注SQL本身即可,避免了和api打交道。
- Mybatis通过XML或注解的方式对statement进行配置,并通过java对象和statement中的sql的动态参数进行映射生成最终执行的SQL语句,最后由mybatis框架执行SQL,并将结果直接映射为java对象。
1.2 解决的问题
1、数据库连接的创建、释放连接的频繁操作造成资源的浪费从而影响系统的性能。
2、SQL语句编写在代码中,硬编码造成代码不容易维护,实际应用中SQL语句变化的可能性比较大,一旦变动就需要改变java类。
3、使用preparedStatement的时候传递参数使用占位符,也存在硬编码,因为SQL语句变化,必须修改源码。
4、对结果集的解析中也存在硬编码。
二.入门案例
2.1 创建数据库和表
2.2 创建项目,导入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
</dependencies>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugins>
2.3 mybatis配置文件
内容可以从网址复制mybatis网址
datasource中的property值根据自己的数据库进行修改
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
2.4 编写实体类
实体类中的属性必须与列名保持一致
private Integer teamId;
private String teamName;
private String location;
private Date createTime;
2.5 编写ORM映射文件
正常的数据库dao操作都是通过接口+实现方法进行调用。现在通过实体类映射,在实体类xml配置文件中写入sql语句进行dao操作。后期引入dao层可省略此步骤。
2.5.1 XML映射文件必须与实体类在同一个包下面
2.5.2 XML映射文件名称必须是实体类名称一致
- 若创建文件夹直接命名为com.kkb.pojo,实际只有一个文件夹,因此需要根据层级一个个创建。
- 头文件在网址复制即可
<?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="名称必须与映射的类的名字一致,是完全限定名"
后期在mybatis配置文件中配置了别名后,可进行简写-->
<mapper namespace="com.kkb.pojo.Team">
<!-- id="自定义名称,id不能重复;相当于dao中的方法名称"
resultType="使用的要求:实体类中的属性名与表中的列名一致" -->
<select id="queryAll" resultType="com.kkb.pojo.Team">
select * from team
</select>
<mapper>
2.6 映射文件注册到mybatis配置文件中
下图所示仅是方式一,且较为低效,后期引入dao层后将采取新的方式。
<mappers>
<mapper resource="com/kkb/pojo/Team.xml"/>
</mappers>
2.7 配置映射文件的扫描位置
若前面的Team.xml不是写在resource中,而是写在和实体类同级的包中,即在src/java/main路径下,则需进行以下配置,不过实际开发中,为了方便管理,xml文件都是写在resource中。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<!--所在的目录-->
<includes>
<!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<build>
2.8 mybatis接口测试
//mybatis的配置文件--相当于创建工厂的图纸
private String resource = "mybatis.xml";
private SqlSession sqlSession;
@Before
public void before() throws IOException {
//1、读取mybatis的配置文件
Reader reader = Resources.getResourceAsReader(resource);
//2、创建SqlSessionFactory对象,目的是获取sqlSession--根据图纸创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//3、创建可以执行SQL语句的SqlSession--工厂创建产品
sqlSession = sqlSessionFactory.openSession();
}
@Test
public void findAll() {
//4、执行SQL语句
List<Team> teamList = sqlSession.selectList("com.kkb.pojo.Team.queryAll");
//5、循环输出查询的结果
teamList.forEach(t-> System.out.println(t));
}
@After
public void after() {
//6、关闭SqlSession,释放资源
sqlSession.close();
2.9 输入映射-单参传递
多参传递后期引入dao层再讲解
<!--id:相当于方法名
parameterType:参数类型
resultType:方法返回类型
#{id}:相当于占位符?,花括号中内容自定义,无实际意义-->
<select id="findById"
parameterType="int"
resultType="com.kkb.pojo.Team">
select * from team where teamId=#{id}
</select>
//测试案例
Team t = sqlSession.selectOne("com.kkb.pojo.Team.queryOne",1001);
System.out.println(t);
三.Mybatis对象分析
3.1 Resources
用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。
3.2 SqlSessionFactoryBuilder
使用SqlSessionFactoryBuilder的原因
是将SqlSessionFactory这个复杂对象的创建交由Builder来执行,也就是使用了建造者设计模式,此处不多加阐述。
3.3 SqlSessionFactory
SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。相当于线程池
- 默认的 openSession()方法没有参数,相当于openSession(false),进行增删改时不会自动提交事务。
- 若需要自动提交事务,将false改成ture即可。
- 实际开发中一般在service层设置事务的提交,所以opensession方法一般设置成默认方式。
3.4 SqlSession
- 相当于线程池每个线程
- SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话。
- SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法。
3.5 Mybatis架构
四.配置日志文件
4.1 添加依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
4.2 添加日志配置文件
在resource下添加log4j.properties配置文件
4.3 在mybatis配置文件中添加日志配置
<!--配置日志-->
<settings>
<setting name="logImpl" value="LOG4J