MyBatis-01-Mybatis入门

发布于:2022-12-14 ⋅ 阅读:(285) ⋅ 点赞:(0)

目录

一.MyBatis框架概述

二.JDBC的编程分析

连接JDBC代码回顾

JDBC问题分析

三.Mybatis和其它持久化层技术对比

四.Mybatis入门准备

五.MyBatis开发步骤:

1.新建maven项目

如果使用maven创建的项目,需导入相关依赖:

在pom.xml导入依赖

2.创建数据表

3.编写User实体类

4.编写持久层UserMapper接口

5.编写持久层接口的映射文件UserMapper.xml

6.编写核心配置文件mybatis-Config.xml

7.编写核心配置文件jdbc.properties

8.编写log4j.xml文件

六.核心对象 

1.核心接口与类的关系​

2.SqlSessionFactoryBuilder

3.SqlSessionFactory  

4.SqlSession 

七.编写测试类

1.运行步骤

2.MyBatisTest

八.总结


学习目标

  • 【学习】MyBatis的快速入门
  • 【实操】MyBatis的查询数据操作
  • 【掌握】MyBatis核心配置文件概述

一.MyBatis框架概述

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

二.JDBC的编程分析

这里有两个区别:
其中第一个是 以前的 驱动包是 com.mysql.jdbc.Driver 而安装了 mysql 8.0过后要改成 com.mysql.cj.jdbc.Driver , 连接方式也不需要SSL方式了,所以要手动设置为false
Class.forName(“com.mysql.cj.jdbc.Driver”);
conn=DriverManager.getConnection
(“jdbc:mysql://localhost:3306/你的数据库名字?useSSL=false&serverTimezone=UTC”,“root”,“你的root账户下的密码”);
实际例子 (有mysql5和mysql8的连接对比

连接JDBC代码回顾

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcTest {

    public static void main(String[] args) {
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;

    try {
        // 加载数据库驱动     区别一: 
        //mysql5的写法:   Class.forName("com.mysql.jdbc.Driver");
        //mysql8 写法 如下
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 通过驱动管理类获取数据库连接     区别二:  
        //mysql5:   connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
        // mysql8:
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC","root","root");
        // 定义sql语句 ?表示占位符
        String sql = "select * from user where username = ?";
        // 获取预处理statement
        preparedStatement = connection.prepareStatement(sql);
        // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
        preparedStatement.setString(1, "大马猴");
        // 向数据库发出sql执行查询,查询出结果集
        resultSet = preparedStatement.executeQuery();
        // 遍历查询结果集
        while (resultSet.next()) {
            System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // 释放资源
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
}

JDBC问题分析

 1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

(Mybatis)问题解决方案:

1.使用数据库连接池初始化连接资源
2.将sql语句抽取到xml配置文件中
3.使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

三.Mybatis和其它持久化层技术对比

JDBC
SQL 夹杂在 Java 代码中耦合度高,导致硬编码内伤
维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
代码冗长,开发效率低
Hibernate JPA
操作简便,开发效率高
程序中的长难复杂 SQL 需要绕过框架
内部自动生产的 SQL ,不容易做特殊优化
基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
反射操作太多,导致数据库性能下降

MyBatis
轻量级,性能出色
SQL Java 编码分开,功能边界清晰。 Java 代码专注业务、 SQL 语句专注数据
开发效率稍逊于 HIbernate ,但是完全能够接受

四.Mybatis入门准备

 Mybatis官网地址:mybatis – MyBatis 3 | Introduction 

Mybatis中文官网地址:mybatis – MyBatis 3 | 简介  

五.MyBatis开发步骤:

1.添加MyBatis学习的依赖

2.创建数据表

3.编写User实体类

4.编写持久层UserMapper接口

5.编写持久层接口的映射文件UserMapper.xml

6.编写核心配置文件mybatis-Config.xml

7.编写核心配置文件jdbc.properties

8.编写log4j.xml文件

9.编写测试类

1.新建maven项目

如果使用maven创建的项目,需导入相关依赖:

在pom.xml导入依赖

pom.xml :

<!-- Mybatis核心 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- junit测试 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<!-- MySQL驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>

<!-- log4j日志 -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2.创建数据表

数据库:mybatis      表:t_user

 SQL文件:

/*
 Navicat Premium Data Transfer

 Source Server         : mybatis
 Source Server Type    : MySQL
 Source Server Version : 80013
 Source Host           : localhost:3306
 Source Schema         : mybatis

 Target Server Type    : MySQL
 Target Server Version : 80013
 File Encoding         : 65001

 Date: 17/09/2022 12:00:15
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `sex` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 37 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'admin', '123456', 123, '男', '1234@qq.com');
INSERT INTO `t_user` VALUES (2, 'admin', '123456', 1234, '男', '12345·12341@qq.com');
INSERT INTO `t_user` VALUES (3, 'admin', '123456', 2365, '男', '1234543@qq.com');
INSERT INTO `t_user` VALUES (4, '张三', '123456', 7654, '男', '34567@qq.com');
INSERT INTO `t_user` VALUES (36, 'admin', '123456', 54, '男', '2345678@qq.com');
INSERT INTO `t_user` VALUES (37, 'admin', '123456', 23543, '男', '1234567@qq.com');
INSERT INTO `t_user` VALUES (38, 'admin', '123456', 2332, '男', '12345678@qq.com');
INSERT INTO `t_user` VALUES (39, 'admin', '123456', 2322, '男', '1234567@qq.com');
INSERT INTO `t_user` VALUES (40, 'admin', '123456', 2322, '男', '123456@qq.com');

SET FOREIGN_KEY_CHECKS = 1;

3.编写User实体类

package com.wsay.mybatis.pojo;

public class User {

    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;

    public User(){


    }
    public User(Integer id, String username, String password, Integer age, String sex, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

4.编写持久层UserMapper接口

MyBatis 中的 mapper 接口相当于以前的 dao 。但是区别在于, mapper 仅仅是接口,我们不需要 提供实现类。
package com.wsay.mybatis.mapper;

import com.wsay.mybatis.pojo.User;

import java.util.List;

public interface UserMapper {

    // mybatis面向接口编程的两个一致。
    // 1.映射文件的namespace要和mapper接口的全类名保持一致。
    // 2.映射文件中sql语句id和mapper接口中的方法名一致
    //
    // 表--实体类--mapper接口--映射文件


    //查询所有的用户信息

    List<User> getAllUser();

}

5.编写持久层接口的映射文件UserMapper.xml

相关概念: ORM O bject R elationship M apping )对象关系映射。
对象: Java 的实体类对象
关系:关系型数据库
映射:二者之间的对应关系
1 、映射文件的命名规则:
表所对应的实体类的类名 +Mapper.xml
例如:表 t_user ,映射的实体类为 User ,所对应的映射文件为 UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis 映射文件用于编写 SQL ,访问以及操作表中的数据
MyBatis 映射文件存放的位置是 src/main/resources/mappers 目录下
2 MyBatis 中可以面向接口操作数据,要保证两个一致:
a>mapper 接口的全类名和映射文件的命名空间( namespace )保持一致
b>mapper 接口中方法的方法名和映射文件中编写 SQL 的标签的 id 属性保持一致

创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.xml

 UserMapper.xml

<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wsay.mybatis.mapper.UserMapper">

<!--    List<User> getAllUser();-->
    <select id="getAllUser" resultType="com.wsay.mybatis.pojo.User">
        select * from t_user
    </select>
</mapper>

6.编写核心配置文件mybatis-Config.xml

习惯上命名为 mybatis-config.xml ,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring
之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及 MyBatis 的全局配置信息
核心配置文件中的标签必须按照固定的顺序:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorF
actory?,plugins?,environments?,databaseIdProvider?,mappers?

 核心配置文件的目录

注意元素节点的顺序!

mybatis-Config.xml

<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

        <!--
        mybatis核心配置文件中,标签的顺序:
        properties?,settings?,typeAliases?,typeHandlers?,objectFactory?
        ,objectWrapperFactory?,reflectorFactory?,plugins?,environments?
        ,databaseIdProvider?,mappers
        -->
    
<!--    引入properties文件-->
    <properties resource="jdbc.properties"/>
    
        <!--    设置类型别名-->
    <typeAliases>
        <!--typeAlias:设置某个类型的别名
               属性:
               type:设置需要设置的别名的类型】
               alias:设置某个类型的别名,若不设置该属性,那么该类型的拥有默认的别名,即类名且不区分大小写
            -->
<!--        <typeAlias type="com.wsay.mybatis.pojo.User"></typeAlias>-->
                <!--        以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
        <package name="com.wsay.mybatis.pojo"/>
    </typeAliases>
    <!--
        environments:配置多个连接数据库的环境
        
        属性:
            default:设置默认使用的环境的id
        -->
    <environments default="development">
                <!--
                environment:配置某个具体的环境
                属性:
                id:表示连接数据库的环境的唯一标示,不能重复
                -->
        <environment id="development">
            <!--
                transactionManager:设置事务管理方式
                属性;
                type:"JDBC/MANAGED"
                JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式  事务的提交或者回滚需要手动处理
                MANAGED:被管理,例如spring
                -->
            <transactionManager type="JDBC"/>
            <!--
            dataSource:配置数据源
            属性:
                type:配置数据源的类型
                type:"POOLED/UNPOOLED/JNDI"
                POOLED:表示使用数据库连接池缓存数据库连接
                UNPOOLED:表示不使用数据库连接池
                JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <!--设置连接数据库的驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--设置连接数据库的连接地址-->
                <property name="url" value="${jdbc.url}"/>
                <!--设置连接数据库的用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--设置连接数据库的密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
<!--引入映射文件-->
    <mappers>
<!--        <package name="com.wsay.mybatis.mapper"/>-->
            <!--
                以包为单位引入映射文件
                要求:
                1.mapper接口所在的包要和映射文件所在的包一致
                2.mapper接口要和映射文件的名字一致
            -->
        <package name="com.wsay.mybatis.mapper"/>
    </mappers>
</configuration>

7.编写核心配置文件jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root

8.编写log4j.xml文件

log4j 的配置文件名为 log4j.xml ,存放的位置是 src/main/resources 目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql"> <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis"> <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

六.核心对象 

1.MyBatis的核心对象

SqlSessionFactoryBuilder

SqlSessionFactory

SqlSession

2.MyBatis核心配置文件

3.SQL映射文件

1.核心接口与类的关系

2.SqlSessionFactoryBuilder

SqlSessionFactoryBuilder

用过即丢,其生命周期只存在于方法体内 负责构建SqlSessionFactory,并提供多个build()方法的重载

build( InputStream inputStream, String environment, Properties properties )

build( Reader reader, String environment, Properties properties )

build( Configuration config)

// 读取XML文件构造方式

String resource = "mybatis-config.xml";

InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

3.SqlSessionFactory  

SqlSessionFactory 

SqlSessionFactory是每个MyBatis应用的核心

作用:创建SqlSession实例

openSession( boolean autoCommit )true :关闭事务控制(默认) false:开启事务控制

生命周期与应用的生命周期相同

单例

存在于整个应用运行时,并且同时只存在一个对象实例

4.SqlSession 

 SqlSession

包含了执行SQL所需的所有方法

非线程安全,不能共享

对应一次数据库会话,会话结束必须关闭

// 1. 创建SqlSession实例

SqlSession sqlSession = MyBatisUtil.createSqlSession();

try {    

     // 2. do work

} finally {

    // 3. 关闭SqlSession    

    MyBatisUtil.closeSqlSession(sqlSession);

    //关闭SqlSession非常重要,必须要 确保在finally方法体中正常关闭

}

SqlSession的两种使用方式

通过 namespace+id 字符串运行映射的SQL语句

基于Mapper接口方式执行SQL语句

七.编写测试类

1.运行步骤

  1. 读取MyBatis核心配置文件
  2. 创建SqlSessionFactory实例
  3. 创建SqlSession实例
  4. 创建Mapper实例执行SQL映射文件中的SQL语句

2.MyBatisTest

SqlSession :代表 Java 程序和 数据库 之间的 会话 。( HttpSession Java 程序和浏览器之间的
会话)
SqlSessionFactory :是 生产 ”SqlSession 工厂
工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的
相关代码封装到一个 工厂类 中,以后都使用这个工厂类来 生产 我们需要的对象。
package com.wsay.mybatis.test;

import com.wsay.mybatis.mapper.UserMapper;
import com.wsay.mybatis.pojo.User;
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 testgetAllUser() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //使用代理对象执行方法
        List<User> list = mapper.getAllUser();
        //释放资源
        list.forEach(user -> System.out.println(user));
    }
}

八.总结

以上就是MyBatis入门,下一篇博文:MyBatis-02-Mybatis增删改查 

下一篇博文地址:MyBatis-02-Mybatis增删改查