我的第一个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


三、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文件夹中

我的第一个MyBatis

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&amp;failOverReadOnly=false&amp;useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;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&amp;failOverReadOnly=false&amp;useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;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


四、总结错误: 

本次mybatis框架的第一次搭建,真的是费劲了九牛二虎之力,之前自己有搭建过,时间长忘记了,但是这次的错误真的让自己很崩溃~~~,因为错误真的太多了,具体有如下:

路径问题、xml文件无法编译导出问题、找不到实体类问题、空指针异常问题、数据库连接失败

(1)路径问题:找不到userMapper.xml

每一个Mapper.xml都需要在核心配置文件中进行注册,可能是核心配置文件中找不到Mapper.xml路径,一般是所在:包名.文件名

我的第一个MyBatis

(2)xml 文件无法编译导出问题

由于maven工程不会编译src文件下的xml文件,所以项目运行时无法在classes文件中找到编译后的xml文件,即会报无法找到Mapper.xml资源异常。

 需要在POM.xml文件中加入:

我的第一个MyBatis

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

一般也是:namespace=“包名.接口名 ”,resultType=“包名.类名 ”

我的第一个MyBatis

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

我的第一个MyBatis

 不加类型:执行成功

我的第一个MyBatis

(5)数据库连接异常:这也是让我最头疼的一个,什么设置时区、更改配置文件的:

<property name="url" value="jdbc:mysql://localhost:3306/mybatis?autoReconnect=true&amp;failOverReadOnly=false&amp;useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"/>

也弄过、在数据库配置上设置,把数据库连接有效时间设置长一点,比如设置12小时或者24小时也搞了、Mysql也重启了,这些都弄了都还报错,最后是数据库连接驱动和mysql的版本不一致,才导致无法连接数据库,重新在POM.xml 文件中更改驱动版本号才能连接:

我的第一个MyBatis

我的第一个MyBatis

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

相关推荐