1.初识Mybatis
1.1什么是Mybatis以及用途:
1.MyBatis 是一款优秀的持久层框架
2.MyBatis用途:免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
3.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO
官方帮助使用的中文文档与GitHub下载的地址如下(也可在GitHub上去搜,点击releases进行下载):
- Mybatis官方文档 : mybatis – MyBatis 3 | 简介
- GitHub : https://github.com/mybatis/mybatis-3/releases
1.2持久化:
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
-
即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
-
JDBC就是一种持久化机制。文件IO也是一种持久化机制。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的
-
内存断电后数据会丢失,对于一些重要的对象需要持续保存的
-
内存过于昂贵
1.3持久层:
-
完成持久化工作的代码块 . ----> dao层
-
大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
-
不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多是必不可少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许是,但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专注于数据持久化逻辑的实现.
-
与系统其他部分相对而言,层的界限是十分明显的【就是用来操作数据库而存在的】
1.4为什么需要Mybatis
-
Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 .
-
传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等... , 通过框架可以减少重复代码,提高开发效率 .
-
MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
-
所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!技术没有高低之分,只有使用这个技术的人有高低之别
2.第一个MyBatis程序
2.1 开始前的准备工作
1.首先创建一个普通的Maven项目,连接数据库,在pom.xml中导入所需要的基本的mysql与mybatis与用来进行测试的junit的依赖
<!--导入依赖-->
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
2.因为需要SqlSessionFactor1的对象,所以官方文档下说提供了三行代码
这三行代码每次都要用,我们在utils包下把他提取成一个名为MybatisUtils的公共类
package com.kuang.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;
import java.io.InputStream;
//sqlSessionFactory --> sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
//使用mybatis的第一步,获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// Session完全包括了面向数据库执行SQL命令所需的所有方法 就像JDBC中的preparedStatment对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
3.在resources下的定义的mybatis-config.xml下编写他的配置文件(也在官网中),只需要修改里面的选项参数
以下为笔者的参数(由于笔者用的数据库是8.x,所以驱动有cj,另需要设计时区),可根据自己参数进行修改
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<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/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
</configuration>
2.2 进行常规的操作
1.编写与数据库有关的pojo下的实体类
2.编写dao层下的关于实体类例如叫UserMapper的接口
2.3 利用Mapper.xml文件代替原来JDBC的接口实现类
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.kuang.dao.UserMapper">
<!--id绑定对应的方法 标签体专注于sql的编写 返回值类型专注于返回值
不用再写resultset去遍历 在测试时直接调利用反射获取接口对象后的getUserList方法
-->
<select id="getUserList" resultType="com.kuang.pojo.User">
select * from mybatis.user
</select>
</mapper>
2.4进行代码测试
1.在这个绿色java下进行测试,在下面所对应包与类名最好是与程序所写的包与类名对应的一致
2.1第一步:获得SqlSession对象
2.2调用对象中的getMapper方法,其中参数是利用反射获取Class对象,会返回一个接口对象
2.3调用自己定义的接口的方法,笔者定义的是getUserList(),在进行遍历输出
2.4为确保数据库资源都能够被正确地关闭,所以用try-finally来进行代码的优化
package com.kuang.dao;
import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();;
try{
//方式一:getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
//方式二:不推荐使用,因为写死了,List就返回List,Map就返回Map,根据方法的返回值去返回
// List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
}finally{
//关闭SqlSession
sqlSession.close();
}
3.写第一个Mybatis程序中遇到的Bug以及处理方法
1.Cannot access com.kuang.dao.User
笔者在写dao层下的UserMapper接口时一直不能导入pojo包下User实体类
经历自动导包的操作都勾上的情况下仍出现同一个工程下导不了包的情况
在File->Invalidate Cashe中 重启IDEA 解决此报错
2.测试时java.lang.ExceptionInInitializerError的错误
1.检查是否放行静态资源
由于Maven的约定大于配置,所以配置文件最好放在resources包下
笔者由于学习跟上老师的课程,放在java包下,会出现Maven静态资源过滤问题,
所以需要在父工程的pom.xml中配置如下代码(为防止配置不成功,可以在子工程的pom.xml文件下也配置)
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
此时测试时target->classe下的dao层会出现UserMapper.xml的配置文件(如不成功可以刷新Maven)
2.mybatis的配置文件是否有错
3.看网课时评论区朋友遇到的错误:
xml文件中不能存在中文,把第一行的utf-8的横杠去掉