(二)自定义 mybatis 之原生jdbc案例

前言

本文为个人技术总结,不够全面,瑕疵是有的,有用的话参考一下吧

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。

JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。 今天我们使用的是mysql的驱动mysql-connectorjava-5.1.39-bin.jar。

一、JDBC规范(掌握四个核心对象)

  • DriverManager:用于注册驱动
  • Connection: 表示与数据库创建的连接
  • Statement: 操作数据库sql语句的对象
  • ResultSet: 结果集或一张虚拟表

二、JDBC原理

Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。
在这里插入图片描述

JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

三、原生jdbc开发步骤

  1. 注册驱动.
  2. 获得连接.
  3. 获得执行sql语句的对象
  4. 执行sql语句,并返回结果
  5. 处理结果
  6. 释放资源.

四、原生jdbc案例

  • 查询user表
  • 以List集合形式返回
  • 编写pojo类 (User)
    • domain,pojo本质都是相同的

4.1 建库建表

CREATE DATABASE mybatis;
USE mybatis;

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '小妖', '0', '1996-07-10', '西安');
INSERT INTO `user` VALUES ('2', '狐狸', '1', '1996-07-10', '西安');
INSERT INTO `user` VALUES ('3', '虫子', '1', '1996-07-10', '北京');
INSERT INTO `user` VALUES ('4', '咕子', '1', '1996-07-10', '甘肃');

4.2 创建pojo对象

public class User {
    private Integer id;
    private String userName;
    private String sex;
    private Date birthday;
    private String address;

    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 getSex() {
        return sex;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}

4.3 jdbc代码

/**
 * 原生jdbc
 *
 * @Author: CYL
 * @Date: 2021/4/19 10:18
 */
public class UserDaoImpl implements UserDao {
		private String driverClass = "com.mysql.jdbc.Driver";
        private String url = "jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf-8";
        private String username = "root";
        private String password = "root";
    /**
     * 查询数据库 中的所有用户信息 并封装成一个 List<User>集合
     *
     * @return
     * @author cyl
     * @date 2021/4/19 10:19
     */
    @Override
    public List<User> queryUserList()throws Exception {
        // 注册驱动
        Class.forName(driverClass);
        // 获取连接
        Connection connection = DriverManager.getConnection(url, username, password);
        // sql
        String sql = "select id, username, sex, birthday, address from user;";

        // 获取SQL语句执行平台statement对象
//        Statement statement = connection.createStatement();
        PreparedStatement statement = connection.prepareStatement(sql); // prepareStatement(预处理)
        // 执行sql
        ResultSet resultSet = statement.executeQuery();

        List<User> list = new ArrayList<>();
        User user = null;
        // 解析结果集
        while (resultSet.next()) {
            user = new User();
            int id = resultSet.getInt("id");
            String userName = resultSet.getString("username");
            String sex = resultSet.getString("sex");
            Date birthday = resultSet.getDate("birthday");
            String address = resultSet.getString("address");

            user.setId(id);
            user.setUserName(userName);
            user.setSex(sex);
            user.setBirthday(birthday);
            user.setAddress(address);

            list.add(user);
        }
        
        // 关闭资源
        resultSet.close();
        statement.close();
        connection.close();
        return list;
    }
}

4.4 测试程序

public class MainTest {
    @Test
    public void testJDBC() throws Exception {
        UserDao userDao = new UserDaoImpl();
        List<User> list = userDao.queryUserList();
        
        list.forEach(System.out::println);
    }
}

4.5 原生jdbc存在的问题

  • 频繁连接,释放数据库资源,降低系统性能
  • SQL语句硬编码,难以维护
  • 参数和占位符对应问题
  • 结果集解析复杂,列名硬编码

原生jdbc也可以写一个JDBCUtils优化,这里不再过多赘述,此篇文章目的是为下篇《自定义 mybatis 之手写一个简单的Mybatis》做铺垫,Mybatis是对jdbc的封装,下面来看一下如何自定义一个简单的Mybatis:《自定义 mybatis 之手写一个简单的Mybatis》

posted @ 2021-04-22 16:38  貂上蝉  阅读(284)  评论(0编辑  收藏  举报