下载并导包
JDBC:
https://download.youkuaiyun.com/download/qq_41635282/14021461
c3p0-0.9.5.2.jar:
https://download.youkuaiyun.com/download/qq_41635282/14020390
mchange-commons-java-0.2.11.jar:
https://download.youkuaiyun.com/download/qq_41635282/14020405
导包教程:
https://blog.youkuaiyun.com/qq_41635282/article/details/112170842
编写数据库连接的配置文件
1.名字是规定好的,不可更改。
2.该文件必须放在src路径下。
有两种配置文件,随便选一个就好;
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 文件名必须是c3p0-config.xml -->
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
<!-- student是数据库名,替换成自己的数据库名 -->
<![CDATA[jdbc:mysql://localhost:3306/student?serverTimezone=UTC]]>
</property>
<!-- 数据库用户名 -->
<property name="user">root</property>
<!-- 数据库密码 -->
<property name="password">root</property>
<!-- 初始化池大小 -->
<property name="initialPoolSize">2</property>
<!-- 最大空闲时间 -->
<property name="maxIdleTime">30</property>
<!-- 最多有多少个连接 -->
<property name="maxPoolSize">10</property>
<!-- 最少几个连接 -->
<property name="minPoolSize">2</property>
<!-- 每次最多可以执行多少个批处理语句 -->
<property name="maxStatements">50</property>
</default-config> <!-- 命名的配置 -->
<named-config name="demo">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl"><![CDATA[jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8]]></property>
<property name="user">root</property>
<property name="password">1234</property>
<property name="acquireIncrement">5</property><!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="initialPoolSize">100</property>
<property name="minPoolSize">50</property>
<property name="maxPoolSize">1000</property>
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>
<!-- he's important, but there's only one of him -->
</named-config>
</c3p0-config>
c3p0.properties
c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/student?serverTimezone=UTC
c3p0.user=root
c3p0.password=root
c3p0.maxPoolSize=50
c3p0连接池代码测试
package com.binjiu.C3P0;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class c3p0 {
public static void main(String[] args) throws SQLException {
//创建连接池对象
ComboPooledDataSource ds=new ComboPooledDataSource();
//从连接池中获取连接
Connection con = ds.getConnection();
//验证数据库是否连接成功
if(con!=null) {
System.out.println("数据库连接成功");
}else {
System.out.println("数据库连接失败!");
}
String sql="select * from students";
//创建sql语句执行器
PreparedStatement ps=con.prepareStatement(sql);
//执行语句
ResultSet rs = ps.executeQuery();
while(rs.next()) {
int id=rs.getInt("学号");
String name = rs.getString("姓名");
int age = rs.getInt("年龄");
String sex = rs.getString("性别");
String email = rs.getString("邮箱");
Date birthday = rs.getDate("生日");
int akt = rs.getInt("武力值");
//打印数据
System.out.println("学号:"+id +" 姓名:"+name +" 年龄:"+age+" 性别:"+sex+" 邮箱:"+email+" 生日:"+birthday+" 武力值:"+akt);
}
rs.close();
ps.close();
con.close();
}
}
DBUtils工具
DbUtils简介
1.Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。尤其结合连接池使用效果更为理想。
2.Commons DbUtils 的核心是两个类一个接口:
2.1 DBUtils类:主要为关闭连接,装载JDBC驱动程序之类的常规工作提供方法,都是静态的方法。
2.2 QueryRunner类:为我们提供两个重要方法,调用方法之前需要先创建一个QueryRunner的对象。
QueryRunner qRunner=new QueryRunner(new ComboPooledDataSource());
创建对象时需要传入一个连接池的数据源,这是结合c3p0连接池来完成。
方法 | 说明 |
---|---|
qRunner.update() | 支持DML(数据操纵语言)操作 |
qRunner.query() | 支持DQL(数据查询语言)操作 |
2.3 ResultSetHandler 接口:用于处理ResultSet结果集,讲结果集的数据转换成不同形式。该接口的实现类有很多:
实现类 | 说明 |
---|---|
ArrayHandler | 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值 |
ArrayListHandler | 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中 |
BeanHandler | 将结果集中第一条记录封装到一个指定的javaBean中 |
BeanListHandler | 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中 |
ColumnListHandler | 将结果集中指定的列的字段值,封装到一个list集合中 |
ScalarHandler | 它是用于单列数据查询,例如:select count(*) from students |
MapHandler | 将结果集中第一条记录封装到Map集合中,Key代表列名,Value代表该列数据 |
MapListHandler | 将集合中每一条记录封装到Map集合中,Key代表列名,Value代表值,Map集合再存储到List集合 |
javaBean
javaBean简介
JavaBean是使用java语言开发的一个可重用的组件,再JSP得开发中可以使用javaBean减少重复代码,使整个JSP代码得开发更简洁。简单来讲就是实体类,用来支持业务逻辑得协助类,在JDBC操作中一般一个实体类会对应数据库中的一张表,实体类中的属性会与表中的列一 一对应/
javaBean的设计原则
- 类必须公有,即使用public修饰;
- 类中属性必须私有,即使用private修饰;
- 必须为,每个属性封装get/set方法;
- 类中必须有无参构造;
javaBean
我的数据库中表‘account’的数据结构为:
AccountTable类:
定义与数据库中表account相同数据类型的属性和属性名,并写入set,get方法,tostring方法。
package com.bingjiu.dbutuls;
public class AccountTable {
private int id;
private String username;
private double money;
public AccountTable() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "AccountTable [id=" + id + ", username=" + username + ", money=" + money + "]";
}
}
DBUtils的DML、DQL操作
package com.bingjiu.dbutuls;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DbutilsDemo {
public static void main(String[] args) throws SQLException {
QueryRunner qr=new QueryRunner(new ComboPooledDataSource());
/*
* 查询操作
* 用list集合获取query()方法的返回集,让进行遍历
*/
//查询account的所有数据
String sql="select * from account";
//将结果集中每一条记录封装到AccountTable类中,然后再封装到list集合中
List<AccountTable> list=qr.query(sql, new BeanListHandler<AccountTable>(AccountTable.class));
//重写tostring方法后直接输出即可
System.out.println(list);
//list集合遍历打印获取的值
for(int i=0; i<list.size();i++) {
System.out.println(list.get(i).getId()+"-->"+list.get(i).getUsername()+"-->"+list.get(i).getMoney());
}
/*
* 修改操作
*/
String sql_2="update account set money=? where id=?";
//执行sql_2语句,300为第一个?号赋值,1第二个?赋值。返回数是受操作的行数(int类型)
int n2 =qr.update(sql_2,300,1);
if(n2>0) {
System.out.println("修改成功! 受影响行数为:"+n2);
}else {
System.out.println("修改失败!");
}
/*
* 添加操作
*/
String sql_3="insert into account(id,username,money)values(4,'孙悟空',10)";
//执行sql_3语句
int n3=qr.update(sql_3);
if(n3>0) {
System.out.println("添加数据成功! 添加数据条数:"+n3);
}else {
System.out.println("添加数据失败!");
}
/*
* 删除操作
*/
String sql_4="delete from account where id=4";
//执行sql_4语句
int n4=qr.update(sql_4);
if(n4>0) {
System.out.println("删除成功! 删除的条数:"+ n4);
}else {
System.out.println("删除失败!");
}
}
}
我的数据库
数据库名:student
表名:account
表结构:
表数据: