java-JDBC详解
JDBC
- Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
- 为了简化 开发人员的(对数据的统一)操作,提供了一个java操作数据库规范,对于开发人员来说,我们只需要掌握JDBC接口的操作即可;
创建第一个JDBC–基础版
1.准备数据库
2.导入驱动
3. 创建java
- 导入数据库驱动mysql-connector-java-8.0.21.jar
注意:导入jar包后,需要add as library
- 加载驱动Class.forName
- 用户信息和url,username,password
- 连接成功,得到数据库对象Connection
- 获取执行sql对象 statement 用来执行sql
- 执行sql
- 获取结果集resultSet
- 释放连接
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&characterEncoding=utf-8&useSSL=true&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&useUnicode=true&characterEncoding=utf-8&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详解相关推荐
- java jdbc 详解_JDBC概述及详解各个对象
JDBC(Java DataBase Connectivity)详解 一.概念: JDBC是一种可执行SQL语句的JavaAPI,Java数据库链接,Java语言操做数据库mysql 二.本质: JD ...
- JAVA JDBC详解
一.相关概念 什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...
- java jdbc 详解_JDBC详解
1.JDBC(Java Database Connection):java连接数据库统一接口API,底层主要通过直接的JDBC驱动和 JDBC-ODBC桥驱动实现与数据库的连接. 1>.JDBC ...
- java jdbc_详解Java基础知识——JDBC
JDBC Java DataBase Connectivity,java数据库连接,为了降低操作数据的难度,java提供jdbc,按照java面向对象特点,对操作进行了很多封装. JDBC提供了很多接 ...
- Spring JDBC详解
<Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...
- Java虚拟机详解----JVM常见问题总结
[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...
- Java :反射详解
Java 反射详解 目录 Java 反射详解 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 1.什么是反射? Java反射就是在运行状态中,对于任意 ...
- java 7 反射_【7】java 反射详解
[7]java 反射详解 获取Class对象的方式: 1. Class.forName("全类名"); 将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件 ...
- JDBC详解(四):操作BLOB类型字段(超详解)
JDBC详解(四):操作BLOB类型字段 前言 一.MySQL BLOB类型 二.向数据表中插入大数据类型 三.修改数据表中的Blob类型字段 四.从数据表中读取大数据类型 前言 本博主将用CSDN记 ...
- Apache Thrift - java开发详解
2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...
最新文章
- php时间处理类,PHP常见的日期处理
- 【转】使用Apache CXF开发WebServices服务端
- django官方文档1.11编翻:1-1-1概述
- linux裁剪—定制自己所需要的linux
- 数据库常见面试题总结
- datagridview设置为勾选才可编辑_使用lightroom前,做好这几项设置,有助于更好使用...
- Linux学习笔记之系统路径和命令
- CentOs7 安装Hadoop-3.1.0集群环境
- 纸飞机飞行曲线matlab,从小到大只会做个纸飞机?关于折纸的「高端」技巧通通告诉你...
- 我们穷极一生,究竟追寻的是什么?
- 分式的化简(约分、通分)
- Python将word表格存入excel —— 格式化pg参数手册
- 全球云计算大会|TcaplusDB一举斩获优秀解决方案奖
- django快速集成富文本编辑器wangeditor
- 如何优雅的DIY一个高大上的小台灯
- 技校学生计算机周记,周记大全技校
- 计算机图形学---颜色视觉知识点
- linux中的ps命令常用参数-个人
- String split()
- 云服务器通过配置IIS实现本地访问文件并下载
热门文章
- 基于基于粒子群优化算法的微电网调度(Matlab代码实现)
- Java实现回合制游戏
- Laravel 的事件广播系统(Redis驱动)
- 隧道监控计算机网络系统方案,隧道综合监控系统 - 海得网站:为工业领域用户提供最具竞争力的智能制造产品和解决方案,持续为客户创造最大价值!...
- 对外开放的金融体系,市场对券商的要求发出的“警示”
- 监控摄像机如何选择镜头视场角
- 利用Canal全量/增量同步mysql数据至ES
- DevC++的调试方法
- 零基础如何高效学习编程|成就我的10个编程学习实用小技巧
- 串口初始化不通过问题