公明 网站建设,一般网站建设电话,wordpress 只显示摘要,网站备案必须做前置审批吗Java数据库连接 Java DataBase Connectivity。JDBC 规范定义接口#xff0c;具体的实现由各大数据库厂商来实现。
JDBC可让Java通过程序操作关系型数据库#xff0c;JDBC基于驱动程序实现与数据库的连接与操作。
JDBC 是 Java 访问数据库的标准规范#xff0c;真正怎么操作…Java数据库连接 Java DataBase Connectivity。JDBC 规范定义接口具体的实现由各大数据库厂商来实现。
JDBC可让Java通过程序操作关系型数据库JDBC基于驱动程序实现与数据库的连接与操作。
JDBC 是 Java 访问数据库的标准规范真正怎么操作数据库还需要具体的实现类也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。
使用 JDBC 的好处
程序员如果要开发访问数据库的程序只需要会调用 JDBC 接口中的方法即可不用关注类是如何实现的。使用同一套 Java 代码进行少量的修改就可以访问其他 JDBC 支持的数据库 JDBC开发使用到的包
java.sql所有与 JDBC 访问数据库相关的接口和类javax.sql数据库扩展包提供数据库额外的功能。如连接池。数据库的驱动由各大数据库厂商提供需要额外去下载是对 JDBC 接口实现的类。
JDBC核心API
DriverManager类管理和注册数据库驱动、得到数据库连接对象。Connection接口一个连接对象可用于创建 Statement 和 PreparedStatement 对象。Statement接口一个 SQL 语句对象用于将 SQL 语句发送给数据库服务器。PreparedStatemen接口一个 SQL 语句对象是 Statement 的子接口。ResultSet接口用于封装数据库查询的结果集返回给客户端 Java 程序。
快速入门
注册和加载驱动可以省略获取连接Connection 获取 Statement 对象执行SQL语句返回结果集释放资源
package com.arbor.jdbc.sample;
import java.sql.*;/*** 描述标准JDBC操作步骤*/
public class StandardJDBCSample {public static void main(String[] args) {Connection conn null;try {// 一、加载并注册jdbc驱动// 先将MySQL的驱动包放入lib文件夹下然后加载Driver类Class.forName(com.mysql.cj.jdbc.Driver);// 二、创建数据库连接// DriverManager.getConnection()获取数据库连接conn DriverManager.getConnection(// 数据库连接地址jdbc:mysql://localhost:3306/arbor_study?useSSLfalseuseUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai,// 数据库用户名root,// 数据库密码1019);// 三、创建Statement对象用来执行sql语句Statement stmt conn.createStatement();// executeQuery()用于执行查询语句// ResultSet结果集对象ResultSet rs stmt.executeQuery(select * from jdbc_employee where dname 研发部);// 四、遍历查询结果// next()每执行一次会提取一条新的记录有下一行返回true没有下一行返回false// 循环遍历rs中的数据while (rs.next()) {// 将查询的这一行数据的第一列作为int类型输出并用int接收int eno rs.getInt(1); // 1 代表的是字段的位置就是这一行的第一列jdbc字段索引从1开始String ename rs.getString(ename); // ename 代表的是字段的名称float salary rs.getFloat(salary);String dname rs.getString(dname);// 输出查询到的记录System.out.println(eno - ename - salary - dname);}} catch (Exception e) {e.printStackTrace();} finally {// 五、关闭连接释放资源try {// 如果conn不是空的并且连接没有被关闭则执行close()方法关闭连接// isClosed()判断当前连接是否关闭if (conn ! null !conn.isClosed()) {// 关闭连接释放资源conn.close();}} catch (Exception ex) {ex.printStackTrace();}}}
}加载和注册驱动
Class.forName(数据库驱动实现类)加载和注册数据库驱动数据库驱动由 mysql 厂商提供。
数据库JDBC驱动类连接字符串MySQL5com.mysql.jdbc.Driverjdbc:mysql://主机ip:端口/数据库名MySQL8com.mysql.cj.jdbc.Driverjdbc:mysql://主机ip:端口/数据库名Oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:主机ip:端口:数据库名SQL Servercom.mircosoft.sqlserver.jdbc.SQLServerDriverjdbc:mircosoft:sqlserver:主机ip:端口:databasename数据库名
从JDBC3开始目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。
DriverManager类(创建连接)
用于注册/管理JDBC驱动程序创建数据库连接。 Connection getConnection (String url, String user, String password)通过连接字符串用户名密码来得到数据库的连接对象。 String url数据库的连接字符串String user登录数据库的用户名String password登录数据库的密码 Connection getConnection (String url, Properties info)通过连接字符串属性对象来得到连接对象。 数据库的连接字符串jdbc:mysql://[主机ip][:端口]/数据库名?参数列表 参数列表采用URL编码格式参数值1值1参数值2值3... jdbc:mysql://localhost:3306/arbor_study?useSSLfalseuseUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/ShanghaiallowPublicKyeRetrievaltrueMySQL连接字符串常用参数
参数名建议参数值说明useSSLtrue生产false开发是否禁用SSLuseUnicodetrue启用unicode编码传输数据characterEncodingUTF-8使用UTF-8编码传输数据serverTimezoneAsia/Shanghai使用东8时区时间UTC8allowPublicKyeRetrievaltrue允许从客户端获取公钥加密传输
Connection接口
用于JDBC与数据库的网络通信对象具体的实现类由数据库的厂商实现代表一个连接对象。所有数据库的操作都建立在Connection。
Statement createStatement()创建一条SQL语句对象PreparedStatement prepareStatement(String sql)指定预编译的 SQL 语句SQL 语句中使用占位符?创建一个语句对象
Statement接口
代表一条语句对象用于发送 SQL 语句给服务器用于执行静态 SQL 语句并返回它所生成结果的对象。
int executeUpdate(String sql)用于发送 DML 语句增删改的操作insert、update、delete返回对数据库影响的行数ResultSet executeQuery(String sql)用于发送 DQL 语句执行查询的操作select返回查询的结果集
PreparedStatement接口
PreparedStatement 是 Statement 接口的子接口继承于父接口中所有的方法。对SQL进行参数化预防SQL注入攻击安全性更高。因为有预先编译的功能比Statemen执行效率更高。提高了程序的可读性。 常用方法 int executeUpdate()执行DML增删改的操作返回影响的行数。不用传参 返回值返回对数据库影响的行数 ResultSet executeQuery()执行DQL查询的操作返回结果集。不用传参 返回值查询的结果集
设置参数的方法
setDouble(int parameterIndex, double x)将指定参数设置为给定double值setFloat(int parameterIndex, float x)将指定参数设置为给定float值setInt(int parameterIndex, int x)将指定参数设置为给定int值setLong(int parameterIndex, long x)将指定参数设置为给定long值setObject(int parameterIndex, Object x)使用给定对象设置指定参数的值setString(int parameterIndex, String x)将指定参数设置为给定String值 时间类型转换
批处理
addBatch()将参数加入批处理任务添加任务不执行executeBatch()执行批处理任务
// 时间类型转换
SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd);
Date udHiredate null ;
try {
udHiredate sdf.parse(strHiredate);
} catch (ParseException e) {
e.printStackTrace();
}
long time udHiredate.getTime();
java.sql.Date sdHiredate new java.sql.Date(time);// 批处理
preparedStatement conn.prepareStatement(sql);
for (int i 200000; i 300000; i) {
preparedStatement.setInt(1, i);
preparedStatement.setString(2, 员工 i);
preparedStatement.setFloat(3, 4000);
preparedStatement.setString(4, 测试部);
preparedStatement.addBatch();// 将参数加入批处理任务添加任务不执行
}
preparedStatement.executeBatch();// 执行批处理任务使用 PreparedStatement 的步骤
编写SQL语句未知内容使用?占位SELECT * FROM user WHERE name? AND password?;获得 PreparedStatement 对象设置实际参数setXxx(占位符的位置真实的值)执行参数化 SQL 语句关闭资源
ResultSet接口
封装数据库查询的结果集对结果集进行遍历取出每一条记录。
boolean next()游标向下移动 1 行返回 boolean 类型如果还有下一条记录返回 true否则返回 false数据类型 getXxx(String str/int no)通过字段名参数是 String 类型返回不同的类型通过列号参数是整数从 1 开始返回不同的类型
SQL 类型Jdbc 对应方法返回类型BIT(1) bit(n)getBoolean()booleanTINYINTgetByte() bytebyteSMALLINTgetShort()shortINTgetInt()intBIGINTgetLong()longCHAR,VARCHARgetString()StringText(Clob) BlobgetClob getBlob()Clob BlobDATEgetDate()java.sql.Date 只代表日期TIMEgetTime()java.sql.Time 只表示时间TIMESTAMPgetTimestamp()java.sql.Timestamp 同时有日期和时间
java.sql.Date、Time、Timestamp(时间戳)三个共同父类是java.util.Date 如果光标在第一行之前使用 rs.getXX() 获取列值报错Before start of result set如果光标在最后一行之后使用 rs.getXX() 获取列值报错After end of result set使用完毕以后要关闭结果集 ResultSet再关闭 Statement再关闭 Connection先开的后关后开的先关 JDBC事务管理
自动提交事务模式 指每执行一次写操作SQL自动提交事务是JDBC默认行为此模式无法保证多数据一致性 手动提交事务模式 可保证多数据一致性但必须手动调用提交/回滚方法
Connection接口中与事务有关的方法
setAutoCommit(boolean autoCommit)参数是 true 或 false如果设置为 false表示关闭自动提交相当于开启事务commit()提交事务rollback()回滚事务
public class TransactionSample {public static void main(String[] args) {Connection conn null;PreparedStatement ps null;try {conn DBUtils.getConnection();String sql insert into jdbc_employee (eno, ename, salary, dname) values (?, ?, ?, ?);// 关闭自动事务开启手动事务conn.setAutoCommit(false);for (int i 1000; i 2000; i) {// 模拟一个异常/*if (i 1005) {throw new RuntimeException(插入失败);}*/ps conn.prepareStatement(sql);ps conn.prepareStatement(sql);ps.setInt(1, i);ps.setString(2, 员工 i);ps.setFloat(3, 4000);ps.setString(4, 测试部);ps.executeUpdate();}} catch (Exception e) {e.printStackTrace();try {// 回滚事务if (conn ! null !conn.isClosed()) {conn.rollback();}} catch (SQLException throwables) {throwables.printStackTrace();}} finally {// 提交事务try {if (conn ! null !conn.isClosed()) {conn.commit();}} catch (SQLException e) {e.printStackTrace();}DBUtils.closeConnection(null, ps, conn);}}
}JDBC 连接池
连接池是一个容器(集合)存放数据库连接的容器。当系统初始化好后容器被创建容器中会申请一些连接对象当用户来访问数据库时从容器中获取连接对象用户访问完之后会将连接对象归还给容器。
节约资源用户访问高效
阿里巴巴Druid连接池
Druid是阿里巴巴开源连接池组件是最好的连接池之一Druid对数据库连接进行有效管理与重用最大化程序执行效率连接池负责创建管理连接程序只负责取用与归还。 不使用连接池关闭资源的话是关闭连接使用连接池关闭资源的话是将连接回收至连接池中。
第一步 导入jar包下载地址https://github.com/alibaba/druid/releases 第二步 定义配置文件 druid-config.properties文件名可以更改
driverClassNamecom.mysql.cj.jdbc.Driver
urljdbc:mysql://localhost:3306/arbor_study?useSSLfalseuseUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/ShanghaiallowPublicKyeRetrievaltrue
usernameroot
password1019# 初始连接数
initialSize10
# 最大连接数
maxActive20第三步 加载配置文件 第四步 获取DataSource数据源对象 第五步 创建数据库连接 第六步 关闭资源
/*** 描述Druid连接池的配置和使用*/
public class DruidSample {public static void main(String[] args) {// 一、加载属性文件Properties properties new Properties();// 获取配置文件的路径String propertyFile DruidSample.class.getResource(/druid-config.properties).getPath();try {// 设置获取到的路径的编码propertyFile URLDecoder.decode(propertyFile, UTF-8);// 加载配置文件properties.load(new FileInputStream(propertyFile));} catch (Exception e) {e.printStackTrace();}Connection connection null;PreparedStatement preparedStatement null;ResultSet resultSet null;try {// 二、获取DataSource数据源对象DataSource dataSource DruidDataSourceFactory.createDataSource(properties);// 三、创建数据库连接connection dataSource.getConnection();preparedStatement connection.prepareStatement(select * from jdbc_employee limit 0,10);resultSet preparedStatement.executeQuery();while (resultSet.next()) {int eno resultSet.getInt(1);String ename resultSet.getString(ename);float salary resultSet.getFloat(salary);String dname resultSet.getString(dname);Date hiredate resultSet.getDate(hiredate);// 输出查询到的记录System.out.println(eno - ename - salary - dname - hiredate);}} catch (Exception e) {e.printStackTrace();}finally {DBUtils.closeConnection(resultSet, preparedStatement, connection);}}
}C3P0连接池
第一步 导入jar包 (两个jar包) 下载地址https://sourceforge.net/projects/c3p0/ 第二步 定义配置文件 c3p0-config.xml文件名固定
?xml version1.0 encodingUTF-8 ?
c3p0-configdefault-configproperty namedriverClasscom.mysql.cj.jdbc.Driver/propertyproperty namejdbcUrljdbc:mysql://localhost:3306/arbor_study?useSSLfalseamp;useUnicodetrueamp;characterEncodingUTF-8amp;serverTimezoneAsia/Shanghaiamp;allowPublicKyeRetrievaltrue/propertyproperty nameuserroot/propertyproperty namepassword1019/property!--初始连接数--property nameinitialPoolSize10/property!--最大连接数--property namemaxPoolSize20/property/default-config
/c3p0-config第三步 加载配置文件并创建DataSource 第四步 创建数据库连接 第五步 关闭资源
/*** 描述C3P0连接池的配置和使用*/
public class C3P0Sample {public static void main(String[] args) {// 一、加载配置文件并创建DataSourceDataSource dataSource new ComboPooledDataSource();Connection connection null;PreparedStatement preparedStatement null;ResultSet resultSet null;try {// 二、创建数据库连接connection dataSource.getConnection();preparedStatement connection.prepareStatement(select * from jdbc_employee limit 0,10);resultSet preparedStatement.executeQuery();while (resultSet.next()) {int eno resultSet.getInt(1);String ename resultSet.getString(ename);float salary resultSet.getFloat(salary);String dname resultSet.getString(dname);Date hiredate resultSet.getDate(hiredate);// 输出查询到的记录System.out.println(eno - ename - salary - dname - hiredate);}} catch (Exception e) {e.printStackTrace();}finally {DBUtils.closeConnection(resultSet, preparedStatement, connection);}}
}JDBC工具类
Apache Commons DBUtils
commons-dbutils是 Apache提供的开源 JDBC工具类库它是对JDBC的简单封装学习成本极低使用commons-dbutils可以极大简化JDBC编码工作量。
第一步 导入jar包下载地址http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi 第二步 创建Druid数据库连接 第三步 使用commons dbutils
查询
Properties properties new Properties();
try {String propertyFile DBUtilsSample.class.getResource(/druid-config.properties).getPath();propertyFile URLDecoder.decode(propertyFile, UTF-8);properties.load(new FileInputStream(propertyFile));DataSource dataSource DruidDataSourceFactory.createDataSource(properties);// 使用commons dbutilsQueryRunner runner new QueryRunner(dataSource);ListEmployee list runner.query(select * from jdbc_employee limit ?,10,new BeanListHandler(Employee.class), // 返回的类型的定义new Object[]{10}); // 对应的是SQL语句中 ? 的值// 循环遍历查询到的数据for (Employee employee : list) {System.out.println(employee);}
} catch (Exception e) {e.printStackTrace();
}更新
Properties properties new Properties();
Connection connection null;
try {String propertyFile DBUtilsSample.class.getResource(/druid-config.properties).getPath();propertyFile URLDecoder.decode(propertyFile, UTF-8);properties.load(new FileInputStream(propertyFile));DataSource dataSource DruidDataSourceFactory.createDataSource(properties);connection dataSource.getConnection();// 开启事务因为需要事务操作所以需要获取Connection对象connection.setAutoCommit(false);String sql1 update jdbc_employee set salary salary 1000 where eno ?;String sql2 update jdbc_employee set salary salary - 500 where eno ?;QueryRunner runner new QueryRunner();runner.update(connection, sql1, 1000);runner.update(connection, sql2, 1001);// 提交事务connection.commit();
} catch (Exception e) {e.printStackTrace();try {if (connection ! null !connection.isClosed())// 回滚事务connection.rollback();} catch (Exception exception) {exception.printStackTrace();}
}finally {try {if (connection ! null !connection.isClosed())// 回收资源connection.close();} catch (Exception exception) {exception.printStackTrace();}
}Spring JDBC
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。
第一步 导入jar包 第二步 创建JdbcTemplate对象。依赖于数据源DataSource
JdbcTemplate template new JdbcTemplate(ds);第三步 调用JdbcTemplate的方法来完成CRUD的操作
update()执行DML语句。增、删、改语句。queryForMap()查询结果将结果集封装为map集合将列名作为key将值作为value 将这条记录封装为一个map集合。这个方法查询的结果集长度只能是1。queryForList()查询结果将结果集封装为list集合将每一条记录封装为一个Map集合再将Map集合装载到List集合中。query()查询结果将结果封装为JavaBean对象。query的参数RowMapper一般使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 new BeanPropertyRowMapper类型(类型.class)queryForObject查询结果将结果封装为对象一般用于聚合函数的查询