4.JDBC访问数据库与数据库连接池技术。

目录

一、使用 JDBC 访问数据库:JDBC 是 Java 数据库连接的标准 API。

(1)使用 JDBC 连接数据库需要经过以下几个步骤:

二、加载并注册驱动

三、JDBC连接数据库的步骤。

(1)Statement对象:有sql注入风险

(2) prepareStatement对象:防止sql注入

四、Druid数据库连接池。

(1)properties类型配置文件。(/是有效的)

(2)操作数据库步骤。

(3)不用配置文件的方式。

五、C3P0数据库连接池。

​​​​​​(1)配置文件命名必须为(c3p0-config.xml)。且放到src目录下。

(2)操作数据库步骤。

(3)不用配置文件的方式设置连接参数。


 

一、使用 JDBC 访问数据库:JDBC 是 Java 数据库连接的标准 API。

JDBC(Driver)类实现了JDBC API中定义的(Driver)接口,该接口用于与数据库服务器进行交互。

例如,使用JDBC驱动程序可以打开数据库连接,并通过发送SQL或数据库命令,然后通过Java接收结果。

ed933ac413464ad39e0a56e360c6f754.jpeg

(1)使用 JDBC 连接数据库需要经过以下几个步骤:

1.加载驱动程序
2.建立连接
3.创建 Statement 或 PreparedStatement 对象
4.执行 SQL 语句
5.处理查询结果
6.关闭连接、释放资源

注意:Statement(语句,声明) 是一个接口,用于表示执行静态 SQL 语句的对象。

二、加载并注册驱动

3e5caf9698f94cfabc129d314df93eb2.bmp

(1)驱动类:获取实现了Java.sql.Driver 接口的Driver类的实例对象。(new Driver)

(2)加载驱动:把驱动类加载到内存。(实际是加载这个类的时候执行注册驱动代码)

(3)注册驱动:把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。(加载Driver类调用 DriverManager.registerDriver(new Driver)方法来注册驱动程序类的实例。)

加载并注册驱动方法如下:
//1、通过反射,加载与注册驱动类,解耦合(不直接依赖)
Class.forName(“com.mysql.cj.jdbc.Driver”);
//2、通过类加载器加载驱动类,解耦合(不直接依赖)
ClassLoader.getSystemClassLoader().loadClass(“com.mysql.cj.jdbc.Driver”);
package com.mysql.cj.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

三、JDBC连接数据库的步骤。

(1)Statement对象:有sql注入风险

 getConnection() 方法获取一个连接对象 Connection。一个 Connection 对象代表了与数据库系统的一次会话。  

//省略获取到conn连接对象

//创建Statement对象
stmt = conn.createStatement();
//执行sql语句,result是返回查询的结果集
result = stmt.executeQuery(sql);

(2) prepareStatement对象:防止sql注入

pre = conn.prepareStatement(sql) 的作用是创建一个 PreparedStatement 对象并将 SQL 语句传递给这个对象,使用占位符 "?" 代替具体的参数值。

PreparedStatement pre = conn.prepareStatement("sql"); 返回的是一个执行指定 SQL 语句并生成预编译语句对象的 PreparedStatement 对象。

//1.注册驱动,不建议使用DriverManager.registerDriver(new Driver());这种方法。
Class.forName(“com.mysql.cj.jdbc.Driver”);
//2.定义sql语句
String sql="insert into user values(2,'小五','tan')";
//3.获取连接sql数据库对象
conn = DriverManager.getConnection("JDBC:mysql://localhost:3306/tan", "root", "tan");
//4.创建一个 PreparedStatement 对象并将 SQL 语句传递给这个对象,使用占位符 "?" 代替具体的参数值
pre = conn.prepareStatement(sql);
//5.执行sql语句,不建议使用     //int count = stat.executeUpdate(sql);
int count = pre.executeUpdate();
//6.处理结果
System.out.println(count);

//    createStatement()方法是创建一个 Statement 对象来将 SQL 语句发送到数据库。
//1.获取连接sql数据库对象
conn = JDBCUtils.getConnection();
//2.开启事务
conn.setAutoCommit(false);
//3.定义sql语句
//3.1 张三 -500
String sql1 = "update account set balance = balance - ? where id = ?";
//3.2 李四 +500
String sql2 = "update account set balance = balance + ? where id = ?";
//4.创建一个 PreparedStatement 对象并将 SQL 语句传递给这个对象,使用占位符 "?" 代替具体的参数值
pre1 = conn.prepareStatement(sql1);
pre2 = conn.prepareStatement(sql2);
//5.给?赋值
pre1.setInt(1,500);//第一个?=500
pre1.setInt(2,1);//第二个?=1
pre2.setInt(1,500);
pre2.setInt(2,2);
//6.执行sql语句
pre1.executeUpdate();
//手动制造异常
int i= 3/0;
pre2.executeUpdate();
//7.提交事务
conn.commit();

四、Druid数据库连接池。

(1)properties类型配置文件。(/是有效的)

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/tan
username=root
password=tan
initialSize=5
maxActive=10
maxWait=3000
maxIdle=8
minIdle=3

(2)操作数据库步骤。

数据源DataSource:作为中间层 将DriverManager生成的连接,组织到连接池中,然后从池中提供连接。

jdbcTemplate的jar包的作用:JdbcTemplate template = new JdbcTemplate(ds);

//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is = Demo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象(数据源=数据库)
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接池对象,可以不用这种方式。Connection conn = ds.getConnection();
//5.获取JdbcTemplate对象。(该类由druid的jar包提供,里面有执行方法)
JdbcTemplate template = new JdbcTemplate(ds);
//6.定义sql语句。
String sql = "update account set balance = 5000 where id  in (?,7,8)";
//7.执行sql语句。
int count = template.update(sql, 6);

(3)不用配置文件的方式。

fcbcbc046d1e42c9baa56d3589b8f09f.png

五、C3P0数据库连接池。

​​​​​​(1)配置文件命名必须为(c3p0-config.xml)。且放到src目录下。

<?xml version="1.0" encoding="UTF-8" ?> 
    <c3p0-config> 
        <default-config> 
            <property name="driverClass">com.mysql.jdbc.Driver</property> 
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/web_test4?useSSL=false</property> 
            <property name="user">root</property>
            <property name="password">Zjy9201141217</property> 
        </default-config>
        <!-- This app is massive! --> 
        <named-config name="intergalactoApp">
            <property name="acquireIncrement">50</property> 
            <property name="initialPoolSize">100</property> 
            <property name="minPoolSize">50</property> 
            <property name="maxPoolSize">1000</property> 
            <!-- intergalactoApp adopts a different approach to configuring statement caching --> 
            <property name="maxStatements">0</property> 
            <property name="maxStatementsPerConnection">5</property>
            <!-- he's important, but there's only one of him --> 
            <user-overrides user="master-of-the-universe"> 
                <property name="acquireIncrement">1</property> 
                <property name="initialPoolSize">1</property> 
                <property name="minPoolSize">1</property> 
                <property name="maxPoolSize">5</property>
                <property name="maxStatementsPerConnection">50</property> 
            </user-overrides> </named-config>
</c3p0-config>

(2)操作数据库步骤。

//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2.获取连接对象
Connection conn = ds.getConnection();
//3.对sql语句进行预编译,不建议conn.createStatement();防止sql注入
PreparedStatement pre = conn.prepareStatement("select * from user where username='谭程耀'");
//4.执行sql语句
ResultSet res = pre.executeQuery();
while (res.next()){
    int id = res.getInt(1);//第几列或者列名都行
    String username = res.getString("username");
    String password = res.getString(3);
    System.out.println(id+":"+username+":"+password);
}

(3)不用配置文件的方式设置连接参数。

91f1d91db8784984a4038e3b02f4a7db.png

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值