失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【JAVA】JDBC数据库连接池

【JAVA】JDBC数据库连接池

时间:2021-05-15 10:40:04

相关推荐

【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);//提交事务mit();} 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("修改失败");}//提交事务mit();} 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

//不需要再传递sqlexecuteUpdate();/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=FILEgeneral-log=1general_log_file="E:\Project\JAVA\mysql.log"slow-query-log=1slow_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数据库连接池》对你有帮助,请点赞、收藏,并留下你的观点哦!

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