JDBC

1. JDBC简介

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

u Java DataBase Connectivity(java数据库连接)

u 组成包:java.sql.*;javax.sql.*;这两个包都包含在了JDK中。

u 还需要数据库的驱动,这些驱动就相当于对JDBC规范的实现

2. 入门程序

开发步骤

1. 创建一个java项目

2. 导入mysql的数据库驱动jar包   驱动包

3. 注册驱动   Class.forName(“”)

4. 获取与数据库的链接

5. 得到代表发送和执行SQL语句的对象 Statement

6. 执行语句

7. 如果执行的是查询语句,就会有结果集,处理

8. 释放占用的资源

// 注册数据库驱动

DriverManager.deregisterDriver(new Driver());

// 获取数据库连接

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm", "root", "hang");

// 获取执行sql语句的statem0ent

Statement st = conn.createStatement();

String sql = "select * from user ";

// 执行sql语句增删改查

//st.executeUpdate("insert into user values(12,'杨过','123456')");

//st.executeUpdate("update user set namer='杨康' where id='12'");

//st.executeUpdate("delete from user where id='12'");

ResultSet set = st.executeQuery(sql);

while (set.next()) {

// 获取指定位置的数据,角标从1 开始

String com1 = set.getString(1);

String com2 = set.getString(2);

String com3 = set.getString(3);

String com4 = set.getString(4);

System.out.println(com2 + ":" + com3 + ":" + com4 + ":" + com1);

}

// 释放数据库资源

set.close();

st.close();

conn.close();

3. 主要接口或类

3.1. DriverManger

作用

a、注册驱动

b、获取与数据库的链接

改进注册驱动:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

缺点:严重依赖具体的驱动类;会导致驱动被注册2次。

替代方案:Class.forName("com.mysql.jdbc.Driver");

获取与数据库的链接

DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm", "root", "hang");  //ssm为数据库名

Class.forName("com.mysql.jdbc.Driver");

// 获取数据库连接

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm", "root", "hang");

3.2. Connection

所有的与数据库的交互都是基于链接的基础之上的,想要对数据库进行操作,首先要获取此对象,从连接对象中获取执行数据库的statement对象

Statement stmt = conn.createStatement():创建向数据库发送sql的statement对象

3.3. Statement

作用:

向数据库发送并执行具体的SQL语句

常用方法:

常用方法:

u ResultSet executeQuery(String sql):只适合查询,返回的是查询的结果集

u int executeUpdate(String sql):适合DML,或者没有返回结果集的DDL,返回的是影响的记录行数

boolean execute(String sql):执行任何的SQL语句,返回的不是成功与否。有结果集的返回true,没有返回false。

//有结果集的返回true,没有返回false

boolean b = st.execute(sql);

//u返回的是影响的记录行数

int update = st.executeUpdate(sql);

//返回结果集

ResultSet set = st.executeQuery(sql);

3.4. PreparedStatement

PreparedStatement实现Statement

u PreparedStatement需要预编译以及需要参数

u  由于PreparedStatement有缓存区,所以效率更高

u  由于PreparedStatement有缓存区,所以更安全,防止了注入(1=1)

u   语句中的参数可以使用占位符(?)

// 2:准备sql预编译语句

// ?占用一个参数位

String sql = "INSERT INTO user (NAME,sex,age) VALUES (?,?,?);";

// 3:执行sql预编译语句(检查语法)

stsm=conn.prepareStatement(sql);

// 4:设置传递的参数

stsm.setString(1,"张三");

stsm.setString(2,"男");

stsm.setInt(3,20);

// 5:发送参数,执行sql

// 注意:这里的方法后面没有参数

int result = stsm.executeUpdate();

能用PreparedStatement就不要使用Statement

3.5. ResultSet

作用:

代表者查询语句的查询结果集

3.6. 释放占用的资源

按照打开的顺序,以相反的方向进行释放。

Connection要尽量晚的创建和尽量早的释放。

为了保障资源能被释放,应该放到finally代码块中

finally{

//6.关闭资源  (有顺序)

if(rs!=null){

try {

rs.close();

rs = null;  //垃圾回收器立即回收

} catch (SQLException e) {

e.printStackTrace();

}

}

if(st!=null){

try {

st.close();

st = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

if(con!=null){

try {

con.close();

con = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

}

优化代码如下:最开始的例子中存在,数去库驱动两次注册,数据未封装,关闭资源不规范,异常未处理等问题 。

public static void main(String[] args) {

Connection con = null;

Statement st = null;

ResultSet rs = null;

try {

//1.注册驱动 (注册的是mysql的实现类)

Class.forName("com.mysql.jdbc.Driver");

//2.获取与数据库连接的对象 这种方式用得最多

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm", "root", "hang");

//3.得到用于发送和执行sql语句的对象  statement

st = con.createStatement();

//4.执行语句

rs = st.executeQuery("select * from book ");//用于查询的

//5.如果是查询,就有结果集,就要处理结果集

List<Book> list = new ArrayList<Book>();

while(rs.next()){

Book book = new Book();

book.setBid(rs.getString("bid"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

list.add(book);

}

//展示数据

for(Book book :list){

System.out.println(book);

4. 工具类的提取

问题一 ;

根据上面的例子咳咳发现,获取数据库连接,释放数据库资源的代码都一样,可以提取出来一个方法,当获取连接,释放资源是直接调用方法,减少代码的冗余度。

问题二 :加载数据库驱动,获取连接时存在硬编码,当数据库改变,数据库类型改变。密码等信息改变时,代码不利于维护 。

4.1. 配置文件properties

配置数据库连接的信息,数据都是以key/value的形式保存

在src跟目录下创建db.properties 文件 。

获取配置文件中的value

//通过类加载器,获取db.propertis文件的输入流

InputStream in = GetProperties.class.getClassLoader().getResourceAsStream("db.properties");

Properties p = new Properties();

try {

p.load(in);//加载文件内容

//根据key的名称获取文件的value值

String driverClass = p.getProperty("driverClass");

String jdbcUrl = p.getProperty("jdbcUrl");

String username = p.getProperty("username");

String password = p.getProperty("password");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

4.2. 封装工具类,提取获取连接 ,关闭资源方法

public  static   String DRIVER ;

public  static   String URL ;

public  static   String USERNAME ;

public  static   String PASSWORD ;

static{

//读取配置文件的方式

InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");

Properties p = new Properties();

try {

p.load(is);

DRIVER = p.getProperty("driverClass");

URL = p.getProperty("jdbcUrl");

USERNAME = p.getProperty("username");

PASSWORD = p.getProperty("password");

Class.forName(DRIVER);//加载驱动

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 获取数据库连接

* @return

* @throws Exception

*/

public static Connection getConnection() throws Exception{

return DriverManager.getConnection(URL, USERNAME, PASSWORD);

}

/**

* 关闭资源的方法

* @param rs

* @param st

* @param con

*/

public static void release(ResultSet rs ,Statement st,Connection con){

//6.关闭资源  (有顺序)

if(rs!=null){

try {

rs.close();

rs = null;  //垃圾回收器立即回收

} catch (SQLException e) {

e.printStackTrace();

}

}

if(st!=null){

try {

st.close();

st = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

if(con!=null){

try {

con.close();

con = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

}

4.3. 工具类的使用

获取连接时调用工具类的获取连接方法,释放资源时,调用释放资源的方法

Connection con = null;

Statement st = null;

ResultSet rs = null;

try {

con = JdbcUtil.getConnection();

st = con.createStatement();

rs = st.executeQuery("");

while(rs.next()){

//封装数据

}

} catch (Exception e) {

e.printStackTrace();

}finally{

JdbcUtil.release(null, st, con);

}

5. 数据库连接池

5.1. 什么是数据库连接池

    数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

 优点

u 节省创建连接与释放连接 性能消耗

u  连接池中连接起到复用的作用 ,提高程序性能

5.2. 数据库连接池的运行机制

(1)  程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

5.3. C3p0连接池 dbcp连接池

5.4. C3p0 的使用

5.4.1. 添加两个jar包

5.4.2. 数据库的源配置文件

db.properties   前面的可以任意,但是需要自己加载

driverClass=com.mysql.jdbc.Driver

jdbcUrl=jdbc:mysql://localhost:3306/ssm

username=root

password=root

以下两种配置方式,c3p0连接池会自动读取配置文件   数据源

c3p0.properties   文件名不能改, 必须放在src下  ,配置文件中的key名称不能变

c3p0.driverClass=com.mysql.jdbc.Driver

c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=UTF-8

c3p0.user=root

c3p0.password=root

c3p0-config.xml   可以配置多个数据库连接并且可以指定名字去加载

ComboPooledDataSource dataSource = new ComboPooledDataSource("my");

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

<!-- 默认的配置,默认读取该配置 -->

<default-config>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">jdbc:mysql:///数据库名</property>

<property name="user">root</property>

<property name="password">root</property>

</default-config>

<!-- 指定名称的配置 -->

<named-config name="my">

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">jdbc:mysql:///数据库名</property>

<property name="user">root</property>

<property name="password">root</property>

</named-config>

</c3p0-config>

如果使用上面的两种颜色的配置文件配置,且放在src目录下  c3p0数据库连接池会自动读取配置文件,

// 测试c3p0

ComboPooledDataSource dataSource = new ComboPooledDataSource();

QueryRunner runner = new QueryRunner(dataSource);

query(sql, new BeanListHandler<封装的实体类>(类名.class), 参数可以多个);

可以直接执行sql语句

c3p0有自动回收空闲连接功能 自动连接

mysql

join

jdbc

数据库连接池

dbcp  半自动化操作  不能自动连接

c3p0  自动化操作(自动的加载配置文件 并且设置到对象里面)  自动尝试连接

Druid  阿里巴巴的开源连接池

开发步骤

1 导包  驱动包  连接池 依赖包  工具包

2 连接池对象

3 获取连接

mysql复习(2)相关推荐

  1. 计算机二级mysql工具_2020年全国计算机二级MySQL复习知识点:优化工具

    [摘要] 即将参加全国计算机等级考试的考生们,考试即将到来,大家的备考工作进行得如何了?考必过为大家精心整理了2020年全国计算机二级MySQL复习知识点:优化工具,希望能够助力全国计算机等级考试,相 ...

  2. MySQL复习值代码知识点(1)

    MySQL复习值代码知识点 一. 创建数据库 create database 数据库名: 二. 删除数据库 drop database 数据库名: 三. 选择相应的数据库 use 数据库名: 四. 创 ...

  3. 全国二级 mysql有用_2020年全国计算机二级MySQL复习知识点:调整服务器

    [摘要] 即将参加全国计算机等级考试的考生们,考试即将到来,大家的备考工作进行得如何了?考必过为大家精心整理了2020年全国计算机二级MySQL复习知识点:调整服务器,希望能够助力全国计算机等级考试, ...

  4. Mysql复习计划(一)- 字符集、文件系统和SQL执行流程

    Mysql复习计划(一)- 字符集.文件系统和SQL执行流程 前言 一. Mysql字符集 1.1 Mysql5.7和8.0的默认字符集 1.1.1 修改默认的字符集 1.1.2 修改已有库表的字符集 ...

  5. Mysql复习计划(四)- 索引失效和数据库设计规范

    Mysql复习计划(四)- 索引失效和数据库设计规范 一. 索引失效 1.1 数据准备 1.2 最左匹配原则 1.3 计算.函数.类型转换导致索引失效 1.4 范围条件右侧的列索引失效 1.5 不等于 ...

  6. MySQL复习笔记【上】

    对MySQL语法的总结,适合[复习使用] 参考视频B站尚硅谷MySQL教程,同时也很大程度上是这位小伙伴笔记的浓缩,笔记链接https://blog.csdn.net/m0_46153949/arti ...

  7. Mysql复习秘籍(燕十八出品)

    mysql复习  一:复习前的准备  1:确认你已安装wamp  2:确认你已安装ecshop,并且ecshop的数据库名为shop 二 基础知识:  1.数据库的连接  mysql -u -p -h ...

  8. MySQL复习笔记(燕十八)

    mysql复习 一:复习前的准备 1:确认你已安装wamp 2:确认你已安装ecshop,并且ecshop的数据库名为shop 二 基础知识: 1.数据库的连接 mysql -u -p -h -u 用 ...

  9. Mysql复习(基础概念+基础操作)

    复习资料来源于实验楼,所以标记为转载. 基础概念 数据库(Database) 是按照数据结构来组织.存储和管理数据的仓库. 结构化查询语言(Structured Query Language) 简称 ...

  10. MySql 复习及学生表,课程表,班级表的创建

    学习笔记 ·数据库表的创建及查询 文章目录 学习笔记 任务过程 第一步:分析需求 第二步:新建数据库 第三步:新建表 1.Grade表 2.Student表 3.subject表 第三步:插入数据 1 ...

最新文章

  1. 手机拍照软件for android1.6,RookieCam
  2. 深入理解CSS盒模型
  3. PXI和CompactPCI的区别比较
  4. 201203阶段二FFMPEG图片解码及线程
  5. 精品教程--Android实战系列源码与教程
  6. Github 标星 13K+!这可能是最好的 Java 博客系统
  7. 学习Azure Functions:在Visual Studio 2017中创建Azure Functions
  8. Spring Data Jpa的@DynamicInsert注解和@DynamicUpdate注解
  9. 来谈谈C++ 位运算 | ^ ~ %
  10. oracle——expdp与impdp备份使用方法
  11. 音乐艺考生如何提高视唱练耳技巧
  12. 【VB.Net】泛型IIF
  13. Kotlin基础(五)Kotlin的类型系统
  14. JSON入门指南--服务端处理JSON
  15. 苹果怎么分享无线密码_无线路由器密码怎么破解 无线路由器密码破解方法【介绍】...
  16. 数据库实验-- 更新语句
  17. JPA中@Enumerated注解
  18. Java版九宫格算法
  19. box-shadow兼容IE8浏览器写法
  20. 你一定会用到的SolidWorks快捷键汇总大全

热门文章

  1. 电子连环画图片提取工具ComicView
  2. 值得学习的品牌突围策略
  3. 深度学习中的top1和top5的正确率的区别
  4. vue使用history模式页面空白
  5. Python是什么 它有哪些优点
  6. Shell学习--Shell变量与Shell数组
  7. Js获取 数组或对象 的长度
  8. html设置文本框后面加符号,将HTML文件读入文本框会将撇号和项目符号转换为?...
  9. 虚幻5 渲染视频序列视频轨的操作笔记
  10. OD-流水线(python)