MyBatis 教程

👉 所有文章
文章列表 准备工作 回顾 JDBC 数据准备 查找id为1的用户信息 自定义连接池 不用MyBatis配置文件 查询密码为123的所有用户 如果Bean中成员变量和表中字段命名不一致 更多查询用户的方式 对查询结果排序 日志 添加、删除、修改数据 事务 动态SQL 一对一和一对多的实现 一对一和一对多的延迟加载 多对多的实现 分页查询 把SQL写在注解中 自动生成Mapper代码和映射XML mybatis generator 生成 select for update mybatis generator 支持数据版本号

MyBatis: 回顾 JDBC


为什么要回顾 JDBC ?因为 MyBatis 本质上是对 JDBC 的封装。

我们看下维基百科对 JDBC 的解释:

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标[1]。JDBC是面向关系型数据库的。

本文简单讲解下如何通过 JDBC 查询 MySQL 表中数据:

准备数据

-- 若有则删除
DROP DATABASE IF EXISTS `blog_db`;

-- 创建数据库
CREATE DATABASE `blog_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 用户表
CREATE  TABLE `blog_db`.`user` (
  `id` BIGINT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_name` (`name`) -- name 保证唯一
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;

-- 用户表添加数据
INSERT INTO `blog_db`.`user` (`name`, `email`, `password`) VALUES ('letian', 'letian@111.com', '123');
INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`) VALUES ('xiaosi', 'xiaosi@111.com', '123');

查看数据:

mysql> use blog_db;
mysql> select * from user;
+----+--------+----------------+----------+
| id | name   | email          | password |
+----+--------+----------------+----------+
|  1 | letian | letian@111.com | 123      |
|  2 | xiaosi | xiaosi@111.com | 123      |
+----+--------+----------------+----------+

查询示例

新建 gradle 项目,在 build.gradle 加入依赖:

compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'

compile group: 'org.projectlombok', name: 'lombok', version: '1.18.0'

compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'
compile group: 'log4j', name: 'log4j', version: '1.2.17'

compile group: 'junit', name: 'junit', version: '4.12'

新建 Main 类,加入示例代码:

import java.io.IOException;
import java.sql.*;

import lombok.extern.slf4j.Slf4j;

import org.junit.Test;


@Slf4j
public class Main {

    @Test
    public void test_01() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn =  DriverManager.getConnection(
                "jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&characterEncoding=utf8",
                "root",
                "123456"
        );

        Statement stmt = conn.createStatement();
        String sql = "SELECT id, name, email, password FROM user WHERE id=1";
        ResultSet rs = stmt.executeQuery(sql);

        // 读取数据
        while(rs.next()){
            log.info("id: {}", rs.getLong("id"));
            log.info("name: {}", rs.getString("name"));
            log.info("email: {}", rs.getString("email"));
            log.info("password: {}", rs.getString("password"));
        }

        // 关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }

    @Test
    public void test_02() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn =  DriverManager.getConnection(
                "jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&characterEncoding=utf8",
                "root",
                "123456"
        );

        PreparedStatement stmt = conn.prepareStatement("SELECT id, name, email, password FROM user WHERE id=?");
        stmt.setLong(1, 1); // 第1个参数代表对应sql的第几个问好,第2个参数代表对应的值
        ResultSet rs = stmt.executeQuery();

        // 读取数据
        while(rs.next()){
            log.info("id: {}", rs.getLong("id"));
            log.info("name: {}", rs.getString("name"));
            log.info("email: {}", rs.getString("email"));
            log.info("password: {}", rs.getString("password"));
        }

        // 关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }

}

test_01 函数是直接执行sql;test_01 通过 PrepareStatement 执行查询,更安全。

两个示例的执行结果都是:

 INFO [main] - id: 1
 INFO [main] - name: letian
 INFO [main] - email: letian@111.com
 INFO [main] - password: 123

如何更新数据、删除数据、事务的使用等等,在网络上可以搜索到,这里不做更多介绍。

本节代码示例见: jdbc-demo-001

更多 JDBC 内容,可参考 JDBC 教程


( 本文完 )

文章目录