我的第一个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,希望能慢慢学习进步吧,又是心累的一天!