众所周知,连接数据库是在写程序中的一个大模块,然而在java的项目中有很多连接数据库的技术,比如hibernate,mybaties等,但他们最终的底层实现还是JDBC技术。
依赖包:
https://pan.baidu.com/s/1bjzD_oGv38vwkddogBsbQQ 密码:6biv
一. JDBC连接数据库的总体步骤
1.导入包
2. 加载驱动,建立与数据库的连接。
3. 获取连接
4. 获取statement对象执行SQL语句
5. 关闭连接和statement
package cn.jxust.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws Exception {
// 通过反射获取驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/course", "root", "root");
// 获取statement
Statement state = connection.createStatement();
// 执行sql语句
state.execute("insert into student_test values('test', '10', 'male')");
// 关闭连接
connection.close();
state.close();
}
}
二. 加强连一
当然,上面的只是总体步骤,里面会出现很多乱子。
改版一:使用PreparedStatement来防止SQL攻击,什么叫SQL攻击?举一个例子
update student_test set age=age(12) where name='test' or 1=1;
where后面为永真,永远成立,怎么解决这种问题呢?
java给了一个PreparedStatement类来解决这个问题
基本步骤:
1.导入mysql驱动包 mysql-connector-java-8.0.13.jar
2.准备参数
3. 加载驱动,建立与数据库的连接。
4. 获取连接
5. 获取PreparedStatement对象
6.填充SQL语句
7.执行SQL语句
8. 关闭连接和statement
package cn.jxust.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Test {
public static void main(String[] args) throws Exception {
// 准备参数
String driverClass = "com.mysql.jdbc.Driver";
String jdbcUrl = "jdbc:mysql://locahost:3306/course";
String user = "root";
String password = "root";
Class.forName(driverClass); // 加载驱动
Connection connection = DriverManager.getConnection(jdbcUrl, user, password); // 获取连接
String sql = "insert into student_test values(?, ?, ?) "; // 准备sql语句
PreparedStatement state = connection.prepareStatement(sql); // 获取preparedStatement
state.setString(1, "test2");// 填充sql语句
state.setInt(2, 32);
state.setString(3, "female");
state.execute(); // 执行sql
connection.close();
state.close();
}
}
改版二:
通过配置文件加载参数,提高代码的重用性
创建文件 jdbc-config.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/course
user = root
password = root
package cn.jxust.tools;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;
import org.junit.Test;
public class JDBCTools_test {
@Test
public void JDBCTools_getConnection() throws Exception{
// 通过配置文件加载参数
Properties properties = new Properties();
InputStream in = Test.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(in);
String driverClass = properties.getProperty("driverClass");
String jdbcUrl = properties.getProperty("jdbcUrl");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
Class.forName(driverClass); // 加载驱动
Connection connection = DriverManager.getConnection(jdbcUrl, user, password); // 获取连接
String sql = "insert into student_test values(?, ?, ?) "; // 准备sql语句
PreparedStatement state = connection.prepareStatement(sql); // 获取preparedStatement
state.setString(1, "test2");// 填充sql语句
state.setInt(2, 32);
state.setString(3, "female");
state.execute(); // 执行sql
connection.close();
state.close();
}
}
三. 数据库连接池
copy了一段百度百科对连接池的解释:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
数据库连接池:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池类似于线程池,我们可以自己创建连接池,也能够使用开源的连接池,常用的开源数据库连接池有C3P0,BoneCP,DBCP 其中C3P0连接池用的最多,著名的Hibernate使用的便是C3P0连接池,至于c3p0连接池的优缺点请自行百度。连接池主要对连接也就是Connection进行了处理,让我们省去了很多手动的地方,从而使我们的精力放在最核心的部分。C3P0连接池帮我们处理了很多问题,处理并发,归还连接等等。
C3P0连接池的使用步骤
1.导入依赖包 mysql-connector-java-8.0.13.jar c3p0-0.9.5.2.jar(mysql使用,如果是oracle则导入另外一个带有oracle的依赖包) mchange-commons-java-0.2.11.jar
2.创建配置文件 c3p0-config.xml 一定要是这个名字!!!
3.创建资源对象ComboPooledDataSource
4.获取连接
5.操作数据库
c3p0-config.xml
package cn.jxust.tools;
import java.sql.Connection;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCTools_test {
@Test
public void JDBCTools_getConnection() throws Exception{
// 创建资源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
还记得前面我们讲的总体步骤
1.导入包
2. 加载驱动,建立与数据库的连接。
3. 获取连接
4. 获取statement对象执行SQL语句
5. 关闭连接和statement
c3p0帮我们处理了加载驱动,获取连接,关闭连接,这是c3p0给我们的第一个甜头,更多甜头后面开发的时候就会体现到。
这是c3p0给我们的甜头,那么DBUtils给我们的甜头是什么呢?
DBUtils在执行sql语句的时候极大简化了我们的开发工作(相比原始的JDBC)。这里结合c3p0大概说一下DBUtils的使用步骤
1. 导包
2. 配置c3p0-config.xml
3. 创建资源
4. 创建QueryRunner对象
5. 执行sql语句
package cn.jxust.tools;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCTools_test {
@Test
public void JDBCTools_getConnection() throws Exception{
// 创建资源
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
// 创建QueryRunner对象
QueryRunner qr = new QueryRunner(dataSource);
String sql = "insert into student_test value(?, ?, ?)";
qr.execute(sql, "test3", 3, "female");
}
}
这样看是不是简单多了
总结:
c3p0连接池通过配置文件帮我们连接数据库并且创建连接,关闭连接,处理高并发。DBUtils拿到连接处理sql语句,极大简化了我们的操作,当然,还有一些其他的技巧,在这里就不一一进行介绍了。
以上是我的个人理解,如果存在不足还请多多指出~~~