当前位置:   article > 正文

Java应用中的JDBC数据库连接完全指南_javajdbc连接数据库

javajdbc连接数据库
1、简介
1.1介绍JDBC连接数据库的重要性

是Java平台中用于连接和操作数据库的标准API。它的重要性体现在以下几个方面

跨平台性: JDBC允许Java应用程序与各种数据库进行通信,而无需关心底层数据库系统的具体细节

实时连接: 通过JDBC,Java应用程序可以实时连接到数据库,从而实现动态数据存取、更新和处理

数据操作能力: JDBC为开发人员提供了一种灵活的方式来执行SQL查询、更新数据库内容、和执行存储过程等操作

安全性: JDBC通过提供连接池、安全认证等机制,有助于确保数据库连接的安全性。

1.2、定义基本术语

JDBC全称(Java Database Connectivity): Java数据库连接,是用于执行SQL语句并与数据库交互的Java API

驱动程序(Driver): 用于连接Java应用程序和特定数据库的软件组件,它使得Java应用程序可以与数据库通信

数据库URL(Uniform Resource Locator): 用于指定连接到数据库的位置的字符串。它包括数据库服务器的地址、端口和数据库的名称等信息。

连接(Connection): 表示Java应用程序与数据库之间的通信管道。通过连接,可以发送SQL语句给数据库,执行查询并接收结果。

语句(Statement): 用于向数据库发送SQL语句的对象。它可以执行查询(查询语句)或更新数据库内容(更新语句)。

结果集(Result Set): 代表从数据库中检索的数据集。它包含了SQL查询的结果,可以在Java应用程序中进行处理和操作。

了解以上基本术语对接下来学习有很大的帮助。

2、JDBC基础
2.1JDBC是什么?

是Java平台的一个标准API,用于通过Java编程语言连接和操作数据库。它提供了一种方法,使得Java应用程序可以与各种不同的关系型数据库系统进行通信。


2.2、JDBC的工作原理

 

Java应用程序通过使用JDBC API来请求连接、发送SQL语句、执行数据库操作,并获取结果。

JDBC使用标准接口,使得Java应用程序能够与不同的数据库系统进行交互,而无需针对每种数据库编写特定的代码。


2.3、JDBC与ODBC的区别

JDBC是Java平台上的API,而ODBC(Open Database Connectivity)是Windows平台上的API

需要特定的驱动程序。


3、基本操作过程
3.1、六大步骤

A.通过反射加载驱动
B.获取连接对象
C.根据连接对象获取执行sql的对象
D.向数据库发送sql指令
E.获取结果集
F.关闭资源

3.2、数据库建立


3.3、配置数据库驱动程序

创建一个java项目,导入jar包,置于jar包我们当然去官网下载

https://www.mysql.com/

记得右键添加依赖。


3.4、设置连接参数建立连接

Statement和PreparedStatement的区别:

编译:
Statement: 每次执行SQL语句时,都需要将SQL语句编译一次。这可能会导致性能上的一些损失。
PreparedStatement: 在第一次执行SQL语句时,就将其编译好,然后可以多次重复使用。这种预编译的方式可以提高性能。

安全性:
Statement: 使用Statement执行SQL时,需要手动处理输入参数的转义和注入问题,存在安全▍

3.4.1、使用Statement
  1. public class Test01 {
  2. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  3. //定义接收用户输入和用户名和密码
  4. String uname="张三";
  5. String upwd="123";
  6. //1:注册驱动
  7. Class.forName("com.mysql.jdbc.Driver");
  8. //2:获取连接
  9. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?charsetEncoding=utf-8", "root", "123456");
  10. //3.获取Statement对象
  11. Statement statement = connection.createStatement();
  12. //4:定义sql
  13. String sql ="select *from login where uname='"+uname+"'and upwd='"+upwd+"'";
  14. //5.执行sql
  15. ResultSet resultSet = statement.executeQuery(sql);
  16. //5处理结果集
  17. if (resultSet.next()){
  18. System.out.println("登录成功");
  19. }else {
  20. System.out.println("登录失败");
  21. }
  22. //6.释放资源
  23. connection.close();
  24. statement.close();
  25. resultSet.close();
  26. }
  27. }
3.4.2、使用PreparedStatement
  1. public class Test02 {
  2. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  3. //定义接收用户输入和用户名和密码
  4. String uname="张三";
  5. String upwd="123";
  6. //1:注册驱动
  7. Class.forName("com.mysql.jdbc.Driver");
  8. //2:获取连接
  9. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?charsetEncoding=utf-8", "root", "123456");
  10. //3:定义sql
  11. String sql ="select *from login where uname=? and upwd=? ";
  12. //4.获取prepareStatement对象
  13. PreparedStatement ps = connection.prepareStatement(sql);
  14. //设置参数
  15. ps.setString(1,uname);
  16. ps.setString(2,upwd);
  17. //6.执行sql
  18. ResultSet resultSet = ps.executeQuery();
  19. //7处理结果集
  20. if (resultSet.next()){
  21. System.out.println("登录成功");
  22. }else {
  23. System.out.println("登录失败");
  24. }
  25. //6.释放资源
  26. connection.close();
  27. ps.close();
  28. resultSet.close();
  29. }
  30. }

3.4.3、ResultSet方法
方法名方法描述

boolean next() throws SQLException;
判断是否有下一行

rs.getString("索引")
根据数据库列 索引获取数据(索引是从1开始)

rs.getString("列名")
根据数据库列表获取数据
  1. //发送指令 获取结果集
  2. ResultSet rs = sta.executeQuery(sql);
  3. //使用循环获取数据
  4. while (rs.next()) {
  5. //根据索引获取
  6. // int uid = rs.getInt(1);
  7. // String uname = rs.getString(2);
  8. // String upwd = rs.getString(3);
  9. //System.out.println(uid+"\t"+uname+"\t"+upwd);
  10. //根据表名获取
  11. int uid = rs.getInt("uid");
  12. String uname = rs.getString("uname");
  13. String upwd = rs.getString("upwd");
  14. System.out.println(uid+"\t"+uname+"\t"+upwd);}
3.4.4、数据库工具类封装
  1. 重用性: 通过封装数据库操作的方法,可以在应用程序的不同部分重用这些方法,避免重复编写相同的数据库操作代码,提高了代码的可维护性和可重用性。

  2. 降低耦合性: 封装数据库操作可以将数据库交互的细节隐藏起来,从而降低了应用程序其他部分对数据库结构和操作的依赖,减少了代码的耦合度。

  3. 简化数据库操作: 数据库工具类封装了数据库连接、执行SQL语句、处理结果集等操作,使得在应用程序中使用数据库变得更加简单和直观。

代码

第一种方式

这里需要用到静态代码块,因为驱动是只加载一次就可以.

  1. /*
  2. * 封装获取连接工具
  3. */
  4. public class JDBCUtil {
  5. // 声明连接
  6. private static Connection connection;
  7. // 注册驱动
  8. static{
  9. try {
  10. // 只注册一次
  11. Class.forName("com.mysql.jdbc.Driver");
  12. } catch (ClassNotFoundException e) {
  13. e.printStackTrace();
  14. // 直接抛个运行时异常
  15. throw new RuntimeException("注册驱动失败");
  16. }
  17. }
  18. // 私有化构造方法
  19. private JDBCUtil1() {
  20. }
  21. // 获取连接方法
  22. public static Connection getConnection(){
  23. // 数据库地址
  24. String url = "jdbc:mysql://localhost:3306/login?charsetEncoding=utf-8";
  25. // 数据库账号
  26. String user = "root";
  27. // 数据库密码
  28. String password = "123456";
  29. // 获取连接
  30. try {
  31. connection = DriverManager.getConnection(url, user, password);
  32. } catch (SQLException e) {
  33. e.printStackTrace();
  34. // 直接抛个运行时异常
  35. throw new RuntimeException("数据库连接失败");
  36. }
  37. return connection;
  38. }
  39. // 关闭资源
  40. public static void myClose(Connection connection, ResultSet resultSet,Statement statement){
  41. // 关闭资源
  42. if (connection != null) {
  43. try {
  44. connection.close();
  45. } catch (SQLException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. if (statement != null) {
  50. try {
  51. connection.close();
  52. } catch (SQLException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. if (resultSet != null) {
  57. try {
  58. connection.close();
  59. } catch (SQLException e) {
  60. e.printStackTrace();
  61. }
  62. }
  63. }
  64. }

第二种方式

使用从文本读入的方式,环境变了,更改地址用户密码等直接从文本更改.
注意:文本只能创建在src文件夹下

properties文件

  1. driverClassName=com.mysql.cj.jdbc.Driver
  2. username=root
  3. password=123456
  4. url=jdbc:mysql:///java2207?serverTimezone=Asia/Shanghai
  5. maxWait=60000
  6. initialSize=100
  7. maxActive=200
  8. minIdle=10

工具类

  1. public class DBUtils {
  2. private static final Properties PROPERTIES = new Properties();
  3. private static DataSource dataSource = null;
  4. static {
  5. try {
  6. PROPERTIES.load(DBUtils.class.getResourceAsStream("/db.properties"));
  7. dataSource = DruidDataSourceFactory.createDataSource(PROPERTIES);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. public static DataSource getDataSource() {
  15. return dataSource;
  16. }
  17. }

4、连接池的使用

4.1、引言

性能提升: 连接池可以预先建立一组数据库连接并将其保存在池中,这样当应用程序需要时可以直接获取连接,避免了频繁地创建和断开数据库连接,从而显著提升了数据库访问的性能。

资源管理: 连接池管理连接的生命周期,确保连接的合理分配和释放,避免了因连接未正确关闭而导致的资源泄露问题。

并发处理: 连接池可以限制应用程序同时使用的连接数,从而在高并发情况下控制对数据库的访问,防止数据库被过多的连接请求所淹没。

连接重用: 连接池能够重用已经建立的连接,减少了每次请求时创建连接和进行身份验证的开销,有效地减少了系统负载。

连接的健康检查: 连接池可以周期性地检查已有连接的健康状况,确保连接的可用性,一旦发现异常连接可以进行关闭或重新初始化。

灵活性: 连接池提供了调整连接数目、超时配置、闲置连接的回收等配置选项,使得可以灵活地针对不同的应用场景进行优化。

4.2、常见的连接池

A.DBCP:效率高 安全性低 tomcat服务器使用的连接池就是DBCP
2.c3p0 安全性高 效率低 spring的全家桶 使用连接池就是c3p0
3.druid:阿里 支持高并发的连接池

4.3、Durid连接池

我们演示druid连接池

4.3.1、相关配置文件
  1. driverClassName=com.mysql.cj.jdbc.Driver
  2. username=root
  3. password=123456
  4. url=jdbc:mysql:///java2207?serverTimezone=Asia/Shanghai
  5. maxWait=60000
  6. initialSize=100
  7. maxActive=200
  8. minIdle=10

4.3.2、工具类代码
  1. public class DBUtils {
  2. private static final Properties PROPERTIES = new Properties();
  3. private static DataSource dataSource = null;
  4. static {
  5. try {
  6. PROPERTIES.load(DBUtils.class.getResourceAsStream("/db.properties"));
  7. dataSource = DruidDataSourceFactory.createDataSource(PROPERTIES);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. public static DataSource getDataSource() {
  15. return dataSource;
  16. }
  17. }

希望本文对您有所帮助,祝您编程愉快!如果您有任何其他问题或需要进一步的帮助,请随时告诉我。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/847948
推荐阅读
相关标签
  

闽ICP备14008679号