Mybatis 学习之路

本文介绍了Mybatis的基本概念,阐述了其作为优秀持久层框架的优势,包括自定义SQL、存储过程和高级映射等功能。在实践中,文章详细描述了创建第一个Mybatis程序的步骤,包括环境配置、代码编写和JUnit测试。在遇到的错误处理中,作者分享了如何解决资源导出问题、字符编码问题以及空指针异常。最后,文章揭示了一个可能导致空指针异常的隐藏原因,并提供了临时解决方案,强调了Mapper文件不应包含中文内容。
摘要由CSDN通过智能技术生成

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文件里面不能有中文(包括注释)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值