Mybatis的入门使用

Mybatis

1.mybatis持久层框架

mybatis的概念:
是一个优秀的持久层框架,它的前身时ibatis框架
官网介绍:
通过xml或注解来配置和映射原始类型、接口和java pojo为数据库中的记录

mybatis入门使用:

步骤一:导入依赖,MysqL依赖和mybatis依赖
步骤二:创建mybatis核心配置文件:配置自带数据库连接池
步骤三: 创建mybatis的映射文件:  1. 可以配置sql语句   2. 将javaBean与数据库的数据表建立映射关系.

代码

步骤一:将所需依赖导入到pom配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>MybatisProject</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>MybatisProject Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- 测试依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
    <!-- MysqL依赖-->
    <dependency>
      <groupId>MysqL</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    <!-- mybatis依赖   -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.10</version>
    </dependency>
    <!--log4j日志依赖-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.18.0</version>
    </dependency>
    <dependency>
    <!--lombok依赖-->
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>
    <!--jsp依赖-->
     <dependency>
                 <groupId>javax.servlet.jsp</groupId>
                 <artifactId>javax.servlet.jsp-api</artifactId>
                 <version>2.3.3</version>
                    <scope>provided</scope>
             </dependency>
      <!--servlet依赖-->
             <dependency>
                 <groupId>javax.servlet</groupId>
                 <artifactId>javax.servlet-api</artifactId>
                 <version>4.0.1</version>
                 <scope>provided</scope>
             </dependency>
  </dependencies>
  <build>
    <finalName>MybatisProject</finalName>
  </build>
</project>

步骤二:对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>
    <!--将log4j.properties文件导入-->
  <!--  <properties url="log4j.properties"/>
    <settings>
        <!--标准日志工厂实现-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <!---Log4j工厂实现-->
     <!--   <setting name="logImpl" value="LOG4J"/>
    </settings>
    -->
        <!-- 使用xml文件对Mybatis核心文件进行配置  -->
    <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/test2"/>
                <property name="username" value="root"/>
                <property name="password" value="xxxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    <!--书写映射配置文件sql语句配置文件-->
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>

步骤三:书写sql语句配置文件

<?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="org.mybatis.example.StudentMapper">
<!--查询方法的书写-->
<!--定义方法的id在dao层被调用时使用-->
<!--书写返回的结果类型,对于Bean对象写其类的相对路径-->
    <select id="student" resultType="entity.Student">
        select * from student where id = #{id};
    </select>
</mapper>

步骤四:获取工厂对象的方法

package utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.sqlSessionFactory;
import org.apache.ibatis.session.sqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class Mybatis {
    //加载mybatis配置文件
    static String resource = "mybatis-config.xml";
    static InputStream in =null;
    //获取sqlSessionFactory工厂对象
    public static sqlSessionFactory getsqlSessionFactory() {
        {
            try {
                in = Resources.getResourceAsstream(resource);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        sqlSessionFactory sqlSessionFactory = new sqlSessionFactoryBuilder().build(in);
        return  sqlSessionFactory;
    }
}

步骤五:sql语句的执行

package dao.Impl;
import entity.Student;
import org.apache.ibatis.session.sqlSession;
import utils.Mybatis;

public class StudentInfo  {
    public static Student getStudent() {
//获取执行器对象
        Student student =null;
        sqlSession session = Mybatis.getsqlSessionFactory().openSession();
        try {
            //调用对应的sql语句方法(在配置文件之中)
            student= session.selectOne("org.mybatis.example.StudentMapper.student",1);
        }finally {
            session.close();
    }
        return student;
    }
}

步骤六:书写测试类

import dao.Impl.StudentInfo;
import entity.Student;

public class Test {
    public static void main(String[] args) {
        Student student=StudentInfo.getStudent();
        System.out.println(student);
    }
}

Mybatis的执行流程

在这里插入图片描述

源码分析

MyBatis的api

sqlSessionFactory  sqlSession =  bulider.build(in);//DefaultsqlSessionFactory
源码底层:
sqlSessionFactory var5;
        try {
            //得到配置文件对象Configuration,保存了核心配置文件的数据
            XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
            var5 = this.build(parser.parse());
        }

//DefaultsqlSessionFactory源码:

public class DefaultsqlSessionFactory implements sqlSessionFactory {
    private final Configuration configuration;
	//通过构建器加载配置文件得到工厂对象, 通过有参数的构造方法配置文件configuration
    public DefaultsqlSessionFactory(Configuration configuration) {
        this.configuration = configuration;
    }
  • sqlSession接口
  1. 获取sqlSession对象的方法
//openSession()里面有参数false, 执行更新操作,事务不会自动提交 ,可以进行事务控制(马上代码演示)
sqlSession sqlSession = factory.openSession();
//sqlSession对象,执行更新操作时,会自动提交事务
sqlSession sqlSession = factory.openSession(true);
  1. sqlSession里面的方法

    • 查询方法: selectX(参数)
    • 更新方法: insert(参数), update(参数), delete(参数)
    • 事务方法: commit(); rollback();
    • 配置文件对象的方法: Configuration getConfiguration();
    • T getMapper(Class var1): mybatis基于接口开发,获取接口的代理对象(后面讲)
  2. sqlSession接口执行sql语句时,底层依赖的DefaultsqlSession

    DefaultsqlSession源码

    public class DefaultsqlSession implements sqlSession {
        private final Configuration configuration;
        private final Executor executor;
        private final boolean autoCommit;
        private boolean dirty;
        private List<Cursor<?>> cursorList;
    
        public DefaultsqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
            this.configuration = configuration;
            this.executor = executor;
            this.dirty = false;
            this.autoCommit = autoCommit;
        }
    
        public DefaultsqlSession(Configuration configuration, Executor executor) {
            this(configuration, executor, false);
        }
    
    

Executor源码,是一个接口,底层认使用的SimpleExecutor

SimpleExecutor

  • 作用1: 根据有参数的构造方法传递过来的Configuration,建立与数据库服务器的连接

  • 作用2: 核心配置文件对象Configuration,也加载了映射文件,映射文件数据加载到映射对象MappedStatement

    ​ 首先根据MappedStatement对象获取对应的sql语句, 根据sql语句到执行sql语句对象: PreparedStatment

  • 作用3:执行sql语句时, 依赖结果集处理器对象 ResultSetHandler(执行查询)和ParameterHandler(给sql语句赋值)

public class SimpleExecutor extends BaseExecutor {
    public SimpleExecutor(Configuration configuration, Transaction transaction) {
        super(configuration, transaction);
    }

    public int doUpdate(MappedStatement ms, Object parameter) throws sqlException {
        Statement stmt = null;

        int var6;
        try {
            Configuration configuration = ms.getConfiguration();
            StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, (ResultHandler)null, (Boundsql)null);
            stmt = this.prepareStatement(handler, ms.getStatementLog());
            var6 = handler.update(stmt);
        } finally {
            this.closeStatement(stmt);
        }

        return var6;
    }

sql语句的条件赋值的处理器

public interface ParameterHandler {
    Object getParameterObject();

    void setParameters(PreparedStatement var1) throws sqlException;
}


执行查询sql语句,处理查询结果的处理器

public interface ResultSetHandler {
    <E> List<E> handleResultSets(Statement var1) throws sqlException;

    <E> Cursor<E> handleCursorResultSets(Statement var1) throws sqlException;

    void handleOutputParameters(CallableStatement var1) throws sqlException;
}

tion;
}


**执行查询sql语句,处理查询结果的处理器**

~~~~java
public interface ResultSetHandler {
    <E> List<E> handleResultSets(Statement var1) throws sqlException;

    <E> Cursor<E> handleCursorResultSets(Statement var1) throws sqlException;

    void handleOutputParameters(CallableStatement var1) throws sqlException;
}
~~~~


相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...