1. MyBatis快速入门
1.1 框架介绍
- 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!
- 如图:
1.2 ORM介绍
- ORM(Object Relational Mapping): 对象关系映射
- 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。
- 如图:
1.3 原始jdbc操作(查询数据)
1.4 原始jdbc操作(插入数据)
1.5 原始jdbc操作的分析
- 原始 JDBC 的操作问题分析
- 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能。
- sql 语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护。
- 查询操作时,需要手动将结果集中的数据封装到实体对象中。
- 增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符。
- 原始 JDBC 的操作问题解决方案
- 使用数据库连接池初始化连接资源。
- 将 sql 语句抽取到配置文件中。
- 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射。
- 但是我们自己解决比较麻烦,已经有技术帮我们解决了。
1.6 什么是MyBatis
- mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
- mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
- 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
- MyBatis官网地址:http://www.mybatis.org/mybatis-3/
1.7 MyBatis的快速入门
MyBatis开发步骤:
①添加MyBatis的jar包
②创建Student数据表
③编写Studentr实体类
④编写映射文件StudentMapper.xml
⑤编写核心文件MyBatisConfig.xml
⑥编写测试类1.7.1 环境搭建
数据库数据 ```sql — 创建db14数据库 CREATE DATABASE db1;
— 使用db14数据库 USE db1;
— 创建student表 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, — 学生id NAME VARCHAR(20), — 学生姓名 age INT — 学生年龄 );
— 添加数据 INSERT INTO student VALUES (NULL,’张三’,23),(NULL,’李四’,24),(NULL,’王五’,25);
> **使用步骤如图说下:**> **下面开始演示**:<br />1)导入MyBatis的jar包- mysql-connector-java-5.1.37-bin.jar- mybatis-3.5.3.jar- log4j-1.2.17.jar(这个是日志jar包,先不添加)2) 创建student数据表<br /><br />3) 编写Student实体```javapublic class Student {private Integer id;private String name;private Integer age;//省略get个set方法// 无参有参构造// toString方法}
4)编写StudentMapper.xml映射文件(在src目录下创建)(以后复制即可):
<?xml version="1.0" encoding="UTF-8" ?><!--MyBatis的DTD约束--><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--mapper:核心根标签namespace属性:名称空间,这个名字可以随意起,这个以后有用--><mapper namespace="StudentMapper"><!--select:查询功能的标签id属性:唯一标识resultType属性:指定结果映射对象类型,映射的全类名parameterType属性:指定参数映射对象类型--><select id="selectAll" resultType="com.gjt.bean.Student">SELECT * FROM student</select></mapper>
5) 编写MyBatis核心文件(MyBatis需要两个配置文件,一个是映射配置文件,一个是核心配置文件),依然在src下创建。我们这里作为快速入门,先选用上面这个简单的,只有environments和mappers。
<?xml version="1.0" encoding="UTF-8" ?><!--MyBatis的DTD约束--><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration 核心根标签--><configuration><!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--><environments default="mysql"><!--environment配置数据库环境 id属性唯一标识--><environment id="mysql"><!-- transactionManager事务管理。 type属性,采用JDBC默认的事务--><transactionManager type="JDBC"></transactionManager><!-- dataSource数据源信息 type属性 连接池--><dataSource type="POOLED"><!-- property获取数据库连接的配置信息 --><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://127.0.0.1:3306/db1" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments><!-- mappers引入映射配置文件 --><mappers><!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 --><mapper resource="StudentMapper.xml"/></mappers></configuration>
<?xml version="1.0" encoding="UTF-8" ?><!--MyBatis的DTD约束--><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration 核心根标签--><configuration><!--引入数据库连接的配置文件--><properties resource="jdbc.properties"/><!--配置LOG4J--><settings><setting name="logImpl" value="log4j"/></settings><!--起别名--><typeAliases><typeAlias type="com.itheima.bean.Student" alias="student"/><!--<package name="com.itheima.bean"/>--></typeAliases><!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--><environments default="mysql"><!--environment配置数据库环境 id属性唯一标识--><environment id="mysql"><!-- transactionManager事务管理。 type属性,采用JDBC默认的事务--><transactionManager type="JDBC"></transactionManager><!-- dataSource数据源信息 type属性 连接池--><dataSource type="POOLED"><!-- property获取数据库连接的配置信息 --><property name="driver" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></dataSource></environment></environments><!-- mappers引入映射配置文件 --><mappers><!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 --><mapper resource="StudentMapper.xml"/></mappers></configuration>
1.7.2编写测试代码
List
list = sqlSession.selectList(“StudentMapper.selectAll”); 这里就用到了mapper映射文件中的:namespace和id=”selectAll”
/** 查询全部* */public class StudentTest01{//查询全部功能测试@Testpublic void selectAll() throws IOException {// 1、加载核心配置文件InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");// 2、获取SqlSession工厂对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 3、通过SqlSession工厂对象获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 4、执行映射配置文件中的sql语句,并接收结果List<Student> list = sqlSession.selectList("StudentMapper.selectAll");// 5、处理结果for (Student stu : list) {System.out.println(stu);}// 6、释放资源sqlSession.close();is.close();}}
1.8 知识小结
- 框架 框架是一款半成品软件,我们可以基于框架继续开发,从而完成一些个性化的需求。
- ORM 对象关系映射,数据和实体对象的映射。
MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC。
2. MyBatis相关API
2.1 Resources
org.apache.ibatis.io.Resources:加载资源的工具类。
- 核心方法

我们用自己的方法一样可以拿到字节输入流,只是MyBatis帮我们提供了工具类,稍微方便点 InputStream is = StudentTest01.class.getClassLoader().getResourceAsStream(“MyBatisConfig.xml”);
2.2 构建器SqlSessionFactoryBuilder
- org.apache.ibatis.session.SqlSessionFactoryBuilder:获取 SqlSessionFactory 工厂对象的功能类
- 核心方法

通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
String resource = "org/mybatis/builder/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。
2.3 工厂对象SqlSessionFactory
org.apache.ibatis.session.SqlSessionFactory:获取 SqlSession 构建者对象的工厂接口。
- 核心api
2.4 SqlSession会话对象
- org.apache.ibatis.session.SqlSession:构建者对象接口。用于执行 SQL、管理事务、接口代理。
- 核心api

SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
2.5 相关API小结
3. MyBatis映射配置文件
3.1 映射配置文件介绍
- 映射配置文件包含了数据和对象之间的映射关系以及要执行的 SQL 语句

名称空间可以随便起,最好有意义。根据名称空间和id才能定位到sql语句。
我们这里sql不需要条件,如果需要where查询,那么就需要parameterType来指定参数!
3.2 查询功能
:查询功能标签。 - 属性
id:唯一标识, 配合名称空间使用。
parameterType:指定参数映射的对象类型。
resultType:指定结果映射的对象类型。
- SQL 获取参数: #{属性名}
- 示例

在JDBC中,sql是用占位符,SELECT FROM student WHERE id = ?;然后设置这个占位符。
这里则不是,#{id}是获取参数,其中名字可以随便,不一定要是id。只是id更有意义罢了!
如`SELECT FROM student WHERE id = #{11}`
测试代码!
//根据id查询@Testpublic void selectById() throws IOException {// 1、加载核心配置文件// InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");InputStream is = StudentTest01.class.getClassLoader().getResourceAsStream("MyBatisConfig.xml");// 2、获取SqlSession工厂对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 3、通过SqlSession工厂对象获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 4、执行映射配置文件中的sql语句,并接收结果Student stu = sqlSession.selectOne("StudentMapper.selectById", 1);// 5、处理结果System.out.println(stu);// 6、释放资源sqlSession.close();is.close();}
3.3 新增功能
:新增功能标签。 - 属性 id:唯一标识, 配合名称空间使用。 parameterType:指定参数映射的对象类型。 resultType:指定结果映射的对象类型。
- SQL 获取参数: #{属性名}
- 示例

对于增删改,返回的都是Integer数据,因此ResultType可以不需要写!!!
此时我们的SQL就不能随便写,会报错,可见是根据get方法获取的。对于上面只有一个参数的.对于下面三个sql都是一样的错误。
<insert id="insert" parameterType="com.gjt.bean.Student">INSERT INTO student VALUES (#{11}, #{12},#{22})</insert>INSERT INTO student VALUES (#{1}, #{2},#{3})INSERT INTO student VALUES (#{0}, #{1},#{2})
Error updating database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘11’ in ‘class com.gjt.bean.Student’
测试 // 新增
@Test
public void insert() throws IOException {
_// 1、加载核心配置文件
// InputStream is = Resources.getResourceAsStream(“MyBatisConfig.xml”);
_InputStream is = StudentTest01.class.getClassLoader().getResourceAsStream(“MyBatisConfig.xml”);
_// 2、获取SqlSession工厂对象<br /> _SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);_// 3、通过SqlSession工厂对象获取SqlSession对象<br /> _SqlSession sqlSession = sqlSessionFactory.openSession();_// 4、执行映射配置文件中的sql语句,并接收结果<br /> _int insert = sqlSession.insert("StudentMapper.insert", new Student(null, "赵六", 80));_// 6、释放资源<br /> _sqlSession.close();<br /> is.close();<br />}
测试成功,没有报错,但是数据库没有数据,那是因为??? 我们的SqlSession是手动提交事务的方式!!! 因此要提交事务
或者构建sqlsession时,默认开启自动提交事务
3.4 修改功能
:修改功能标签。 - 属性 id:唯一标识, 配合名称空间使用。 parameterType:指定参数映射的对象类型。 resultType:指定结果映射的对象类型。
- SQL 获取参数: #{属性名}
- 示例

对于增删改,返回的都是Integer数据,因此ResultType可以不需要写!!!
注意事务:或者手动提交,或者提前开启事务提交。
3.5 删除功能
:查询功能标签。 - 属性 id:唯一标识, 配合名称空间使用。 parameterType:指定参数映射的对象类型。 resultType:指定结果映射的对象类型。
- SQL 获取参数: #{属性名}
- 示例

对于增删改,返回的都是Integer数据,因此ResultType可以不需要写!!!
对于一个参数的#{名字},这个名字可以随便写!
注意事务:或者手动提交,或者提前开启事务提交。
- 总结: 大家可以发现crud操作,除了标签名称以及sql语句不一样之外,其他属性参数基本一致。
3.6 映射配置文件小结
4. MyBatis核心配置文件
4.1 核心配置文件介绍
核心配置文件包含了 MyBatis 最核心的设置和属性信息。如数据库的连接、事务、连接池信息等。
如下图: ```java <?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">
<!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--><environments default="mysql"><!--environment配置数据库环境 id属性唯一标识--><environment id="mysql"><!-- transactionManager事务管理。 type属性,采用JDBC默认的事务--><transactionManager type="JDBC"></transactionManager><!-- dataSource数据源信息 type属性 连接池--><dataSource type="POOLED"><!-- property获取数据库连接的配置信息 --><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql:///db1" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments><!-- mappers引入映射配置文件 --><mappers><!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 --><mapper resource="StudentMapper.xml"/></mappers>
<a name="gZLgU"></a>## 4.2 数据库连接配置文件引入- properties标签引入外部文件,在src下创建jdbc.properties```sqldriver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/db1username=rootpassword=root
<!--引入数据库连接的配置文件--><properties resource="jdbc.properties"/>
具体使用,如下配置
<!-- property获取数据库连接的配置信息 --><property name="driver" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" />
4.3 起别名
其实就是解决ResultType和ParameterType里面总是写全类名:如com.gjt.bean.Student,太麻烦!如果我们这里只写一个student多好了。当然你起了别名可用,也可以不用。
:为全类名起别名的父标签。 :为全类名起别名的子标签。 - 属性 type:指定全类名 alias:指定别名
:为指定包下所有类起别名的子标签。(别名就是类名) - 如下图:

具体如下配置
<!--起别名--><typeAliases><typeAlias type="com.gjt.bean.Student" alias="student"/><!--<package name="com.gjt.bean"/>--></typeAliases>
对于
<package name="com.gjt.bean"/>,这个也是很强大的。4.4 总结
5. MyBatis传统方式实现Dao层
5.1 Dao 层传统实现方式
分层思想:控制层(controller)、业务层(service)、持久层(dao)。当然在mybatis下,我们一般不叫dao,叫mapper。
- 调用流程
5.1.1 mapper层
service层
controller层
5.2 LOG4J的配置和使用
- 在日常开发过程中,排查问题时难免需要输出 MyBatis 真正执行的 SQL 语句、参数、结果等信息,我们就可以借助 LOG4J 的功能来实现执行信息的输出。
- 使用步骤:

<!--配置LOG4J--><settings><setting name="logImpl" value="log4j"/></settings>

# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
测试:
F:\java_developer\tools\jdk-8u221-64bit\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:C:\Users\junta\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\212.5080.55\lib\idea_rt.jar=61292:C:\Users\junta\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\212.5080.55\bin -Dfile.encoding=UTF-8 -classpath C:\Users\junta\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\212.5080.55\lib\idea_rt.jar;C:\Users\junta\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\212.5080.55\plugins\junit\lib\junit5-rt.jar;C:\Users\junta\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\212.5080.55\plugins\junit\lib\junit-rt.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\charsets.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\deploy.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\access-bridge-64.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\cldrdata.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\dnsns.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\jaccess.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\jfxrt.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\localedata.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\nashorn.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\sunec.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\sunjce_provider.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\sunmscapi.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\sunpkcs11.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\ext\zipfs.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\javaws.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\jce.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\jfr.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\jfxswt.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\jsse.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\management-agent.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\plugin.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\resources.jar;F:\java_developer\tools\jdk-8u221-64bit\jre\lib\rt.jar;H:\BaiduNetdiskWorkspace\My_Code\My_Code\01_JavaBase\MyBatis\out\production\MyBatis基础;H:\BaiduNetdiskWorkspace\My_Code\My_Code\01_JavaBase\MyBatis\MyBatis基础\libs\log4j-1.2.17.jar;H:\BaiduNetdiskWorkspace\My_Code\My_Code\01_JavaBase\MyBatis\MyBatis基础\libs\mybatis-3.5.3.jar;H:\BaiduNetdiskWorkspace\My_Code\My_Code\01_JavaBase\MyBatis\MyBatis基础\libs\mysql-connector-java-5.1.37-bin.jar;C:\Users\junta\.m2\repository\junit\junit\4.13.1\junit-4.13.1.jar;C:\Users\junta\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.gjt.dao.StudentTest01,selectAllDEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.DEBUG [main] - Class not found: org.jboss.vfs.VFSDEBUG [main] - JBoss 6 VFS API is not available in this environment.DEBUG [main] - Class not found: org.jboss.vfs.VirtualFileDEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFSDEBUG [main] - Find JAR URL: file:/H:/BaiduNetdiskWorkspace/My_Code/My_Code/01_JavaBase/MyBatis/out/production/MyBatis%e5%9f%ba%e7%a1%80/com/gjt/beanDEBUG [main] - Not a JAR: file:/H:/BaiduNetdiskWorkspace/My_Code/My_Code/01_JavaBase/MyBatis/out/production/MyBatis%e5%9f%ba%e7%a1%80/com/gjt/beanDEBUG [main] - Reader entry: Student.classDEBUG [main] - Listing file:/H:/BaiduNetdiskWorkspace/My_Code/My_Code/01_JavaBase/MyBatis/out/production/MyBatis%e5%9f%ba%e7%a1%80/com/gjt/beanDEBUG [main] - Find JAR URL: file:/H:/BaiduNetdiskWorkspace/My_Code/My_Code/01_JavaBase/MyBatis/out/production/MyBatis%e5%9f%ba%e7%a1%80/com/gjt/bean/Student.classDEBUG [main] - Not a JAR: file:/H:/BaiduNetdiskWorkspace/My_Code/My_Code/01_JavaBase/MyBatis/out/production/MyBatis%e5%9f%ba%e7%a1%80/com/gjt/bean/Student.classDEBUG [main] - Reader entry: ���� 4 <DEBUG [main] - Checking to see if class com.gjt.bean.Student matches criteria [is assignable to Object]DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - PooledDataSource forcefully closed/removed all connections.DEBUG [main] - Opening JDBC ConnectionDEBUG [main] - Created connection 398110318.DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@17baae6e]DEBUG [main] - ==> Preparing: SELECT * FROM studentDEBUG [main] - ==> Parameters:DEBUG [main] - <== Total: 4Student{id=1, name='张三', age=23}Student{id=2, name='李四', age=24}Student{id=3, name='王五', age=25}Student{id=5, name='赵六', age=80}DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@17baae6e]DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@17baae6e]DEBUG [main] - Returned connection 398110318 to pool.Process finished with exit code 0


或者构建sqlsession时,默认开启自动提交事务




