2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > JDBC(二)——使用IDEA连接数据库 数据库连接池

JDBC(二)——使用IDEA连接数据库 数据库连接池

时间:2022-12-11 16:36:48

相关推荐

JDBC(二)——使用IDEA连接数据库 数据库连接池

文章目录

1. 使用IDEA连接数据库2. 事务3. 数据库连接池

1. 使用IDEA连接数据库

(1)点击IDEA界面右侧的Database

(2)点击 + ,再点击Data Source ,最后点击 MySQL

(3)填写用户名和密码,测试连接

(4)连接成功后显示的界面

(5)选择要来连接的数据库,以连接 jdbcstudy为例

(6)数据库jdbcstudy连接成功后的界面

(7)双击表名users,打开表

(8)更新修改数据

(9)编写SQL代码

(10)连接失败,查看原因

2. 事务

要么都成功,要么都失败

代码实现

①开启事务 setAutoCommit(false)

②一组业务执行完毕,提交事务 commit()

③如果在事务处理过程中发生异常则通过 rollback() 进行事务回滚

import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class TestTransaction2 {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();// 关闭数据库的自动提交,自动会开启事务conn.setAutoCommit(false); // 开启事务String sql1 = "update account set money = money-100 where name = 'A'";st = conn.prepareStatement(sql1);st.executeUpdate();int x = 1/0; // 报错String sql2 = "update account set money = money+100 where name = 'B'";st = conn.prepareStatement(sql2);st.executeUpdate();//业务完毕,提交事务mit();System.out.println("成功!");} catch (SQLException e) {// 若果失败,则默认回滚// try {//conn.rollback(); // 如果失败则回滚事务// } catch (SQLException e1) {//e1.printStackTrace();// }e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}}

3. 数据库连接池

数据库连接 — 执行完毕 — 释放

连接 – 释放 十分浪费系统资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

开源数据源实现 ( 拿来即用 )

DBCP

C3P0

Druid:阿里巴巴

使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了!

以DBCP为例

需要用到的 jar 包:commons-dbcp-1.4 、commons-pool-1.6

将lib目录Ass a library,在工程下编写dbcpconfig.properties文件

使用连接池时,要配置一下参数

最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作

最大空闲时间

获取连接超时时间

超时重试连接次数

#连接设置 这里面的名字,是DBCP数据源中定义好的driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=trueusername=rootpassword=123456#<!-- 初始化连接 -->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, SERIALIZABLEdefaultTransactionIsolation=READ_UNCOMMITTED

再编写一个DBCP工具类

import javax.sql.DataSource;import java.io.InputStream;import java.sql.*;import java.util.Properties;public class JdbcUtils_DBCP {private static DataSource dataSource = null;static {try{InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Properties properties = new Properties();properties.load(in);//创建数据源 工厂模式 --> 创建dataSource = BasicDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return dataSource.getConnection(); //从数据源中获取连接}//释放连接资源public static void release(Connection conn, Statement st, ResultSet rs){if (rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if (conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

进行测试

import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Date;public class TestDBCP {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils_DBCP.getConnection();// 区别// 使用? 占位符代替参数String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行// 手动给参数赋值st.setInt(1,4); //idst.setString(2,"qinjiang");st.setString(3,"1232112");st.setString(4,"24734673@");// 注意点: sql.Date 数据库 java.sql.Date()//util.Date Javanew Date().getTime() 获得时间戳st.setDate(5,new java.sql.Date(new Date().getTime()));//执行int i = st.executeUpdate();if (i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils_DBCP.release(conn,st,null);}}}

C3P0的使用与DBCP方法类似,需要的jar包:c3p0-0.9.5.5、mchange-commons-java-0.2.19

结论

无论使用什么数据源,本质还是一样的,DataSource接口不会变,方法就不会变

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。