【JAVA】JDBC数据库连接池
目录
【JDBC】
【JDBC——项目示例】
【JDBC-API】
【DriverManager】——驱动管理类
【Connection】——数据库连接对象
【Statement】——执行
【ResultSet】——结果集对象
【ResultSet——项目示例】
【PreparedStatement】——预编译
【数据库连接池——Druid】
【数据库连接池实现】
【Driud使用步骤】
【JDBC】
【概述】:
- JDBC 就是使用Java语言操作关系型数据库的一套API
- 全称:( Java DataBase Connectivity ) Java 数据库连接
【本质】:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
【JDBC——项目示例】
调用MySQL数据库修改数据
//注册驱动Class.forName("com.mysql.jdbc.Driver");//获取连接String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username="root";String password="root";Connection conn = DriverManager.getConnection(url, username, password);//定义sql语句String sql = "UPDATE account SET money = 2000 WHERE id = 1;";//获取执行sql的对象StatementStatement stmt =conn.createStatement();//执行sqlint count = stmt.executeUpdate(sql);//处理结果System.out.println(count);//释放资源stmt.close();conn.close();
【JDBC-API】
【DriverManager】——驱动管理类
【作用】:
1、注册驱动
//注册驱动Class.forName("com.mysql.jdbc.Driver");
【注意】:
- MySQL 5之后的驱动包,可以省略注册驱动的步骤
- 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
2、获取数据库连接
static Connection getConnection(String url, String user, String password)
例:
Connection conn = DriverManager.getConnection(url, username, password);
【参数】
1、url:连接路径
jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2
例:jdbc:mysql://127.0.0.1:3306/db1
【注意】:
- 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
- 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
2、user:用户名
3、password:密码
【Connection】——数据库连接对象
【作用】:
1、获取执行SQL的对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement (sql)
- 执行存储过程的对象
CallableStatement prepareCall (sql)
2、管理事务
- JDBC事务管理:Connection接口中定义了3个对应的方法
//开启事务:true为自动提交事务;false为手动提交事务,即为开启事务
public void setAutoCommit(boolean autoCommit)
//提交事务
public void commit()
//回滚事务
public void rollback()
例:
//获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//定义sql语句String sql1 = "UPDATE account SET money = 2000 WHERE id = 1;";String sql2 = "UPDATE account SET money = 2000 WHERE id = 2;";//获取执行sql的对象StatementStatement stmt = conn.createStatement();try {//开启事务conn.setAutoCommit(false);//执行sqlint count1 = stmt.executeUpdate(sql1);//处理结果System.out.println(count1);int i = 3 / 0;//执行sqlint count2 = stmt.executeUpdate(sql2);//处理结果System.out.println(count2);//提交事务conn.commit();} catch (Exception e) {//回滚事务conn.rollback();}//释放资源stmt.close();conn.close();
【Statement】——执行
【作用】
1、执行SQL语句
//执行DML、DDL语句
public int executeUpdate(sql)
//返回值:(1) DML语句影响的行数
// (2) DDL语句执行后,执行成功也可能返回0//执行DQL 语句
public ResultSet executeQuery(sql)
//返回值:ResultSet 结果集对象
例:
//获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//定义sql语句//DML语句String sql1 = "create database db2";//获取执行sql的对象StatementStatement stmt = conn.createStatement();try {//开启事务conn.setAutoCommit(false);//执行sqlint count1 = stmt.executeUpdate(sql1);//处理结果if (count1>0) {System.out.println("修改成功");}else {System.out.println("修改失败");}//提交事务conn.commit();} catch (Exception e) {//回滚事务conn.rollback();}//释放资源stmt.close();conn.close();
【ResultSet】——结果集对象
【作用】
1、封装了DQL查询语句的结果
//执行DQL 语句,返回 ResultSet 对象
ResultSet stmt.executeQuery(sql)
- 获取查询结果
//(1) 将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
boolean next();
//返回值:
//true:有效行,当前行有数据 false:无效行,当前行没有数据xxx getXxx(参数):获取数据
//xxx:数据类型;如:int getInt(参数) ; String getString(参数)
//参数:int:列的编号,从1开始 String:列的名称
【使用步骤】
- 游标向下移动一行,并判断该行否有数据:next()
- 获取数据:getXxx(参数)
例:
//获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//定义sql语句String sql = "select * from account";//获取执行sql的对象StatementStatement stmt = conn.createStatement();//执行sqlResultSet rs = stmt.executeQuery(sql);//数据处理while (rs.next()){int id = rs.getInt(1/*"id"*/);String name = rs.getString(2/*"name"*/);double money = rs.getDouble(3/*"money"*/);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println("----------------");}//释放资源rs.close();stmt.close();conn.close();
【ResultSet——项目示例】
查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
//获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//定义sql语句String sql = "select * from account";//获取执行sql的对象StatementStatement stmt = conn.createStatement();//执行sqlResultSet rs = stmt.executeQuery(sql);//创建集合List<Account> list=new ArrayList<>();//数据处理while (rs.next()){Account account=new Account();int id = rs.getInt(1/*"id"*/);String name = rs.getString(2/*"name"*/);double money = rs.getDouble(3/*"money"*/);//赋值account.setId(id);account.setName(name);account.setMoney(money);//存入数组list.add(account);}System.out.println(list);//释放资源rs.close();stmt.close();conn.close();
【PreparedStatement】——预编译
【作用】
1、预编译SQL语句并执行:预防SQL注入问题
【注意】:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
【方法】
1、获取PreparedStatement对象
// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
2、设置参数值
//给 ? 赋值
PreparedStatement对象:setXxx(参数1,参数2)
//Xxx:数据类型 ; 如 setInt (参数1,参数2)
//参数:
//参数1:?的位置编号,从1 开始
//参数2:?的值
3、执行SQL
//不需要再传递sql
executeUpdate();/executeQuery();
例:
//获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//接收用户名和密码String name = "ss";String pwd = "'or'1'='1";//sql语句String sql = "select * from tb_user where username = ? and password =? ";//获取pStmt对象PreparedStatement pStmt = conn.prepareStatement(sql);//设置?的值pStmt.setString(1, name);pStmt.setString(2, pwd);//执行sqlResultSet rs = pStmt.executeQuery();//判断登陆是否成功if (rs.next()) {System.out.println("登录成功");} else {System.out.println("登录失败");}//释放资源rs.close();pStmt.close();conn.close();
【优点】
- 预编译SQL,提高性能
- 防止SQL注入:将敏感字符转义
【原理】
- 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
- 执行时就不用再进行这些步骤了,速度更快
- 如果sql模板一样,则只需要进行一次检查、编译
【启用】
- 在url中加入:useServerPrepStmts=true
- 在my.ini配置文件中配置MySQL日志
log-output=FILE
general-log=1
general_log_file="E:\Project\JAVA\mysql.log"
slow-query-log=1
slow_query_log_file="E:\Project\JAVA\mysql_slow.log"
long_query_time=2
【数据库连接池——Druid】
【概述】
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
【好处】
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
【数据库连接池实现】
【标准接口】:DataSource
【功能】:获取连接
Connection getConnection()
【Driud使用步骤】
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
例:
//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("Jdbc/src/druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接Connection connection = dataSource.getConnection();System.out.println(connection);
【JAVA】JDBC数据库连接池相关推荐
- Java jdbc数据库连接池
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...
- java jdbc init_Java 的JDBC 数据库连接池实现方法
虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池,不过对于开发一般的 Java Application . Applet 或者 JSP.velocity 时,我们可用的JDB ...
- java使用数据库连接池连接MySQL/MariaDB--DBCP2
如果每次操作数据库都需要重新连接数据库,那么会很浪费资源.因此建议使用数据库的连接池来满足多线程的数据库操作. Java中数据库连接池有多种实现方法,推荐使用DBCP,这是Apache 提供的数据库连 ...
- Spring JDBC数据库连接池设置
对于任何Java应用程序而言, 在Spring框架中设置JDBC数据库连接池都是很容易的,仅需更改spring配置文件中的一些配置即可.使用Apache Commons DBCP和Commons Po ...
- JDBC数据库连接池练习题
<JDBC数据库连接池练习题> 文章目录 单选题 多选题 判断题 填空题 单选题 1. 下面选项中,能够将游标从当前位置向下移一行的方法是( ). A.next() B.absolute( ...
- java tomcat数据库连接池_tomcat配置数据库连接池2
数据库连接是比较耗时的操作,如果每次访问数据库都开闭一次连接的话,在大批量访问时,必然会导致性能问题,于是这里成为了你的性能瓶颈.为了解决这个问题, 为了简化通过连接池获取数据库连接的过程,JDBC2 ...
- java tomcat数据库连接池,tomcat 数据库连接池拿不到连接
我们是 springboot1.x 的应用 用的自带的数据库连接池就是 tomcat,数据库用的是 oracle,现在发生了一些奇怪的事就是初始化数据库连接池的时候可能会卡在创建连接那一步,但是重启可 ...
- Java建立数据库连接池
对于一个简单的数据库引用,用于对数据库的访问不是很频繁.这时就可以简单的在需要访问数据库是,就创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库引用,情况就 ...
- Java中数据库连接池原理机制的详细讲解
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(ResourcePool).该模式正 ...
最新文章
- javascript中关于this指向问题详解
- 第二章 Servlet核心技术 实训二
- 软件工程2018第二次团队作业
- 用python编写图片生成器_python生成器
- 一份关于jvm内存调优及原理的学习笔记
- Microsoft Office Communications Server 2007部署以及客户端安装(详细)【一】
- 花钱你都学不到的“饭局”规矩~
- ios swift 实现饼状图进度条,swift环形进度条
- Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动
- CountDownLatch使用解说
- PADS 设置挖空区域,为板子做固定孔,再设置禁止区域,铺铜之前必做的一步...
- java8 131下载_jdk 8u131下载
- nginx: [emerg] still could not bind()
- 更新极路由器1S,HC5661A刷breed再刷老毛子华硕教程
- pythonmd5解密代码_python写一个md5解密器示例,pythonmd5解密器
- Contest1389 - 2018年第三阶段个人训练赛第四场.	售票(strncmp)
- U盘常见病毒或木马解决篇
- 求一个n*n矩阵对角线元素之和C语言,求一个n*n矩阵主对角线之和,次对角线元素之和.用指针完成...
- [SQL]关系代数基本概念(包含对应例子讲解)
- iOS7开发~企业发布