Mybatis是什么:
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
创建第一个mybatis程序
1.配置环境
mavan3.6.3+mysql8.0.23 ,数据库建好相关的表
3.编写代码
4.juint测试
错误处理:
由于mavan约定大于配置,导致写在java里面的资源可能无法导出,所以在pom.xml里面加入过滤器
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
遇到bug
百度解决方法ing
1.将mybatis的配置头文件改成utf8
错误变成了
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 15; 1 字节的 UTF-8 序列的字节 1 无效。
3.定位到是第7句加了注释后出了问题,删除注释后,bug变成
java.lang.NullPointerException
at utils.MybatisUtils.getSqlSession(MybatisUtils.java:26)
at dao.UserDaoTest.test(UserDaoTest.java:13)
4.定位到
报空指针异常,检查一下导包有无错误,无,资源文件有无写错,也无
这个报的是空指针异常,一般情况下是你没有创建调用时候所用的对象
修改一下sql语句,发现错误没有变化,可以认为sql语句根本不执行
到工具类里面查看,可以看到把测试放到工具类里面是有结果的。
经过研究发现在static代码块里面sqlSessionFactory是非空
但是:这里sqlsessionfactory是空的很奇怪
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
最终临时解决办法:
把mybatisutils里面的内容改成
package utils;
import dao.UserDao;
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 pojo.User;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
//工具类 sqlSessionFactory ---》sqlSession
public class MybatisUtils {
//静态代码块,在加载类的时候就使用
private static SqlSessionFactory sqlSessionFactory;
/* static {
try{
//使用Mybatis第一步,获取sqlSessionFactory对象,
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}*/
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
public static SqlSession getSqlSession(){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory.openSession();
}
}
最终解决办法:
package 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.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 不需要重新声明
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
注意一点就是mapper文件里面不能有中文(包括注释)