• 什么是mybatis,全是干货


    博主的每篇博文的浪漫主义

    【“爱意就像大雨落下”】 https://www.bilibili.com/video/BV1444y1f7m6?share_source=copy_web&vd_source=385ba0043075be7c24c4aeb4aaa73352

    “爱意就像大雨落下”

    在这里插入图片描述

    又又又见到各位读者拉,①我为什么又说又了??

    在这里插入图片描述
    没错,我们今天的学习笔记的内容是

    • 什么是mybatis?
    • 怎么样来创建一个mybatis?
    • mybatis所带来的一系列东西!

    什么是mybatis?

    MyBatis 是一个开源、轻量级的数据持久化框架。

    MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。

    那什么是数据的持久化尼?

    数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。

    MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。
    在这里插入图片描述
    我们称之为ORM。
    那什么是ORM尼?

    ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。

    MyBatis 的主要思想是将程序中的大量 SQL 语句剥离出来,使用 XML 文件或注解的方式实现 SQL 的灵活配置,将 SQL 语句与程序代码分离,在不修改程序代码的情况下,直接在配置文件中修改 SQL 语句。

    大伙呀,要好好理解这段话呀!!

    总归有优点吧,那不然还要这个干什么?

    • 与JDBC 相比,减少了 50% 以上的代码量
    • MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML
      中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
    • 提供 XML 标签,支持编写动态 SQL 语句。
    • 提供映射标签,支持对象与数据库的 ORM 字段关系映射。

    大家看到这一段应该不陌生吧,通过jdbc连接数据库

    在这里插入图片描述
    在这里插入图片描述
    使用 jdbc编程连接数据库的步骤:

    1. 加载数据库驱动
    2. 创连并获取数据庳链接
    3. 创建jdbc statement对象
    4. 设置sql语句
    5. 设置sql语句中的参数(使用preparedStatement)
    6. 通过statement执行sql并获取结果
    7. 对sql执行结栗进行解析处理
    8. 释放资源(resultset、preparedstatement、connection)

    什么是mybatis
    我们再来复习一遍!
    MyBatis是一个优秀的持久层框架(ORM),它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

    Mybatis通过xml或注解的方式将要执行的各种statement (statement,preparedstatemnt、CallableStatement〉配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

    实现一个简易mybatis的步骤怎么来!!

    在这里插入图片描述

    数据源
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/数据库名
    jdbc.username=root
    jdbc.password=123456
    
    • 1
    • 2
    • 3
    • 4
    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>
        <properties resource="db.properties"></properties>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <setting name="logImpl" value="LOG4J"/>
            <!--<setting name="logPrefix" value="mapper" />-->
        </settings>
         <!-- 配置mybatis运行环境 -->
        <environments default="development">
            <environment id="development">
            <!-- 使用JDBC的事务管理 -->
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                    <property name="driver" value="${jdbc.driver}" />
                    <!-- 连接数据库的URL -->
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
        <!--mapper sql映射文件-->
         <!-- 将mapper文件加入到配置文件中 -->
        <mappers>
            <mapper resource="UserMapper.xml"/>
        </mappers>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    UserMapper(interface)
    public interface UserMapper {
    //根据ID查询
        User findById(Integer id);
    }
    
    • 1
    • 2
    • 3
    • 4
    UserMapper(xml映射文件)
    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="mapper.UserMapper">
        <select id="findById" resultType="domain.User">
        select * from USER where id = #{id}
      select>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    通过配置文件实现
        @Test
        public void test() throws Exception {
     
            String resource = "mybatis-config.xml";
    //获取配置文件流
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
    //创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
     
            SqlSession session = sqlSessionFactory.openSession();
     
            User u = session.selectOne("mapper.UserMapper.findById", 1);
            System.out.println("user:" + u);
            session.close();
     
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    SqlSessionFactory是SqlSession的创建工厂,每一个SqlSession实例代表应用程序和数据库的一次连接。 在整个应用当中,

    • 我们应该只创建一个SqlSessionFactory实例,但是可以有多个SqlSession实例。

    那么,

    我们来学习一下SqlSessionFactory和SqlSession

    这里的学习笔记知识点来自这位博主点这里

    SqlSessionFactory

    1. SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。
    2. SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
    3. 每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
    4. SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。
    5. SqlSessionFactory是创建SqlSession的工厂。

    在这里插入图片描述

    SqlSession

    1. SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection
    2. 它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。
    3. SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。
    4. 每个线程都应该有它自己的SqlSession实例。
    5. SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能将SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。
    6. 使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。

    SqlSession源码:

    在这里插入图片描述
    SqlSessionFactory调用过程
    mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:

    1. 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
    String resource = "mybatis-config.xml";//全局配置文件路径
     InputStream inputStream = Resources.getResourceAsStream(resource);//读取xml文件
    
    • 1
    • 2
    1. 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
    new SqlSessionFactoryBuilder().build(inputStream);//构建会话工厂类
    
    • 1
    1. 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
    • 1
    1. SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作
    SqlSession session = sqlSessionFactory.openSession();
    
    • 1

    在这里插入图片描述

    根据上面代码:mybatis有三个基本要素:

    在这里插入图片描述

    在这里插入图片描述

    1. 每个 MyBatis 应用程序都以一个 SqlSessionFactory 对象的实例为核心。
    2. 首先获取 SqlSessionFactoryBuilder 对象,可以根据 XML 配置文件或者 Configuration
      类的实例构建该对象。
    3. 然后获取 SqlSessionFactory 对象,该对象实例可以通过 SqlSessionFactoryBuilder 对象来获取。
    4. 有了 SqlSessionFactory 对象之后,就可以进而获取 SqlSession 实例。SqlSession
      对象中完全包含以数据库为背景的所有执行 SQL 操作的方法,用该实例可以直接执行已映射的 SQL 语句。

    我们再来看一下,通过常规代码实现

    注意在下面该例中,configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射语句的注解从而避免了 XML 文件的依赖。不过,由于 Java 注解的一些限制加之某些 MyBatis 映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套 Join 映射)来说仍然是必须的。有鉴于此,如果存在一个对等的 XML 配置文件的话,MyBatis 会自动查找并加载它(这种情况下, BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)

    @Test
        public void test5() throws Exception {
            //创建连接池
            DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3308/数据库名", "root", "123456");
            //事务
            TransactionFactory transactionFactory = new JdbcTransactionFactory();
            //创建环境
            Environment environment = new Environment("development", transactionFactory, dataSource);
            //创建配置
            Configuration configuration = new Configuration(environment);
            //开启驼峰规则
            configuration.setMapUnderscoreToCamelCase(true);
            //加入资源(Mapper接口)
            configuration.addMapper(UserMapper.class);
            //通过一个SqlSessionFactoryBuilder对象获取一个SqlSessionFactory工厂实例,通过唯一工厂创建SqlSession
            //(相当于获取数据库连接)
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
           
            SqlSession session = sqlSessionFactory.openSession();
     
            try {
              //statement:sql唯一标识(mapper.xml映射文件中的id标识)
              //parament:参数
                User user = session.selectOne("mapper.UserMapper.findById", 1);
                System.out.println(user);
                //操作数据时,需要有提交操作
                //提交session
                session.commit();
            } finally {
            //关闭session
                session.close();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    救救就学到这里,博主的文章为什么没人看,虽然是抄作业吧,但我也是仔仔细细过了一遍的
    提示:对于这篇学习笔记就暂时到这了,兄弟们加油
    对于这篇学习笔记就暂时到这了,兄弟们加油

    从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

    如果又出错的,请各位友友指正。

    请添加图片描述

    新人报到,各位友友们,给我个三联(点赞,关注,收藏)

  • 相关阅读:
    前篇 + 入门
    前端使用Echart实现动态图表
    系统的组成
    Android 13 - Media框架(11)- MediaCodec(一)
    机器学习:过拟合、欠拟合、正则化之间的纸短情长~
    [springMVC学习]7、数据验证及其格式转换(debug源码解析)
    前端实战|React18极客园——登陆模块(token持久化、路由拦截、mobx、封装axios)
    13 【操作mysql数据库】
    【每日随笔】驾驭人性 ② ( 员工立场问题 | 立场转变 | 吴越同舟 | 老板如何与员工结成利益共同体 )
    Scala第十七章节
  • 原文地址:https://blog.csdn.net/muweichang/article/details/127301657