mybatis入门

  • 官网参考
  • 本博客将会创建一个最基本的mybits项目

一. 新建maven项目

  • 新建父工程
  • 删除src文件夹
  • 在父工程中新建子工程(new Model)

mybatis入门_第1张图片
mybatis入门_第2张图片
mybatis入门_第3张图片
mybatis入门_第4张图片

二. 导入依赖

  • 本项目将依赖三个jar包,从Maven仓库中导入Maven仓库
  • mysql
  • mybatis
  • junit测试
    mybatis入门_第5张图片
    
    <dependencies>
        
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.21version>
        dependency>

        
        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.5version>
        dependency>

        
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
            <scope>testscope>
        dependency>
    dependencies>
  • 除此之外,maven手动开启资源过滤器,防止导出资源失败,在末行加上:
    
    <build>
        <resources>
            <resource>
                <directory>src/main/javadirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>
            <resource>
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>truefiltering>
            resource>
        resources>
    build>

三. 新建数据库,并连接

mybatis入门_第6张图片

  • 配置在resources目录下新建mybatis-config.xml配置文件,用于配置数据库,在创建SqlSession的工具类将会用到

mybatis入门_第7张图片

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?useSSL=true&useUnicode=true;characterEncoding=UTF-8&serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="MySQLqdl0661"/>
            dataSource>
        environment>
    environments>

-链接数据库

mybatis入门_第8张图片

四. 从 XML 中构建 SqlSessionFactory工具类

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
mybatis入门_第9张图片

package com.LinXiaoDe.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.IOException;
import java.io.InputStream;

//工具类,返回SqlSession对象
public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static {
            //获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
        }
    }

    //返回SqlSession对象,该对象可以直接操作数据库
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

五. 创建User实体类,与数据库的数据一一对应:

mybatis入门_第10张图片

六. DAO接口和实现接口的Mapper

  • DAO接口
public interface UserDao {
    //获取对象
    public List<User> getUsers();
}

接口实现类由原来的Impl转化为一个Mapper文件,而不需要繁杂的数据库实现操作

(1)创建Mappper,绑定接口

mybatis入门_第11张图片

  • namespace命名空间要指定到包UserDao下
  • id:每个id对应Dao中的同名接口
  • resultType:返回类型,要从根目录指定到返回对象(如:“com.LinXiaoDe.pojo.User”)
  • mapper中写sql语句




<mapper namespace="com.LinXiaoDe.dao.UserDao">
    <select id="getUsers" resultType="com.LinXiaoDe.pojo.User">
    select * from mybatis_db.user_t
  select>
mapper>

(2)注册Mapper

  • 每一个Mapper文件都要在mybatis核心配置文件中注册
  • resource属性要用目录的形式指定到Mapper文件

mybatis入门_第12张图片

  <!--每一个Mapper文件都要在mybatis核心配置文件中注册!-->
  <mappers>
      <mapper resource="com/LinXiaoDe/dao/userMapper.xml"></mapper>
  </mappers>

七. Junit测试

测试类路径尽量和原路径要保持一致(根目录不同):
mybatis入门_第13张图片

  • 从工具类中获取sqlSession对象
  • 执行接口方法
  • 打开一个 SqlSession,返回一个响应后,就关闭它,官方建议用try-catch-finally
    每个线程都应该有它自己的 SqlSession 实例,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:
public class test {
    @Test
    public void test(){

        SqlSession sqlSession = null;

        try{
            //第一步,从工具类中获取sqlSession对象
            sqlSession=MyBatisUtil.getSqlSession();
            //第二步,执行SQL
            UserDao mapper= sqlSession.getMapper(UserDao.class);
            List<User> users= mapper.getUsers();
            //第三步遍历
            for (User user:users){
                System.out.println(user);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭sqlSession
            sqlSession.close();
        }
    }
}

  • 运行结果:
    mybatis入门_第14张图片

  • 报错1,绑定异常——未注册Mapper文件

mybatis入门_第15张图片

mybatis入门_第16张图片

  • 报错2:初始化异常失败
    mybatis入门_第17张图片
    在父子工程中的pom.xml中都要maven手动开启资源过滤器,方式导出资源失败
<bulid>
<resources>
   <resource>
       <directory>src/main/javadirectory>
       <includes>
           <include>**/*.propertiesinclude>
           <include>**/*.xmlinclude>
       includes>
       <filtering>falsefiltering>
   resource>
   <resource>
       <directory>src/main/resourcesdirectory>
       <includes>
           <include>**/*.propertiesinclude>
           <include>**/*.xmlinclude>
       includes>
       <filtering>falsefiltering>
   resource>
resources>
bulid>

你可能感兴趣的:(Java后端)