Mybatis基础

一.Mybatis快速入门

1.1 框架介绍
  • 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!

  • 如图:

Mybatis基础_第1张图片

  • 生活中的例子,比如盖房子
  • 张三想盖红色的房子,他需要先给架构搭起来,然后再给房子图上红色
  • 李四想盖蓝色的房子,他也需要先给架构搭起来,然后再给房子图上蓝色
  • 比如很多人都需要盖房子,那么肯定会有很多重复性的工作,比如说基础架构
  • 这时候就有公司出了一个解决方案,准备好了房子的架构(上图左下角黑色的),谁需要盖房子,只需要借助于公司提供的架构,在这个基础之上进行装修,涂色即可
1.2 ORM介绍 ***
  • ORM(Object Relational Mapping): 对象关系映射

    • object:指的是实体对象,javabean
    • relational:指的是关系型数据库,比如mysql
  • 指的是持久化数据和实体对象的映射模式为了解决面向对象与关系型数据库存在的互不匹配的现象的技术

  • 如图:

    Mybatis基础_第2张图片

  • 简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写

  • ORM 把数据库映射成对象,具体映射关系如下图:

Mybatis基础_第3张图片

1.3 原始jdbc操作(查询数据)

Mybatis基础_第4张图片

1.4原始jdbc操作(插入数据)

Mybatis基础_第5张图片

1.5 原始jdbc操作的分析
  • 原始 JDBC 的操作问题分析

    1. 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能

    2. sql 语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护

    3. 查询操作时,需要手动将结果集中的数据封装到实体对象中

    4. 增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符

  • 原始 JDBC 的操作问题解决方案

    1. 使用数据库连接池初始化连接资源

    2. 将 sql 语句抽取到配置文件中

    3. 使用反射、内省(特殊的反射)等底层技术,将实体与表进行属性与字段的自动映射

    4. 通过分析原始jdbc操作存在的问题,以及对应的解决方案,那么在对应的解决方案在完全可以使用MyBatis替代

1.6 什么是Mybatis
  • mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程

  • mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句

  • 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作

  • MyBatis官网地址:http://www.mybatis.org/mybatis-3/

1.7 Mybatis的快速入门 ***

MyBatis开发步骤:

①添加MyBatis的jar包

②创建Student数据表

③编写Student实体类

④编写映射文件StudentMapper.xml

⑤编写核心文件MyBatisConfig.xml

⑥编写测试类

1.7.1 环境搭建
  1. 新建java项目:mybatis01

  2. 导入MyBatis的jar包 (在”今日资料\jar包“ 中,将jar包导入项目libs下)

  • mysql-connector-java-5.1.37-bin.jar
  • mybatis-3.5.3.jar
  • log4j-1.2.17.jar
  1. 创建student数据表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o772HFAp-1633252596106)(img/1590916243454.png)]

  1. 编写Student实体
package com.itheima.bean;
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    //省略get个set方法
}
  1. 新建测试类
package com.itheima.dao;

public class StudentTest01 {
    /*
        查询全部
     */
    @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件

        //2.获取SqlSession工厂对象

        //3.通过SqlSession工厂对象获取SqlSession对象

        //4.执行映射配置文件中的sql语句,并接收结果

        //5.处理结果

        //6.释放资源
    }
}
  1. 编写src/StudentMapper.xml映射文件


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<mapper namespace="StudentMapper">
    
    <select id="selectAll" resultType="com.itheima.bean.Student">
        SELECT * FROM student
    select>
mapper>
  1. 编写MyBatis核心文件: src/MyBatisConfig.xml


DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>
    
    <environments default="mysql">
        
        <environment id="mysql">
            
            <transactionManager type="JDBC">transactionManager>
            
            <dataSource type="POOLED">
                
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://192.168.59.143:3306/db1" />
                <property name="username" value="root" />
                <property name="password" value="itheima" />
            dataSource>
        environment>
    environments>

    
    <mappers>
        
        <mapper resource="StudentMapper.xml"/>
    mappers>
configuration>

1.7.2 编写测试代码
 @Test
public void selectAll() throws Exception{
    //1.加载核心配置文件
    InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

    //2.获取SqlSession工厂对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

    //3.通过SqlSession工厂对象获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //4.执行映射配置文件中的sql语句,并接收结果(参数是StudentMapper.xml中的selectAll)
    List<Student> list = sqlSession.selectList("StudentMapper.selectAll");

    //5.处理结果
    for (Student stu : list) {
        System.out.println(stu);
    }

    //6.释放资源
    sqlSession.close();
    is.close();
}
1.8 知识小结
  • 框架

    框架是一款半成品软件,我们可以基于框架继续开发,从而完成一些个性化的需求。

  • ORM

    对象关系映射,数据和实体对象的映射。

  • MyBatis

    是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC。

二. MyBatis的相关api ***

2.1 Resources
  • org.apache.ibatis.io.Resources:加载资源的工具类

    • mybatis的前身就是ibatis
  • 核心方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlr2rlFj-1633252596108)(img/1590917572321.png)]

  • 如果不使用Resources,那我们可以自己使用类加载器(但是麻烦)

    //InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    InputStream is = StudentTest01.class.getClassLoader().getResourceAsStream("MyBatisConfig.xml");
    
2.2 构建器SqlSessionFactoryBuilder
  • org.apache.ibatis.session.SqlSessionFactoryBuilder:获取 SqlSessionFactory 工厂对象的功能类

  • 核心方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWiFByLk-1633252596109)(img/1590916852504.png)]

  • 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象

InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml"); 
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
SqlSessionFactory fact	ory = builder.build(inputStream);
2.3 工厂对象SqlSessionFactory
  • org.apache.ibatis.session.SqlSessionFactory:获取 SqlSession 构建者对象的工厂接口。

  • 核心api

    Mybatis基础_第6张图片

  • 代码

     //3.通过SqlSession工厂对象获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    //4.执行映射配置文件中的sql语句,并接收结果
    List<Student> list = sqlSession.selectList("StudentMapper.selectAll");
    
    • 说明:因为我们的代码是执行了一个查询的语句,所以不用处理事务
2.4 SqlSession会话对象 ***
  • org.apache.ibatis.session.SqlSession:构建者对象接口。用于执行 SQL、管理事务、接口代理。

  • 核心api

    Mybatis基础_第7张图片

  • SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法

  • 作用:

    • 通过SqlSession对象,主要用途执行sql语句,对数据库进行操作
  • 本质:

    • SqlSession 可以理解为相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务
    • 所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭
2.5 小结
  • Resources
    • 加载资源的工具类
  • SqlSessionFactoryBuilder
    • 获取 SqlSessionFactory 工厂对象的功能类
  • SqlSessionFactory
    • 获取 SqlSession 构建者对象的工厂接口
    • 指定事务的提交方式
  • SqlSession
    • 构建者对象接口
    • 执行 SQL
    • 管理事务
    • 接口代理

三.MyBatis 映射配置文件 ***

3.1 映射配置文件介绍
  • 映射配置文件包含了数据和对象之间的映射关系以及要执行的 SQL 语句

    Mybatis基础_第8张图片

    • 这个namespace,命名空间,相当于是给这个映射节点,起一个名字
    • 内部的所有增删改查的配置,都需要通过这个命名空间获取
    • 语法:命名空间.id
3.2 查询功能