目录
一、使用 JDBC 访问数据库:JDBC 是 Java 数据库连接的标准 API。
(2) prepareStatement对象:防止sql注入
(1)配置文件命名必须为(c3p0-config.xml)。且放到src目录下。
一、使用 JDBC 访问数据库:JDBC 是 Java 数据库连接的标准 API。
JDBC(Driver)类实现了JDBC API中定义的(Driver)接口,该接口用于与数据库服务器进行交互。
例如,使用JDBC驱动程序可以打开数据库连接,并通过发送SQL或数据库命令,然后通过Java接收结果。
(1)使用 JDBC 连接数据库需要经过以下几个步骤:
1.加载驱动程序
2.建立连接
3.创建 Statement 或 PreparedStatement 对象
4.执行 SQL 语句
5.处理查询结果
6.关闭连接、释放资源
注意:Statement(语句,声明) 是一个接口,用于表示执行静态 SQL 语句的对象。
二、加载并注册驱动
(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)不用配置文件的方式。
五、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)不用配置文件的方式设置连接参数。