JDBC API(基于SpringBoot)

一 前言
现在开发一般都是Mybatis 也有公司用Hiberate 或者是Spring JPA
不管用的是什么ORM框架 都是在JDBC上封装了一层
二 ORM
Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象。
三 Jdbc 准备
1.1JDBC脑图
JDBC API(基于SpringBoot)_第1张图片
什么是JDBC
JDBC :Java Database Connectivity JAVA数据库连接
1.
准备 创建test 数据库
2 配置Driver
和JDBC 依赖


org.springframework.boot
spring-boot-starter-jdbc

四 JDBC代码实现
package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Jdbc {
public static void main(String[] args) throws Exception {
//1 注册驱动
Class.forName(“com.mysql.cj.jdbc.Driver”);
//2 数据库连接
Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/test?serverTimezone=GMT”,“数据库用户名”,“数据库密码”);
//3 获取传输器
Statement stat=conn,createStatement();
//4 发送sql 返回执行结果
String sql=“select name from test”;
ResultSet rs=stat.executeQuery(sql);
//5 处理结果集
while(rs.next()){
String name=rs,getString();
system.out,println(name);
}
//6 释放资源
rs.close();
stat.close();
conn.close();
}

比较Statement 和PrepareStatement
在上面的增删改查的操作中,使用的是Statement传输器对象,而在开发中我们用的更多的传输器对象是PreparedStatement对,PreparedStatement是Statement的子接口,比Statement更加安全,并且能够提高程序执行的效率
1Statement对象编译SQL语句时,如果SQL语句有变量,就需要使用分隔符来隔开,如果变量非常多,就会使SQL变得非常复杂。2PreparedStatement可以使用占位符,简化sql的编写
Statement会频繁编译SQL。3PreparedStatement可对SQL进行预编译,提高效率,预编译的SQL存储在PreparedStatement对象中
4 PreparedStatement防止SQL注入。(Statement通过分隔符’++’,编写永等式,可以不需要密码就进入数据库)

六 数据库连接池
JDBC API(基于SpringBoot)_第2张图片
使用连接池: 在程序一启动时,就往一个池子(容器,比如集合)中放一批连接,供整个程序共享。当用户需要连接时,不用再创建连接,而是直接从池子中获取一个连接再使用。基于连接访问数据库。

当用完连接后,不要关闭连接,而是将连接再还回连接池中,这样一来,就可以重复的使用池子中的这一批连接,实现了连接的复用,而且也减少了连接创建和关闭的次数,提高了程序执行的效率。

mysql
mysql-connector-java
runtime

SpringBoot 默认的连接池是
为何选择HikariCP
HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池,是一个高性能的JDBC连接池,基于BoneCP做了不少的改进和优化。其作者还有另外一个开源作品——高性能的JSON解析器HikariJSON。
七 JDBCUtils
public class Test {

@org.junit.Test
public void add() throws SQLException {

    //创建出QueryRunner对象
    QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
    String sql = "INSERT INTO student (id,name) VALUES(?,?)";

    //我们发现query()方法有的需要传入Connection对象,有的不需要传入
    //区别:你传入Connection对象是需要你来销毁该Connection,你不传入,由程序帮你把Connection放回到连接池中
    queryRunner.update(sql, new Object[]{"100", "zhongfucheng"});

}

@org.junit.Test
public void query()throws SQLException {

    QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
    String sql = "SELECT * FROM student";

    List list = (List) queryRunner.query(sql, new BeanListHandler(Student.class));
    System.out.println(list.size());

}

@org.junit.Test
public void delete() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
    String sql = "DELETE FROM student WHERE id='100'";

    queryRunner.update(sql);
}

@org.junit.Test
public void update() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
    String sql = "UPDATE student SET name=? WHERE id=?";

    queryRunner.update(sql, new Object[]{"zhongfuchengaaa", 1});
}

@org.junit.Test
public void batch() throws SQLException {
    //创建出QueryRunner对象
    QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
    String sql = "INSERT INTO student (name,id) VALUES(?,?)";

    Object[][] objects = new Object[10][];
    for (int i = 0; i < 10; i++) {
        objects[i] = new Object[]{"aaa", i + 300};
    }
    queryRunner.batch(sql, objects);
}

}

你可能感兴趣的:(JDBC)