MyBatis学记笔记,超详细!!(1)

本次更新MyBatis前期学习知识,概述,第一个入门程序。

另外还有我的牛客Java专项练习笔记专栏Spring框架学习专栏MySQL数据库学习专栏也在同步更新,希望大家多多关注,一起学习!!!

1. MyBatis概述

1.1 概述

  • MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD。

  • MyBatis在三层架构中负责持久层的,属于持久层框架。

  • ORM:对象关系映射

  • O(Object):Java虚拟机中的Java对象

  • R(Relational):关系型数据库

  • M(Mapping):将Java虚拟机中的Java对象映射到数据库表中一行记录,或是将数据库表中一行记录映射成Java虚拟机中的一个Java对象。

  • MyBatis属于半自动化ORM框架。

  • Hibernate属于全自动化的ORM框架

2. MyBatis入门程序

【准备数据库】

准备数据库表:汽车表t_car,字段包括:

  • id:主键(自增)【bigint】

  • car_num:汽车编号【varchar】

  • brand:品牌【varchar】

  • guide_price:厂家指导价【decimal类型,专门为财务数据准备的类型】produce_time:生产时间【char,年月日即可,10个长度,'2022-10-11'】

  • car_type:汽车类型(燃油车、电车、氢能源)【varchar】

【导入依赖】

<!--mybatis核心依赖-->
<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>

【新建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>
    <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="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--sql映射文件创建好之后,需要将该文件路径配置到这里-->
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

【在resources根目录下新建CarMapper.xmlSQL映射文件】

<?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">
<!--namespace先随意写一个-->
<mapper namespace="car">
    <!--insert sql:保存一个汽车信息-->
    <insert id="insertCar">
        insert into t_car
            (id,car_num,brand,guide_price,produce_time,car_type) 
        values
            (null,'102','丰田mirai',40.30,'2014-10-05','氢能源')
    </insert>
</mapper>
将CarMapper.xml文件路径配置到mybatis-config.xml:
<mapper resource="CarMapper.xml"/>

【编写测试程序】

public class MyBatisIntroductionTest {
    public static void main(String[] args) {
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 创建SqlSessionFactory对象
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 3. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 4. 执行sql
        int count = sqlSession.insert("insertCar"); // 这个"insertCar"必须是sql的id
        System.out.println("插入几条数据:" + count);
        // 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
        sqlSession.commit();
        // 6. 关闭资源(只关闭是不会提交的)
        sqlSession.close();
    }
}
注意:
SqlSession是专门用来执行SQL语句的,是一个java程序和数据库之间的一次会话
要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂生产SqlSession对象
获取SqlSessionFactory对象
首先获取SqlSessionFactoryBuilder对象
通过SqlSessionFactoryBuilder对象的build方法获取SqlSessionFactory对象
SqlSessionFactoryBuilder --> SqlSessionFactory --> SqlSession
在mybatis中提供了一个类:Resources【org.apache.ibatis.io.Resources】,该类可以从类路径当中获取资源,我们通常使用它来获取输入流InputStream,代码如下:
// 这种方式只能从类路径当中获取资源,也就是说mybatis-config.xml文件需要在类路径下。 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //其他方式 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); InputStream is = ClassLoader.getSystemResourceAsStream("mybatis-config.xml");

2.1 完整的代码写法

public class MyBatisCompleteCodeTest {
    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            // 1.创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 2.创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 3.创建SqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            // 4.执行SQL
            int count = sqlSession.insert("insertCar");
            System.out.println("更新了几条记录:" + count);
            // 5.提交
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 6.关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

2.2 封装SqlSessionUtil

每一次获取SqlSession对象代码太繁琐,封装一个工具类

public class SqlSessionUtils {

    private SqlSessionUtils() {}

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream is = Resources.getResourceAsStream(resource);
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static ThreadLocal<SqlSession> local = new ThreadLocal<>();

    public static SqlSession getSqlSession() {
        SqlSession sqlSession = local.get();
        if (sqlSession == null) {
            sqlSession = sqlSessionFactory.openSession();
            //当sqlSession绑定到当前线程
            local.set(sqlSession);
        }
        return sqlSession;
    }

    public static  void close( SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
            //从当前线程移除sqlSession对象
            local.remove();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值