Mybatis 知识总结1(入门、JDBC、数据库连接池、lombok介绍)

Mybatis 知识总结(一)

3.1 Mybatis 介绍

什么是 Mybatis ?

Mybatis
  • MyBatis 是一款优秀的持久层框架,用户简化 JDBC 的开发。
  • MyBatis 是 Apache 的一个开源项目 iBaits,2010年这个项目由 apache 迁移到了 google code,并且改名为 MyBatis。2013年11月迁移到 Github。
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

3.2 MyBatis 入门

快速入门

  • 需求说明

  使用 MyBatis 查询所有的用户数据。

  要查询所有的用户数据,可以在图形化界面工具中写 select * form user; 查询 sql 语句,然后把这条语句发送给数据库服务器执行,数据库然后将查询的结果返回给图形化界面工具展示。而 MyBatis 操作数据库其实就是在 java 程序中编写 sql 语句发送给数据库执行,然后数据库将查询结果返回给 java 程序。

图形化界面工具查询数据库 MyBatis查询数据库
  • 1、准备工作(创建 springboot 工程、数据库表 user、实体类 User)

  创建 springboot 工程:File >> new >> module… 进入到新建模块弹窗,选择 Spring Initializr 及模块的 JDK 版本和模块的相关基本信息,在选择依赖时需要添加 SQL 中的 MyBatis FrameworkMySQL Driver(JDBC 的实现类) 依赖。

1 2 3

  创建数据库表 user

-- 建表语句
CREATE TABLE user(
id int PRIMARY KEY auto_increment COMMENT 'ID,唯一标识',
name VARCHAR(20) not null unique COMMENT '用户名',
age INT COMMENT '年龄',
gender TINYINT DEFAULT '1' COMMENT '性别',
phone char(11) COMMENT '手机号'
)COMMENT '用户表';
-- 插入数据
INSERT INTO `user` (id,name,age,gender,phone)VALUES (1,'张三',17,1,'11199990000');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (2,'李四',34,1,'22299998888');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (3,'王五',34,1,'33399993333');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (4,'麻子',24,1,'44499994444');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (5,'小如',20,2,'55599995555');

  创建实体类Usersrc/main/java/com/ganming/pojo/User.java

public class User {
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;
	// 自动生成 Getter and Setter、Constructor、toString方法
}
  • 2、引入 MyBatis 的相关依赖,配置 MyBatis (数据库连接信息)

  在创建 springboot 项目时已经引入了 MyBatis 的相关依赖,相关依赖如下:pom.xml

...
<dependencies>
    <!--MyBatis 的起步依赖-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version>
    </dependency>
    <!--Mysql 驱动包,刚刚发布的最新版的驱动包-->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!--Mysql 驱动包,上一个版本的驱动包-->
    <!-- <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-jave</artifactId>
        <scope>runtime</scope>
    </dependency>-->

    <!--springboot 单元测试依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
... 

  在 src/main/resources/application.properties 配置文件(创建 springboot 工程时自带该文件)中配置连接数据库四要素

连接数据库配置文件
  • 3、编写 SQL 语句(注解/XML)

  需要定义 UserMapper 持久层的接口src/main/java/com/ganming/mapper/UserMapper.java

package com.ganming.mapper;

import com.ganming.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper     // 在运行时,框架会自动的生成该接口的实现类对象(代理对象),并且将该对象交给 IOC 容器管理
public interface UserMapper {
    // 查询全部用户信息
    @Select("select * from user")
    public List<User> list();
}

  @Mapper 注解:在运行时,框架会自动的生成该接口的实现类对象(代理对象),并且将该对象交给 IOC 容器管理。

  @Select 注解:表示下面的方法要执行一个查询语句。里面的值就是要执行的 sql 语句。

  配置 SQL 提示:12行中的 select * from user 在程序中只是一个字符串,没有输入提示,写错了 idea 也不会有报错提示。可通过下面图中设置来配置 SQL 提示。

  选中 sql 语句 >> Show Context Actions >> Inject language or reference >> MySQL(SQL)。

1 2 3
4 5 6

  配置数据库表的提示:在上述 sql 语句中指定表名 user 时没有提示,是因为 Idea 和数据库之间米有建立连接,不识别表信息;可在 Idea 中配置 MySQL 数据库连接。

1 2
1
  • 4、编写单元测试

  在 src/test/java/com/ganming/MybatisApplicationTests.java 单元测试文件中编写测试查询全部用户信息的方法 testListUser() 代码。

import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest     // springboot 整合单元测试的注解
class MybatisApplicationTests {
    @Resource       // 完成依赖注入
    private UserMapper userMapper;

    @Test
    public void testListUser(){
        List<User> userList = userMapper.list();
        userList.stream().forEach(user -> {
            System.out.println(user);
        });
    }
}

  运行测试方法,检验输出:

1

JDBC 介绍

  前面介绍 MyBatis 简化 JDBC 的开发,接下来介绍下 JDBC。

  • 1、JDBC(Java DataBase Connectivity):就是使用 java 语言操作关系型数据库的一套 API。
1

  JDBC本质

  sun 公司官方定义的一套操作所有关系型数据库的规范,即接口

  各个数据库厂商去实现这套接口,即数据库驱动 jar 包

  我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。

  在 src/test/java/com/ganming/MybatisApplicationTests.java 单元测试文件中编写测试 JDBC 的方法:

@Test
public void testJDBC() throws Exception{
    // 1. 注册驱动
    Class.forName("com.mysql.cj.jdbc.Driver");
    // 2. 获取连接对象
    String url = "jdbc:mysql://localhost:3306/mybatis";
    String username = "root";
    String password = "xxxx";
    Connection connection = DriverManager.getConnection(url,username,password);
    // 3. 获取执行 SQL 的对象 Statement,执行 SQL,返回结果
    String sql = "select * from user";
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    // 4. 封装结果数据
    List<User> userList = new ArrayList<>();
    while(resultSet.next()){
        int id = resultSet.getInt("id");
        String name = resultSet.getString("name");
        short age = resultSet.getShort("age");
        short gender = resultSet.getShort("gender");
        String phone = resultSet.getString("phone");
        User user = new User(id,name,age,gender,phone);
        userList.add(user);
    }
    // 5. 释放资源
    statement.close();
    connection.close();
	// 6. 结果展示
    userList.stream().forEach(user -> {
        System.out.println(user);
    });
}

  上面的测试方法同样输出预期信息。

1

  直接使用 JDBC 驱动编程会有如下问题:

1 1

  使用 SpringBoot + MyBatis 可以解决上述问题,MyBatis 将数据库的连接信息写在配置文件 application.properties 中,修改不用改 java 代码。MyBatis 用一个 mapper 接口类实现自动的数据封装工作。其次 MyBatis 使用数据库连接池技术解决了频繁创建和释放资源的问题,当要执行 sql 语句时,从数据库连接池中获取一个连接资源,执行完后自动归返资源实现资源的复用。

数据库连接池

  • 1、什么是数据库连接池

  数据库连接池是个容器,负责分配管理数据库连接(Connection);

  数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

  释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏;

  数据库连接池与 JDBC 创建连接对比:

1
  • 2、优势:

  ①资源重用;②提升系统响应速度;③避免数据库连接遗漏

  • 3、标准接口:DataSource

  官方(sun公司)提供的数据库连接池接口,由第三方组织实现接口。

  功能:要实现获取连接的接口:Connection getConnection() throws SQLException;

  实现了数据库连接池接口的产品:C3P0、DBCP、DruidHiKari(springboot 默认)

  执行前面编写的 testListUser() 测试方法,观察控制台输出的信息 springboot 默认的连接池实现类为 HikarDataSource,查看 HikariDataSource 实现类。

1 2 3

  Druid(德鲁伊):Druid 连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是 java 语言最好的数据库连接池之一。

  • 4、切换 Druid 数据库连接池

  引入 Druid 数据库连接池的依赖,坐标通过官方地址查询:   https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

  在 pom.xml 引入 Druid 的依赖,然后运行前面编写的 testListUser() 测试方法,观察控制台输出的数据池实现类的改变。

<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter Druid 连接池依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>
切换数据库连接池

  JDBC 配置:保持原先的配置或者如下

spring.datasource.druid.url= # 或spring.datasource.url= 
spring.datasource.druid.username= # 或spring.datasource.username=
spring.datasource.druid.password= # 或spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=

lombok

  • 问题分析:定义 User 实体类时,需要给属性添加 getter、setter、equals、hashCode、toString 及构造器方法,代码比较臃肿。
问题分析
  • lombok 介绍:lombok 是一个使用的 Java 类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashCode、toString等方法,并可以自动化生成日志变量,简化 Java 开发、提高效率。
lombok注解
  • 使用 lombok:

  在 pom.xml 中引入 lombok 的依赖

<!-- lombok 依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

  给实体类 src/main/java/com/ganming/pojo/User.java 添加注解

package com.ganming.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;
}

  注意事项:lombok 会在编译时,自动生成对应的 java 代码。我们使用 lombok 时,还需要安装一个 lombok 的插件(idea有自带)。

  settings…>>Plugins>>Marketplace

lombok插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItDaChuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值