- 一、什么是JDBC
- 二、JDBC的连接步骤
- 三、数据库连接池
- 数据库连接池的实现
- Druid数据库连接池的实现
- Druid数据库连接池案例
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
1、导jar包
jar包链接:https://download.csdn.net/download/javaren001/85273958
2、连接数据库
通过反射实现注册驱动(mysql5.0之后可省略此步)
Class.forname("com.mysql.jdbc.Driver");
连接数据库
Connection conn=DriverManager.getConnection();
3、执行sql
获取执行sql的Statement 对象
Statement statement= conn.createStatement();
执行sql
statement.executeQuery(sql语句); statement.executeUpdate(sql语句);
- 4、结果处理
executeQuery 的返回值是resultset 结果集
处理方式:
while(resultset.next()){
resultset.getXXX(数据库字段名称);//XXX为字段名称存储的数据类型
}
- 5、释放资源
简单快捷,如果你不想逐个释放资源,可直接释放掉数据库的连接对象
conn.close();
代码演示:
public class t {
public static void main(String[] args) throws Exception {
//真正的注册驱动的是 DriverManager.registerDriver(new Driver()
Class.forName("com.mysql.jdbc.Driver");
//url 还可以写为:jdbc:mysql://localhost:3306/数据库名
String url="jdbc:mysql:///db2?useSSL=true&useServerPrepStmts=true";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url,username,password);
//查询sql
String sql="select * from teacher";
//使用prepareStatement防止sql注入
PreparedStatement prst = conn.prepareStatement(sql);
ResultSet resultSet = prst.executeQuery();
//处理结果集,resultSet.next()将光标从当前位置向前移动一行 ,判断当前行是否为有效行,注,光标一开始指向的是表头行
while (resultSet.next()){
int tid = resultSet.getInt("tid");
String tname = resultSet.getString("tname");
System.out.println(tid+"---"+tname);
}
//释放资源
resultSet.close();
prst.close();
conn.createStatement();
}
}
三、数据库连接池
-
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
-
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
-
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
-
好处
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
之前我们代码中使用连接是没有使用都创建一个Connection对象,使用完毕就会将其销毁。这样重复创建销毁的过程是特别耗费计算机的性能的及消耗时间的。而数据库使用了数据库连接池后,就能达到Connection对象的复用。
数据库连接池的实现标准接口:DataSource
官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:
Connection getConnection()
那么以后就不需要通过 DriverManager 对象获取 Connection 对象,而是通过连接池(DataSource)获取 Connection 对象。
常见的数据库连接池
- DBCP tomcat 内置线程池
- C3P0 apache
- Druid 阿里巴巴
我们现在使用更多的是Druid,它的性能比其他两个会好一些。
Druid数据库连接池的实现druid.properties 文件的参数详细配置:
https://download.csdn.net/download/javaren001/85289167
1、到jar包
Druid的jar包链接:https://download.csdn.net/download/javaren001/85273958
2、定义配置文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///数据库名称?useSSL=false&useServerPrepStmts=true username=root password=root # 初始化连接数量 initialSize=5 # 最大连接数 maxActive=10 # 最大等待时间 maxWait=3000
3、加载配置文件
Properties prop = new Properties();
//配置文件放在src路径下
prop.load(new FileInputStream("配置文件的路径"));
4、获取链接数据库的Connection对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); Connection conn = dataSource.getConnection();
完整代码演示:
//加载.properties配置文件(键值对文件)一定记得Properties集合(Map集合)
Properties prop = new Properties();
//Properties 和 IO流的结合 load(将文件内容读到集合中)读 store(将集合的内容写到文件中)从输入流写
// / 分隔符
// 绝对路径:E:IdeaProjectqyxmysqljdbcsrcdruid.properties
// 相对路径: jdbc/src/druid.properties
prop.load(new FileInputStream("jdbc/src/druid.properties"));
//DataSource 连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接对象
Connection conn = dataSource.getConnection();
Druid数据库连接池案例
- 查询:查询所有数据
- 添加:添加品牌
- 修改:根据id修改
数据库准备:
create table shop( id int PRIMARY key AUTO_INCREMENT,-- id sname VARCHAr(500) not null,-- 商品名称 sprice int,-- 价格 sdes VARCHAr(500)-- 商品介绍 ); -- 插入数据 insert into shop values (1,'耐克',100,'一般般'), (2,'新疆棉短袖',101,'质量无敌'), (3,'阿迪',99,'just so so');
代码实现:
package DruidDemo;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DruidText {
public static void main(String[] args) throws Exception {
//利用druid连接池获取数据库的连接对象
Connection conn = getConnection();
//查询:查询所有数据
findAllData(conn);
//添加新物品
//addShop(conn);
//修改:根据id修改
//updateShop(conn);
//删除:根据id删除
deleteByID(conn);
}
public static void deleteByID(Connection conn) throws SQLException {
PreparedStatement prst = conn.prepareStatement("delete from shop where id = ?");
prst.setInt(1, 3);
int i = prst.executeUpdate();
if(i>0)
System.out.println("删除成功");
else
System.out.println("失败");
}
public static void addShop(Connection conn) throws SQLException {
//添加:添加品牌(使用pojo)
shop shop = new shop("阿迪王", 119, "我要仿真阿迪");
PreparedStatement prst = conn.prepareStatement("insert into shop(sname,sprice,sdes) values (?,?,?)");
prst.setString(1, shop.getSname());
prst.setInt(2, shop.getSprice());
prst.setString(3, shop.getSdes());
int i = prst.executeUpdate();
if(i>0)
System.out.println("添加成功");
else
System.out.println("添加失败");
prst.close();
conn.close();
}
public static void findAllData(Connection conn) throws SQLException {
//查询:查询所有数据
PreparedStatement prst = conn.prepareStatement("select * from shop ");
ResultSet res = prst.executeQuery();
while (res.next()){
String sname = res.getString("sname");
int sprice = res.getInt("sprice");
String sdes = res.getString("sdes");
System.out.println(sname+"---"+sprice+"---"+sdes);
}
res.close();
prst.close();
}
public static Connection getConnection() throws Exception {
//加载配置文件(键值对文件)一定记得Properties集合(Map集合)
Properties prop = new Properties();
//Properties 和 IO流的结合 load(将文件内容读到集合中)读 store(将集合的内容写到文件中)从输入流写
prop.load(new FileInputStream("jdbc/src/druid.properties"));
//DataSource 连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接对象
Connection conn = dataSource.getConnection();
return conn;
}
public static void updateShop(Connection conn) throws Exception {
//修改:根据id修改
PreparedStatement prst = conn.prepareStatement("update shop set sdes=? where id=?");
prst.setString(1, "耐克是垃圾");
prst.setInt(2, 1);
int i = prst.executeUpdate();
if(i>0)
System.out.println("修改成功");
else
System.out.println("修改失败");
prst.close();
conn.close();
}
}



