• MyBatis-1-学习记录环境搭建和入门案例


    五分钟学Mybatis|一个案例了解Mybatis与环境搭建(超干货!)
    MyBatis教程
    MyBatis中文文档
    mybatis学习笔记一(环境搭建和入门案例)
    mybatis学习笔记二(crud)
    mybatis学习笔记三(mybatis参数深入)
    mybatis学习笔记四(多表查询)
    mybatis学习笔记四(延迟加载和缓存)
    在这里插入图片描述

    MyBatis 本是apache 的一个开源项目 iBatis, 2010 年这个项目由apache software foundation 迁移到了google code,并且改名为 MyBatis 。2013 年 11 月迁移到Github。

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

    1 MyBatis简介

    1.1 什么是 MyBatis?

    • MyBatis是一款优秀的持久层框架。
    • 它支持自定义SQL、存储过程以及高级映射。
    • MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
    • MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java。
    • POJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。

    1.2 为什么需要mybatis?

    • 方便。
    • 传统的JDBC代码太复杂了。简化、框架、自动化。
    • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射。
    • 提供对象关系映射标签,支持对象关系组建维护。
    • 提供xml标签,支持编写动态sql。

    1.3 MyBatis解决的主要问题

    减轻使用JDBC的复杂性,不用编写重复的创建Connetion, Statement,不用编写关闭资源代码。直接使用java对象,表示结果数据,让开发者专注SQL的处理,其他分心的工作由MyBatis代劳。

    MyBatis可以完成:
    (1)注册数据库的驱动,如Class.forName(“com.mysql.jdbc.Driver”)。
    (2)创建JDBC中必须使用的Connection,Statement,ResultSet对象。
    (3)从xml中获取sql,并执行sql语句,把ResultSet结果转换java对象。

    List<Student> list = new ArrayLsit<>();
    ResultSet rs = state.executeQuery(“select * from student”);
    while(rs.next){
    	Student student = new Student();
    	student.setName(rs.getString(“name”));
    	student.setAge(rs.getInt(“age”));
    	list.add(student);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (4)关闭资源
    ResultSet.close() , Statement.close() , Conenection.close()。

    1.4 简单实现流程分析

    在这里插入图片描述

    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    • 1
    • 2
    • 3
    • 4

    (1)Resources类
    Resources类,顾名思义就是资源,用于读取资源文件。Resources有很多方法通过加载并解析资源文件,返回不同类型的IO流对象。

    //1、读取配置文件
    InputStream is = null;
    is = Resources.getResourceAsStream("SqlMapConfig.xml");
    
    • 1
    • 2
    • 3

    (2)SqlSessionFactoryBuilder类
    SqlSessionFactory的创建,需要使用 SqlSessionFactoryBuilder对象的build()方法。由于SqlSessionFactoryBuilder对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将该SqlSessionFactoryBuilder对象创建为一个方法内的局部对象,方法结束,对象销毁。

    //2、创建SqlSessionFactory工厂,目的是获取SqlSession
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    
    • 1
    • 2

    (3)SqlSessionFactory接口
    SqlSessionFactory接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。创建SqlSession需要使用SqlSessionFactory接口的的openSession()方法。

    • openSession(true):创建一个有自动提交功能的SqlSession。
    • openSession(false):创建一个非自动提交功能的SqlSession,需手动提交。
    • openSession():同openSession(false)。
    //3、使用工厂生成Sqlsession对象,用于执行sql语句
    SqlSession session = null;
    session = factory.openSession();
    
    • 1
    • 2
    • 3

    (4)SqlSession接口
    SqlSession接口对象用于执行持久化操作。一个SqlSession对应着一次数据库会话,一次会话以SqlSession对象的创建开始,以SqlSession对象的关闭结束。

    SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其close()方法,将其关闭。再次需要会话,再次创建。 SqlSession在方法内部创建,使用完毕后关闭。

    //4、使用Sqlsession对象创建dao接口的代理对象
    StudentDao studentDao = session.getMapper(StudentDao.class);
    //5、使用代理对象执行方法
    List<Student> studentList = studentDao.selectStudents();
    //5、循环输出查询结果
    for (Student student : studentList){
        System.out.println(student);
    }
    //6、释放资源
    session.close();
    is.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2 搭建MyBatis 开发环境

    2.1 创建mysql数据库和表

    数据库名ssm;表名student。

    create database ssm;
    CREATE TABLE `student` (
    `id` int(11) NOT NULL,
    `name` varchar(255) DEFAULT NULL,
    `email` varchar(255) DEFAULT NULL,
    `age` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.2 创建maven工程

    • 若勾选上Create from archetype,则表示使用模板创建。
    • 通过Intellij IDEA新建maven工程时,勾选create from archetype不管选哪个archetype,创建后加载都很慢。
    Name:learnMyBatis
    Location:D:\\learnMyBatis
    
    • 1
    • 2

    2.3 依赖pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>learnMyBatis</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <!--导入mybatis依赖-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.3</version>
            </dependency>
            <!--数据库驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--导入单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
        
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory><!--所在的目录-->
                    <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
    
        </build>
    </project>
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    2.4 编写Student实体类

    创建包com.mylearn.domain, 包中创建Student类。
    右键src/main/java->New/package。

    package com.mylearn.domain;
    /**
     * Description 实体类
     */
    public class Student {
        //属性名和列名一样
        private Integer id;
        private String name;
        private String email;
        private Integer age;
        //set,get,toString
        
        public void setName(String name){
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.5 编写Dao接口StudentDao

    创建包com.mylearn.dao, 包中创建StudentDao接口。
    右键src/main/java->New/package。

    package com.mylearn.dao;
    import com.mylearn.domain.Student;
    import java.util.List;
    
    /**
     * Description:Dao接口
     */
    public interface StudentDao {
        //查询所有数据
        List<Student> selectStudents();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.6 编写Dao接口映射文件StudentDao.xml

    • 在dao包中创建文件StudentDao.xml。
    • 要StudentDao.xml文件名称和接口StudentDao一样,区分大小写。
    <?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">
    
    <!--对应的dao接口-->
    <!--namespace:必须有值,自定义的唯一字符串
    推荐使用:Dao接口的全限定名称
    -->
    <mapper namespace="com.mylearn.dao.StudentDao">
        <!--<select>:查询语句,标签中必须是select语句。
        id:sql语句的自定义名称,推荐使用Dao接口中的方法名称。
        resultType:查询语句的返回结果数据类型,使用全限定类名。
        -->
        <select id="selectStudents" resultType="com.mylearn.domain.Student">
            <!--要执行的sql语句-->
            select * from Student
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.7 创建主配置文件SqlMapConfig.xml

    • 项目src/main下创建resources目录。

    • XML 配置文件中包含了对MyBatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

    <?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="mysql">
            <!--配置mysql环境-->
            <environment id="mysql">
                <!--配置事务的类型-->
                <transactionManager type="JDBC"/>
                <!--配置事务的类型-->
                <dataSource type="POOLED">
                    <!--配置连接数据库的4个基本信息-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql:mybatis?useUnicode=true&characterEncoding=utf8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="bigdata"/>
                </dataSource>
            </environment>
        </environments>
        <!--指定映射文件的位置 必须是dao接口全限定类名-->
        <mappers>
            <mapper resource="com/mylearn/dao/StudentDao.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

    2.8 创建测试类MyBatisTest

    • src/test/java/com/mylearn/创建MyBatisTest.java文件。
    package com.mylearn;
    
    import com.mylearn.dao.StudentDao;
    import com.mylearn.domain.Student;
    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 org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class MyBatisTest {
        @Test
        public void test1(){
            InputStream is = null;
            SqlSession session = null;
            try {
                //1、读取配置文件
                is = Resources.getResourceAsStream("SqlMapConfig.xml");
                //2、创建SqlSessionFactory工厂,目的是获取SqlSession
                SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
                //3、使用工厂生成Sqlsession对象,用于执行sql语句
                session = factory.openSession();
                //4、使用Sqlsession对象创建dao接口的代理对象
                StudentDao studentDao = session.getMapper(StudentDao.class);
                //5、使用代理对象执行方法
                List<Student> studentList = studentDao.selectStudents();
                //5、循环输出查询结果
                for (Student student : studentList){
                    System.out.println(student);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //6、释放资源
            try {
                session.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    SpringSecurity 介绍/基本使用/加载流程/认证流程/权限访问流程/共享认证信息
    基于Springboot+Vue实现前后端分离商城管理系统
    Python 中如何编写类型提示
    SAP服务器修改主机名操作手册
    迭代与递归--你被递归搞晕过吗?
    Claude: ChatGPT替代大语言模型
    【C语言】#define宏与函数的优劣对比
    JDK19虚拟线程初探(二)
    hisicv500部署yolov5 v5.0完整记录
    hash和history路由的区别
  • 原文地址:https://blog.csdn.net/qq_20466211/article/details/126312077