请注意下面这段话!!!
大家好呀,2022年最新版MyBatis教程来啦,本文章是第一章节,我会将MyBatis技术分成2-3个章节来讲,决心要把MyBatis讲清楚,讲明白了,本教程适合复习MyBatis的人群以及新手来学习MyBatis框架,请不要嫌文章太长,文字太多,而划走,相信我,只要认真慢慢看完这篇文章,你一定会有很大收获的,浏览本文章大概耗时20-30分钟,本教程是基于尚硅谷2022MyBatis教程,如果有时间允许的话,那就去b站看视频学习吧。
一、MyBatis简介
1、MyBatis的历史
MyBatis最初是Apache的一个开源项目iBatis,
2010年6月这个项目由Apache Software Foundation迁移到了Google Code。
随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。
代码于2013年11月迁移到Github。
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
2、MyBatis特性
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通的Java对象)映射成数据库中的记录
4) MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
3.MyBatis下载地址
MyBatis下载地址:https://github.com/mybatis/mybatis-3
下载完成之后是一个压缩包。
如下图所示:
压缩包解压之后,里面的内容是这样的。
如下图所示:
接下来就是代码环节了
1、配置开发环境
IDE:idea 2021.1
构建工具:maven 3.6.3(我是用的idea自带的maven)
MySQL版本:MySQL 8.0
MyBatis版本:MyBatis 3.5.7
2、创建maven工程
创建完的maven项目的目录应该是下图所示这样,有些小伙伴选择了webapp模板,main目录下面还会有一个webapp文件夹。
3、引入依赖
<dependencies>
<!-- Mybatis的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试的依赖,也就是单元测试的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL的驱动,version对应你的数据库大版本号,
比如5.5和5.7版本的MySQL数据库,驱动的version只要是5开头就行 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.37</version>
</dependency>
</dependencies>
4、然后就是创建MyBatis的核心配置文件
在resource目录下面,创建mybatis-config.xml文件,当然不一定要这个名字,此时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:设置默认使用的环境的id
-->
<environments default="development">
<!--
environment:设置具体的连接数据库的环境信息
属性:
id:设置环境的唯一标识,可通过environments标签中的default设置某一个环境的id, 表示默认使用的环境
-->
<environment id="development">
<!--transactionManager:设置事务管理方式
属性:
type:设置事务管理方式,type="JDBC|MANAGED"
type="JDBC":设置当前环境的事务管理都必须手动处理
type="MANAGED":设置事务被管理,例如spring中的AOP
-->
<transactionManager type="JDBC"/>
<!--
dataSource:设置数据源
属性:
type:设置数据源的类型,
type="POOLED|UNPOOLED|JNDI"
type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从 缓存中直接获取,不需要重新创建
type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建
type="JNDI":调用上下文中的数据源 -->
<dataSource type="POOLED">
<!-- 设置驱动类的全类名 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 设置连接数据库的连接地址 -->
<property name="url" value="jdbc:mysql://localhost:3306/MyBatis"/>
<!-- 设置连接数据库的用户名 -->
<property name="username" value="root"/>
<!-- 设置连接数据库的密码 -->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
至此数据库算是配置好了,但是仅仅配置好了数据库还不行,我们还需要创建数据库呀,还有数据表。
数据库:mybatis
数据表:t_user
数据表的结构如下:
因为一张数据表对应一个实体类,所以我们需要创建一个User类,并生成如下内容。
1.无参构造
2.有参构造
3.get和set方法
4.toString方法
然后还需要创建一个UserMapper接口。
MyBatis框架的每一个接口都和一个xml文件相对应,俗称“映射”,也就是写一个接口,就要写一个同名的xml文件,我们刚刚创建了UserMapper接口,所以我们现在创建一个UserMapper.xml文件,我们现在resource下创建一个mappers目录,然后在mappers目录下,创建一个UserMapper.xml文件
目前UserMapper.xml文件是空的,所以我们需要加入一些配置,将我如下的代码复制到UserMapper.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="">
</mapper>
至此,文件是都创建完成了,但是mybatis怎么知道你把UserMapper.xml文件创建在哪里了呢,是的,mybatis并不知道你将UserMapper.xml文件创建在哪里了,所以我们需要告诉一下mybatis框架,当然是去mybatis-config.xml告诉它啦,我们在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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
我们主要是来看看下面这里!!!
<!--我们引入映射文件-->
<mappers>
<!--
resource: 这是UserMapper.xml文件的路径,
也就是告诉mybatis框架,你创建的的映射文件在哪里
-->
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
有些小伙伴不禁要问了,配置了这么多东西,配置完了吗,我想玩玩mybatis框架了?
博主在这里告诉大家,还有亿点点配置哈哈哈,好吧好吧,还需要最后一个配置。
我们只是将UserMapper.xml文件的位置告诉了mybatis框架,可是大家别忘记了,UserMapper.xml和UserMapper接口,才是相亲相爱的一对,和情侣一样是不可分开的,UserMapper.xml需要找到UserMapper接口,那么怎么找呢?
大家仔细看一下UserMapper.xml文件,mapper标签的namespace属性,namespace属性就是UserMapper.xml文件寻找UserMapper接口的地方,可以大致理解为名字,UserMapper就是名字,但是要是全类名,所以是com.atguigu.mybatis.mapper.UserMapper
至此所有的配置都已经完成了,我们快乐的敲代码了。
1.先在UserMapper接口中,定义一个方法
2.在UserMapper.xml文件中创建一个映射此方法的语句,之前不是说了嘛,UserMapper接口和UserMapper.xml文件是相亲相爱的一对,所有的东西都是成双成对的,这个是插入操作,所以需要使用insert标签,代码如下图所示:
接下来我们就可以测试了,看看我们的配置有没有成功
我们需要创建一个测试类,然后在类里面创建一个测试方法。
测试类代码如下:
package com.atguigu.mybatis.test;
import com.atguigu.mybatis.mapper.UserMapper;
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;
import java.io.InputStream;
public class MyBatisTest {
@Test
public void testCRUD() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过mybatis核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,括号里面的参数,是设置自动提交事务的,
// 默认是false,false就是需要自己调用commit方法,插入操作才会生效
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过SqlSession对象获取接口对象,传入的参数,是接口的class对象,
// 底层采用代理模式创建接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//通过接口对象,调用接口中的方法
int result = userMapper.insertUser();
//返回的result,是影响行数
System.out.println("结果: " + result);
}
}
运行结果如下:
我们来看一下数据库,看看是否插入成功,很清楚,插入成功
接下来我们来执行一下修改操作,和删除操作。因为查询操作有返回值,放后一点将。
修改操作
其实修改操作的步骤和插入一样的,也是如下2步
1.UserMapper接口中定义一个修改方法
2.UserMapper.xml文件中,创建此方法的映射标签,什么操作就用什么标签
3.进行测试,测试类代码如下
package com.atguigu.mybatis.test;
import com.atguigu.mybatis.mapper.UserMapper;
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;
import java.io.InputStream;
public class MyBatisTest {
@Test
public void testCRUD() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过mybatis核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,括号里面的参数,是设置自动提交事务的,
// 默认是false,false就是需要自己调用commit方法,插入操作才会生效
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过SqlSession对象获取接口对象,传入的参数,是接口的class对象,
// 底层采用代理模式创建接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//通过接口对象,调用接口中的方法
// int result = userMapper.insertUser();//插入操作
int result = userMapper.updateUser();//修改操作
//返回的result,是影响行数
System.out.println("结果: " + result);
}
}
运行结果如下图所示:
那我们来看看数据库的数据有没有发生改变吧,很明显,修改成功。
删除操作
删除操作,和插入操作,以及修改操作一样。
1.UserMapper接口添加删除方法
2.在UserMapper.xml文件中添加删除方法的映射
3.测试类代码如下
package com.atguigu.mybatis.test;
import com.atguigu.mybatis.mapper.UserMapper;
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;
import java.io.InputStream;
public class MyBatisTest {
@Test
public void testCRUD() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过mybatis核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,括号里面的参数,是设置自动提交事务的,
// 默认是false,false就是需要自己调用commit方法,插入操作才会生效
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过SqlSession对象获取接口对象,传入的参数,是接口的class对象,
// 底层采用代理模式创建接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//通过接口对象,调用接口中的方法
// int result = userMapper.insertUser();//插入操作
// int result = userMapper.updateUser();//修改操作
int result = userMapper.deleteUser();//删除操作
//返回的result,是影响行数
System.out.println("结果: " + result);
}
}
运行结果:
数据库效果:
接下来我们说一下查询操作,小伙伴们要认真听呀!!!
查询操作,和增加,删除,修改是差不多的,唯一要注意的就是返回值。
1.UserMapper接口编写查询方法
2.UserMapper.xml文件,创建此方法的映射标签
3.测试代码
package com.atguigu.mybatis.test;
import com.atguigu.mybatis.mapper.UserMapper;
import com.atguigu.mybatis.pojo.User;
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;
import java.io.InputStream;
import java.util.List;
public class MyBatisTest {
@Test
public void testCRUD() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过mybatis核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,括号里面的参数,是设置自动提交事务的,
// 默认是false,false就是需要自己调用commit方法,插入操作才会生效
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过SqlSession对象获取接口对象,传入的参数,是接口的class对象,
// 底层采用代理模式创建接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//通过接口对象,调用接口中的方法
// int result = userMapper.insertUser();//插入操作
// int result = userMapper.updateUser();//修改操作
// int result = userMapper.deleteUser();//删除操作
List<User> userList = userMapper.selectAllUser();//查询操作
//打印返回的结果
for (User user:userList) {
System.out.println(user);
}
}
}
控制台打印结果:
mybatis-config文件详解
这里告诉大家一个小技巧,我们可以使用log4j日志功能,只需要两步就可以啦。
1.在pom.xml文件中,引入log4j的依赖
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.在resources目录下,创建log4j.xml文件,并将如下内容粘贴到,log4j.xml文件中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
然后,再次测试查询操作, 就会打印sql语句和参数了