当前位置:   article > 正文

MyBatis第二章-MyBatis入门程序_mybatis入门程序实验

mybatis入门程序实验

一、MyBatis入门程序

掌握了JDBC,就可以学习MyBatis。

1.1 版本

软件版本

  • IntelliJ IDEA:2022.1.4
  • Nacivat for MySQL:16.0.14
  • MySQL数据库:8.0.30

组件版本:

  • MySQL驱动:8.0.30
  • MyBatis:3.5.10
  • JDK:java17
  • JUnit:4.13.2
  • Logback:1.2.11

1.2、MyBatis下载

  • 从GitHub上下载:地址:https://github.com/mybatis/mybatis-3
    在这里插入图片描述在这里插入图片描述
  • 将框架以及源代码都下载下来,下载框架后解压。打开mybatis目录
    在这里插入图片描述
  • 通过以上解压可以看到,框架一般都是以jar包的形式存在。我们的mybatis课程使用maven,所以这个jar我们不需要。
  • 官方手册需要,官方手册是英文的。若需要中文版:mybaits.net.cn

1.3 使用Navcat建表、插入数据

  • 写代码前准备:
    • 准备数据库表:汽车t_car,字段包括:
      • id:主键(自增)【bigint】
      • car_num:汽车编号【varchar】
      • brand:品牌【varchar】
      • guide_price:厂商指导价【decimal类型,专门为财务数据准备的类型】
      • produce_time:生产时间【char,年月日即可,10个长度,“2022-10-11”】
      • car_type:汽车类型(油车、电车、氢能源)【varchar】
  • 使用navicat for mysql 工具建表
    在这里插入图片描述建表的sql语句:
DROP TABLE IF EXISTS `t_car`;
CREATE TABLE `t_car`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自然主键,和业务没有关系,自增',
  `car_num` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车编号',
  `brand` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车品牌',
  `guide_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '厂商指导价',
  `produce_time` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生产日期',
  `car_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车类型:燃油车 新能源 氢能源',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 使用navicat for mysql工具向t_car表中插入两条数据,如下
    在这里插入图片描述插入数据的sql语句:
INSERT INTO `t_car` VALUES (1, '1001', '宝马520LI', 10.00, '2020-10-11', '燃油车');
INSERT INTO `t_car` VALUES (2, '1002', '奔驰E 300L', 55.00, '2020-11-11', '新能源');
SET FOREIGN_KEY_CHECKS = 1;
  • 1
  • 2
  • 3

1.4 开发我的第一个MyBatis程序

创建一个普通的maven项目
在这里插入图片描述

  • resource目录:
    • 放在这个目录当中的, 一般都是资源文件,配置文件。直接放到resource目录下的资源,等同于放到了类的根路径下。

MyBatis入门程序前5步

1.配置Maven环境,打包方式设置为jar,加载MyBatis,MySql驱动(在pom.xml中配置)

<!--打包方式-->
   <packaging>jar</packaging>
   <dependencies>
       <!--mybaits以来-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.10</version>
       </dependency>
       <!--mysql依赖-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.30</version>
       </dependency>
   </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.在resource文件夹中新建mybatis-config.xml文件
注意:

  • 第一:这个文件名不是必须叫做mybatis-config.xml,可以用其他名字。只是大家都采用这个名字,约定俗成。
  • 第二:这个文件存放的位置也不是固定的,可以随意,但一般情况下会放到类的根路径之下,也就是resource文件夹之中。
  • mybatis-config.xml文件中的配置信息不理解没关系(后期会进行讲解),先把连接数据库的信息修改一下即可。其他的别动。

其中我的mysql数据库账户:root 密码:123456

<?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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3.编写XxxMapper.xml文件

  • 在这个配置文件当中编写SQL语句
  • 这个文件名也不是固定的,放的位置也不是固定的,这里我们给它起个名字:CarMapper.xml,暂时把他放在类的根路径下。
<!--insert语句-->
<insert id="insertCar">
       insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
       values (null,'1003','chuyu','30.0','2010-10-11','燃油车');
</insert>
  • 1
  • 2
  • 3
  • 4
  • 5

4.在xxxMapper中编写sql代码(在3中已完成)
5.在mybatis-config.xml文件中指定XxxxMapper.xml文件的路径:

<mapper resource="CarMapper.xml"/>
  • 1

注意:resource属性会自动从类的根路径下开始查找资源。

最后验收成果:编写MyBatis程序。(使用mybatis的类库,编写mybatis程序,连接数据库,做增删改查就行了。)

  • 在MyBatis当中,负责执行SQL语句的那个对象叫做什么呢?

    • 答:SqlSession
  • SqlSession是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话。

  • 想要获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来生产SqlSession对象。

  • 那么怎么获取SqlSessionFactory对象呢?

    • 需要首先获取SqlSessionFactoryBuilder对象。
    • 通过SqlSessionFactoryBuilder对象的builder方法,来获取一个SqlSessionFactory对象。
  • mybatis的核心对象包括:

    • SqlSessionFactoryBuilder
    • SqlSessionFactory
    • SqlSession

它们之间的关系为:
SqlSessionFactoryBuilder —> SqlSessionFactory —>SqlSession

//获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //Resource.getResourceAsStream默认就是从类的根路径下开始查找资源
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //通过SqlSessionFactoryBuilder中的builder方法获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行SQL语句
        int count = sqlSession.insert("insertCar");
        System.out.println(count);
        //手动提交
        sqlSession.commit();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行程序后,这条数据被成功加添进数据库。

1.5 关于第一个程序的小细节

  • mybatis中的sql语句的结尾";"可以省略。
  • Rescources.getRescourceAsStream
    • 小技巧:以后凡是遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载。(开始查找)
    • 优点:采用这种方式,从类路径当中加载资源,项目的移植性很强。项目从windows移植到linux代码不需要修改,因为这个资源文件一直都在类路径下。
  • InputStream is = new FileInputStram(“d:\mybatis-config.xml”);

二、关于mybatis的事务管理机制。(深度剖析)

  • 在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理。
<transactionManager type = "JDBC"/>
  • 1
  • type属性的值包括两个:JDBC,MANAGED (不区分大小写)
  • 在mybatis中提供了两种事务管理机制:
    • 第一种:JDBC事务管理器
    • 第二种:MANAGED事务管理器
  • JDBC事务管理器:
    • mybaits框架自己管理事务,自己采用原生的JDBC代码去管理事务;
    • conn.setAutoCommit(fakse);开启事务
    • …业务处理…
    • conn.commit();手动提交事务
    • 如果编写的是以下的代码:
      • SqlSession sqlSession = sqlSessionFactory.openSession(true);
      • 表示没有开启事务, 因为这种方式conn.setAutoCommit(false);压根不会执行。
      • 在JDBC事务中,没有执行conn.setAutoCommit(false);那么atuoCommit就是true。
      • 如果autoCommit是true,就是表示没有开启事务。只要执行任何一条DML语句就提交一次。当然这种方式不是被建议的。
  • MANAGED事务管理器:
  • mybatis不再负责事务的管理。事务管理交给其他容器来负责。例如:spring。
  • 在当前只是只有mybatis的情况下,若配置为:MANAGED,那么事务是没有容器来管理的。没有容器管理即事务管理压根没有开启。虽然可以成功的加添数据,但这种方式也是不被建议的。
  • 重点:只要autoCommit是true,就表示没有开启事务。autoCommit是false的时候就表示开启了事务。

三、第一个比较完整的MyBatis程序

        SqlSession sqlSession = null;
        try {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            //开始会话(底层开始事务)
            sqlSession = sqlSessionFactory.openSession();
            //执行SQL语句,处理相关业务
            int insertCar = sqlSession.insert("insertCar");
            System.out.println(insertCar);
            //执行到这里,没有发生任何异常,提交事务。终止事务。
            sqlSession.commit();
        } catch (IOException e) {
            //回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        }finally {
            //关闭会话(释放资源)
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

MyBatis工具类的编写

在编写代码中,每次都通过SqlSessionFactoryBuilder三步骤获取session太麻烦,我们编写一个工具类get会比较方便点。

//工具类的构造方法一般都是私有化的。
    //工具类中所有的方法都是静态的,直接采用类名即可调用。不需要new对象。
    private SqlSessionUtil(){}  //为了防止new对象,构造方法私有化。
    private static SqlSessionFactory sqlSessionFactory;
    //类加载时执行
    //SqlSessionUtil工具类在第一次加载的时候,解析mybatis-config.xml文件。创建SqlSessionFactory对象。
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 获取会话对象
     * @return 会话对象
     */
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

编写测试程序

public void testInsertCarByUtil(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        int insert = sqlSession.insert("insertCar");
        System.out.println(insert);
        sqlSession.commit();
        sqlSession.close();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

四、在MyBatis中引入junit依赖

  • 在maven中添加junit依赖
<!--加入junit依赖-->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.11</version>
           <scope>test</scope>
       </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 新建test包,以及创建测试类CarMapperTest
    在这里插入图片描述
  • 在新建的类中编写MyBatis代码

public class CarMapperTest {
   @Test
   public void insertCar(){
       SqlSession sqlSession = null;
       try {
           SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
           SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsReader("mybatis-config.xml"));
           sqlSession = sqlSessionFactory.openSession();
           int count = sqlSession.insert("insertCar");
           System.out.println("新增了记录"+count);
           //提交事务
           sqlSession.commit();

       } catch (Exception e) {
           if (sqlSession != null) {
               sqlSession.rollback();
           }
           e.printStackTrace();
       }finally {
           if (sqlSession != null) {
               sqlSession.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
  • 运行在这里插入图片描述绿色,代表是没有问题。

五、MyBatis集成日志框架logback

关于mybaits集成日志文件组件。让我们调试起来更加方便。

  • mybatis常见的集成的日志组件有哪些呢?
    • SLF4J(沙拉风)
    • LOG4J
    • STDOUT_LOGGING
  • 其中STDOUT_LOGGIN是标准日志,mybaits已经实现了这种标准日志。mybatis框架本身已经实现了这种标准。只要开启即可,在mybatis-config.xml文件中使用setting标签进行配置开启。
<!--日志框架logback-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
  • 1
  • 2
  • 3
  • 4

注意:这个标签在写的时候要注意顺序,它应该出现在environments标签之前,当然,这个顺序不需要记忆。因为有dtd文件进行约束,我们只要参考dtd约束即可。

5.1使用最常用的logback组件步骤:

  • 在maven中添加logback的依赖
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
            <scope>test</scope>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 引入logback所需要的xml配置文件
    • 这个配置文件的名字必须叫做:logback.xml或者logback-test.xml,不能是其他名字
    • 这个配置文件必须放到类的根路径下。不能是其他位置。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件修改时重新加载,默认true -->
<configuration debug="false">
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
            <!-- 输出日志记录格式 -->
            <pattern>[%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
<!--mybatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <!-- 日志输出级别,LOGBACK日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR-->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

除了STDOUT_LOGGING自带日志组件外,其他组件不需要写日志设置。
在mybatis-config.xml中删除日志设置

<!-- 删除这些 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/541429
推荐阅读
相关标签
  

闽ICP备14008679号