我的第一个MyBatis
一、简介
Mybatis:数据持久层框架,简化JDBC的操作,持久化即将数据从瞬态转换为持久态,保护数据的安全,传统的JDBC(Java数据库连接工具),要编写很多重复繁琐的代码去对数据库CRUD,但是引入MyBatis持久层框架后,只需要编写简单的代码就能对数据库进行CRUD,提高程序的开发效率
二、数据库文件:
CREATE TABLE `user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(15) DEFAULT NULL, `age` int(3) DEFAULT NULL, `sex` varchar(2) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

三、MyBatis项目的配置步骤:
1、MyBatis的核心配置文档:https://mybatis.org/mybatis-3/zh/configuration.html#properties
2、创建maven工程:
a.从mvnreposity网址中查找到MyBatis、MySql连接驱动的依赖地址(mysql-connector-java连接驱动的版本必须和数据库的版本一致不然会报错),并存放到pom.xml文件的<dependencies> </dependencies>标签中。
注意:如果连接数据库的驱动的版本和数据库版本不一致,就会产生数据库连接异常
mvnreposity地址:https://mvnrepository.com
b.在src-->main-->resources,文件下,创建mybatis配置文件mybatis-config.xml,配置文件中主要用于记录数据库的连接信息
注意:在intelliji idea开发工具中,项目运行时不会自动取编译src文件中的任何.xml文件,即不会在classes文件中生成字节码文件,这样就找不到xml文件,就会产生异常can‘t not find .xml exception
c.以文件字节输入流的形式去加载mybatis配置文件mybatis-config.xml,通过SqlSessionFactoryBuilder().build(inputStream)创建SqlSessionFactory,再通过 sqlSessionFactory创建sqlSession对象,即可创建SQL对象,用于对数据库进行CRUD
注意:创建的 sqlSessionFactory对象并没有类型,如果你指定它为 sqlSessionFactory类型就会报空指针异常:java.lang.NullPointerException
d.编写代码:
(1)实体类:一张数据库表对应一个Java的实体类,一般要求数据库字段的大小写和属性的大小写一致
(2)Dao接口:数据应用层
(3)接口实现类实现Dao接口
(4)编写mapper.xml文件,对数据库进行增删改查操作
(5)测试
3、创建Mybatis工程的具体步骤:
我自己工程的目录结构:mybatis-config.xml一般放在resources文件夹中

a.在创建好maven工程,并配置好本地仓库后,在src\main\resources文件夹中创建mybatis核心配置文件: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?autoReconnect=true&failOverReadOnly=false&useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolMaximumActiveConnections" value="300000" />
<property name="poolMaximumIdleConnections" value="30" />
<property name="poolPingEnabled" value="true"/>
<property name="poolPingQuery" value="select 1"/>
<property name="poolPingConnectionsNotUsedFor" value="1800"/>
</dataSource>
</environment>
</environments>
</configuration>注意:任何的xml文件中都不要加注释,不然会报错
b.编写接口、编写数据库表对应的实体类(用于保存从数据库中读取到记录)
package Dao;
import java.util.List;
public interface userDao {
List<entity.user> getuserlist();
}package entity;
public class user {
private int id;
private String name;
private int age;
private char sex;
private String location;
public user() {
}
public user(int id, String name, int age, char sex, String location) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.location = location;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", name=‘" + name + ‘\‘‘ +
", age=" + age +
", sex=" + sex +
", location=‘" + location + ‘\‘‘ +
‘}‘;
}
}c.编写一个类MybatisUtils,以字节流的形式加载核心配置文件:mybatis-config.xml,并通过SqlSessionFactoryBuilder().build(inputStream)创建SqlSessionFactory,
再通过 sqlSessionFactory创建sqlSession对象
package com;//import jdk.internal.loader.Resource;
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;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;//提升作用域, 才能用在public static SqlSession getSqlSession()方法中
static{
try {
// a.以流的形式加载核心配置文件mybatis-config.xml;
// b.再创建sqlsessionfactory对象,并通过qlsessionfactory对象创建sqlsession会话
InputStream inputStream = null;
String resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//使用MyBatis第二步:通过sqlsessionfactory获取sqlsession对象:
public static SqlSession getSqlSession()
{
return sqlSessionFactory.openSession();
}
}d.编写接口实现类:Mapper.xml,如果我们用传统的jdbc连接数据库的话,实现类是一个Java类,但是引用Mybatis框架后,实现类在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="Dao.userDao">
<select id="getuserlist" resultType="entity.user">select id,name,sex,age,location from mybatis.user </select> </mapper>注意:上述提示过编写任何的xml 文件都不要加注释,不然会报错;且sql语句中不能使用 * 号,必须把所有字段都写出来,
其中namespace、resultType必须加包路径,不然返回值类型找不到
namespace:绑定接口userDao
id:表示执行userDao接口中getuserlist方法
resultType:返回到实体类user中
e.每一个Mapper.xml 必须在mybatis 核心配置文件中注册:
<?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?autoReconnect=true&failOverReadOnly=false&useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolMaximumActiveConnections" value="300000" />
<property name="poolMaximumIdleConnections" value="30" />
<property name="poolPingEnabled" value="true"/>
<property name="poolPingQuery" value="select 1"/>
<property name="poolPingConnectionsNotUsedFor" value="1800"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/userMapper.xml"/>
</mappers>
</configuration>f. 编写测试代码:
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import com.MyBatisUtils;
import java.util.List;
public class userDaotest {
@Test
public void test()
{
try{
SqlSession sqlSession = MyBatisUtils.getSqlSession();//获取session会话
Dao.userDao userDao = sqlSession.getMapper(Dao.userDao.class);//拿到接口实现类,即userMapper.xml文件
List<entity.user> userList=userDao.getuserlist();//执行userMapper.xml里面的getuserlist()方法
for (entity.user user : userList) {
System.out.println(user);
}}catch(NullPointerException E){
E.printStackTrace();
System.out.println(E);
}
}
}g.在进行测试之前,我的两个配置文件分别放在src/main/resources、src/main/com目录下,由于maven的不会编译src文件下的xml文件,所以项目运行时无法在classes文件中找到编译后的xml文件,即会报无法找到资源异常。
需要在POM.xml文件中加入:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/com</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>h.测试结果:

四、总结错误:
本次mybatis框架的第一次搭建,真的是费劲了九牛二虎之力,之前自己有搭建过,时间长忘记了,但是这次的错误真的让自己很崩溃~~~,因为错误真的太多了,具体有如下:
路径问题、xml文件无法编译导出问题、找不到实体类问题、空指针异常问题、数据库连接失败
(1)路径问题:找不到userMapper.xml
每一个Mapper.xml都需要在核心配置文件中进行注册,可能是核心配置文件中找不到Mapper.xml路径,一般是所在:包名.文件名

(2)xml 文件无法编译导出问题
由于maven工程不会编译src文件下的xml文件,所以项目运行时无法在classes文件中找到编译后的xml文件,即会报无法找到Mapper.xml资源异常。
需要在POM.xml文件中加入:

(3)找不到实体类异常:找不到实体类的话主要是userMapper.xml 文件中的namespace=“ ”,resultType=“ ” ,接口路径和实体类路径没给对,
一般也是:namespace=“包名.接口名 ”,resultType=“包名.类名 ”

(4)空指针异常:创建sqlSessionFactory对象时,并没有具体的类型,如果加类型:空指针异常

不加类型:执行成功

(5)数据库连接异常:这也是让我最头疼的一个,什么设置时区、更改配置文件的:
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?autoReconnect=true&failOverReadOnly=false&useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"/>
也弄过、在数据库配置上设置,把数据库连接有效时间设置长一点,比如设置12小时或者24小时也搞了、Mysql也重启了,这些都弄了都还报错,最后是数据库连接驱动和mysql的版本不一致,才导致无法连接数据库,重新在POM.xml 文件中更改驱动版本号才能连接:


总结:生活的奔波让人头大,bug再次雪上加霜,这就是第一次搭建Mybatis,希望能慢慢学习进步吧,又是心累的一天!