JDBC

  • Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
  • 为了简化 开发人员的(对数据的统一)操作,提供了一个java操作数据库规范,对于开发人员来说,我们只需要掌握JDBC接口的操作即可;

创建第一个JDBC–基础版

1.准备数据库


2.导入驱动

3. 创建java

  1. 导入数据库驱动mysql-connector-java-8.0.21.jar
    注意:导入jar包后,需要add as library
  2. 加载驱动Class.forName
  3. 用户信息和url,username,password
  4. 连接成功,得到数据库对象Connection
  5. 获取执行sql对象 statement 用来执行sql
  6. 执行sql
  7. 获取结果集resultSet
  8. 释放连接
package com.jdbc;import java.sql.*;public class JdbcDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException, SQLException {//1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 用户信息和url/*** test 数据库名* useUnicode=true 支持中文* characterEncoding=utf-8 使用utf-8*useSSL=true 是否通过证书或者令牌进行安全验证* serverTimezone=Asia/Shanghai 设置时区*/String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true";String user="root";String password="cqmcx";//3.获取连接 connection 相当于一个数据库对象Connection connection = DriverManager.getConnection(url, user, password);//4.获取执行sql对象 statement 用来执行sqlStatement statement = connection.createStatement();//5.执行sql 可以现在数据库中写好sqlString sql="select * from demo where name='cx'";//6.获取结果集/*** statement.executeQuery 执行查询* statement.executeUpdate 执行 增删改* statement.execute 怎删改查 都可以*/ResultSet resultSet = statement.executeQuery(sql);//6.遍历结果while (resultSet.next()){//列名要与数据库中字段名一样System.out.println("id="+resultSet.getInt("id"));System.out.println("name="+resultSet.getString("name"));}//7.释放连接resultSet.close();statement.close();connection.close();}
}

JDBC中对象详解

DriverManager

//2. 加载驱动DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());//1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");

1和2 两种方式都可以,推荐使用下面一种,因为Driver这个类:

// 静态代码块只在类加载的时候执行,且只执行一次static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}

不明白反射的可以去 反射机制

URL

  • mysql :3306
    协议://主机地址:端口号/数据库名?参数1&参数2&参数…
  • oralce:1521
    jdbc:oracle:thin:@主机地址:1521:sid

connection

//回滚事务connection.rollback();//提交事务connection.commit();//开启关闭事务的自动提交connection.setAutoCommit();
 //4.执行sql 可以现在数据库中写好sqlString sql="update demo set name='cxcx' where id=1";try {//        关闭事务自动提交connection.setAutoCommit(false);int i = statement.executeUpdate(sql);//更新操作//提交事务connection.commit();int i2=10/0;//发生异常//开启事务自动提交connection.setAutoCommit(true);} catch (SQLException e) {connection.rollback();//发生异常回滚事务e.printStackTrace();} finally {statement.close();connection.close();}


事务已经提交了,提交了就不能回滚了

 //4.执行sql 可以现在数据库中写好sqlString sql="update demo set name='cx' where id=1";try {//        关闭事务自动提交connection.setAutoCommit(false);int i = statement.executeUpdate(sql);//更新操作int i2=10/0;//发生异常//开启事务自动提交connection.setAutoCommit(true);//提交事务connection.commit();} catch (SQLException e) {connection.rollback();//发生异常回滚事务e.printStackTrace();} finally {statement.close();connection.close();}


因为是先发生了错误,此时数据还没有被提交,所以事务进行了回滚

Statement

Statement 会导致sql注入问题,一般使用PrepareStatement来执行sql对象

 /*** statement.executeQuery 执行查询* statement.executeUpdate 执行 增删改,返回的是受影响的行数* statement.execute 增删改查 都可以*/

SQL注入问题

 //2.获取连接 connection 相当于一个数据库对象Connection connection = DriverManager.getConnection(url, user, password);//3.获取执行sql对象 statement 用来执行sqlStatement statement = connection.createStatement();//实际情况中,是我们传入一个变量String name="'cdacdc' or 1=1";//4.执行sql 可以现在数据库中写好sqlString sql="select * from demo where name="+name;//5.获取结果集ResultSet resultSet = statement.executeQuery(sql);//6.遍历结果while (resultSet.next()){//列名要与数据库中字段名一样System.out.println("id="+resultSet.getInt("id"));System.out.println("name="+resultSet.getString("name"));}

PreparedStatement (防止SQL注入)

//2.获取连接 connection 相当于一个数据库对象Connection connection = DriverManager.getConnection(url, user, password);//实际情况中,是我们传入一个变量String name="'cdacdc' or 1=1";//3.使用? 占位符代替参数String sql="select * from demo where name=?";//4.进行预编译PreparedStatement preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setString(1,name);//5.获取结果集ResultSet resultSet = preparedStatement.executeQuery(sql);

报错:

eption in thread "main" java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

ResultSet

查询的结果集:封装了所有的查询结果

 resultSet.beforeFirst();//移动到最前面resultSet.afterLast();//移动到最后面resultSet.next();//移动到下一个数据resultSet.previous();//移动到前一行resultSet.absolute(row);//移动到指定行//如果知道列的类型就使用对应的类型获取resultSet.getString("列名");

创建第一个JDBC–工具类版

  • 上述代码我们看到了,有一些东西是在很多地方都是不变的,例如反射加载类模板,建立连接,释放连接等…,所以我们可以创建一个工具类,这个类提供一个获取连接的方法和释放连接的方法即可!

JDBCUtil.java

package com.jdbc.utils;import java.sql.*;public class JDBCUtil {static String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true";static String user="root";static String password="cqmcx";static {//1.加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*获取连接*/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}public static void colseConnection(Connection connection,Statement statement,ResultSet resultSet){if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

JdbcDemo.java

package com.jdbc;import com.jdbc.utils.JDBCUtil;import java.sql.*;public class JdbcDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException, SQLException {Connection connection=null;PreparedStatement preparedStatement=null;ResultSet resultSet=null;try {connection = JDBCUtil.getConnection();String sql="select * from demo where name= ? ";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,"cxcx");resultSet = preparedStatement.executeQuery();while (resultSet.next()){//列名要与数据库中字段名一样System.out.println("id="+resultSet.getInt("id"));System.out.println("name="+resultSet.getString("name"));}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.colseConnection(connection,preparedStatement,resultSet);}}
}
注意:
sql.Date 数据库  java.sql.Date()
util.Date java  new java.sql.Date(new Date().getTime())

创建第一个JDBC–工具类版properties优化


在根目录下创建一个jdbc.properties文件

driver=com.mysql.cj.jdbc.Driver
url =jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
user=root
password=cqmcx
package com.jdbc.utils;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JDBCUtil {static String driver = null;static String url = null;static String user=null;static String password=null;static {//1.加载驱动try {/** 加载根目录下的资源文件* */InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);driver=properties.getProperty("driver");url=properties.getProperty("url");user=properties.getProperty("user");password=properties.getProperty("password");//加载驱动Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*获取连接*/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}public static void colseConnection(Connection connection,Statement statement,ResultSet resultSet){if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

数据库连接池

  • 由于java连接数据库,要经历连接-释放-连接-释放,这样十分耗费资源,所以我们有没有可能提前准备一些资源,等程序需要使用的时候就可以直接使用,用完之后放在此处等待其他程序使用,** 池化技术**就此诞生了!

DBCP

DBCP (Database Connection Pool)是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池,Tomcat 的数据源使用的就是 DBCP。


  • jdbc_config.properties
#连接设置
#driverClassName 是dbcp设置好的名字
driverClassName=com.mysql.cj.jdbc.Driver
url =jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
username=root
password=cqmcx#<!-- 初始化连接 -->
initialSize=10#最大连接数量
maxActive=50#<!-- 最大空闲连接 -->
maxIdle=20#<!-- 最小空闲连接 -->
minIdle=5#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
  • JDBCUtil.java
package com.jdbc.utils;import org.apache.commons.dbcp.BasicDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JDBCUtil {private static DataSource dataSource=null;static {//1.加载驱动try {/** 加载根目录下的资源文件* */InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc_config.properties");Properties properties = new Properties();properties.load(resourceAsStream);//创建数据源--工厂模式dataSource = BasicDataSourceFactory.createDataSource(properties);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*获取连接*/public static Connection getConnection() throws SQLException {return dataSource.getConnection();}public static void colseConnection(Connection connection,Statement statement,ResultSet resultSet){if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

C3P0

  • C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用它的开源项目有Hibernate、Spring等。


  • c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?><c3p0-config><!--c3p0的缺省(默认)配置如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)--><default-config><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&amp;characterEncoding=utf-8&amp;useSSL=true&amp;useUnicode=true</property><property name="user">root</property><property name="password">cqmcx</property><property name="acquireIncrement">5</property><property name="initialPoolSize">10</property><property name="minPoolSize">5</property><property name="maxPoolSize">20</property></default-config><!--c3p0的命名配置如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource("MySQL");"这样写就表示使用的是mysql的缺省(默认)--><named-config name="MySQL"><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=true</property><property name="user">root</property><property name="password">cqmcx</property><property name="acquireIncrement">5</property><property name="initialPoolSize">10</property><property name="minPoolSize">5</property><property name="maxPoolSize">20</property></named-config></c3p0-config>
  • JDBCUtil.java
package com.jdbc.utils;import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;import javax.activation.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JDBCUtil {private static ComboPooledDataSource dataSource=null;//2.private static ComboPooledDataSource dataSource=null;static {try {//2.代码版配置
//            dataSource= new ComboPooledDataSource();
//            dataSource.setDriverClass();
//            dataSource.setUser();
//            dataSource.setPassword();
//            dataSource.setJdbcUrl();//1.配置文件写法dataSource= new ComboPooledDataSource();} catch (Exception e) {e.printStackTrace();}}/*获取连接*/public static Connection getConnection() throws SQLException {return dataSource.getConnection();}public static void colseConnection(Connection connection,Statement statement,ResultSet resultSet){if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

IDEA 连接数据库




按提示下载


成功连接!

=============================================================================
JDBC 推荐狂神说

java-JDBC详解相关推荐

  1. java jdbc 详解_JDBC概述及详解各个对象

    JDBC(Java DataBase Connectivity)详解 一.概念: JDBC是一种可执行SQL语句的JavaAPI,Java数据库链接,Java语言操做数据库mysql 二.本质: JD ...

  2. JAVA JDBC详解

    一.相关概念 什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...

  3. java jdbc 详解_JDBC详解

    1.JDBC(Java Database Connection):java连接数据库统一接口API,底层主要通过直接的JDBC驱动和 JDBC-ODBC桥驱动实现与数据库的连接. 1>.JDBC ...

  4. java jdbc_详解Java基础知识——JDBC

    JDBC Java DataBase Connectivity,java数据库连接,为了降低操作数据的难度,java提供jdbc,按照java面向对象特点,对操作进行了很多封装. JDBC提供了很多接 ...

  5. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

  6. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  7. Java :反射详解

    Java 反射详解 目录 Java 反射详解 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 1.什么是反射? Java反射就是在运行状态中,对于任意 ...

  8. java 7 反射_【7】java 反射详解

    [7]java 反射详解 获取Class对象的方式: 1. Class.forName("全类名"); 将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件 ...

  9. JDBC详解(四):操作BLOB类型字段(超详解)

    JDBC详解(四):操作BLOB类型字段 前言 一.MySQL BLOB类型 二.向数据表中插入大数据类型 三.修改数据表中的Blob类型字段 四.从数据表中读取大数据类型 前言 本博主将用CSDN记 ...

  10. Apache Thrift - java开发详解

    2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...

最新文章

  1. php时间处理类,PHP常见的日期处理
  2. 【转】使用Apache CXF开发WebServices服务端
  3. django官方文档1.11编翻:1-1-1概述
  4. linux裁剪—定制自己所需要的linux
  5. 数据库常见面试题总结
  6. datagridview设置为勾选才可编辑_使用lightroom前,做好这几项设置,有助于更好使用...
  7. Linux学习笔记之系统路径和命令
  8. CentOs7 安装Hadoop-3.1.0集群环境
  9. 纸飞机飞行曲线matlab,从小到大只会做个纸飞机?关于折纸的「高端」技巧通通告诉你...
  10. 我们穷极一生,究竟追寻的是什么?
  11. 分式的化简(约分、通分)
  12. Python将word表格存入excel —— 格式化pg参数手册
  13. 全球云计算大会|TcaplusDB一举斩获优秀解决方案奖
  14. django快速集成富文本编辑器wangeditor
  15. 如何优雅的DIY一个高大上的小台灯
  16. 技校学生计算机周记,周记大全技校
  17. 计算机图形学---颜色视觉知识点
  18. linux中的ps命令常用参数-个人
  19. String split()
  20. 云服务器通过配置IIS实现本地访问文件并下载

热门文章

  1. 基于基于粒子群优化算法的微电网调度(Matlab代码实现)
  2. Java实现回合制游戏
  3. Laravel 的事件广播系统(Redis驱动)
  4. 隧道监控计算机网络系统方案,隧道综合监控系统 - 海得网站:为工业领域用户提供最具竞争力的智能制造产品和解决方案,持续为客户创造最大价值!...
  5. 对外开放的金融体系,市场对券商的要求发出的“警示”
  6. 监控摄像机如何选择镜头视场角
  7. 利用Canal全量/增量同步mysql数据至ES
  8. DevC++的调试方法
  9. 零基础如何高效学习编程|成就我的10个编程学习实用小技巧
  10. 串口初始化不通过问题