JDBC连接数据库和改进
一、原生jdbc连接数据库
使用最原始的方法连接数据库,步骤如下:
- 注册驱动
- 获得连接对象
- 获得执行语句的平台对象
- 执行sql语句
- 处理结果
- 释放连接
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver"); //数据库版本是8.0.15
//2.获得连接对象,url,数据库用户名,数据库密码
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
"root", "root");
//3.获得执行语句的平台对象
PreparedStatement ps = conn.prepareStatement("insert into stu values (5,'张三')");
//4.执行sql语句
int i = ps.executeUpdate();
//5.处理结果
if (i > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
//释放连接
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
二、将原生jdbc封装成DBUtil
封装成DBUtil
public class DBUtil {
//声明url,user,password
private static String url = "jdbc:mysql:///test?serverTimezone=UTC";
private static String user = "root";
private static String password = "root";
//1.注册驱动
static{
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获取数据库连接
public static Connection getConnection(){
Connection connection=null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//3.释放资源,传入参数rs:结果集对象,没有则传入null,ps:执行sql语句的平台对象,conn:连接对象
public static void close(ResultSet rs, PreparedStatement ps,Connection conn){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在外部调用DBUtil。
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Connection connection = DBUtil.getConnection();
PreparedStatement ps = connection.prepareStatement("select * from stu");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
int sid = rs.getInt("sid");
String sname = rs.getString("sname");
System.out.println("学号:" + sid + " 姓名:" + sname);
}
DBUtil.close(rs, ps, connection);
}
}
三、使用Apache提供的DBUtils
进一步改进原生jdbc.
DbUtils(org.apache.commons.dbutils.DbUtils)是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。DbUtils类主要负责装载驱动、关闭连接的常规工作。
步骤:
- 注册驱动。
- 获得Connection连接对象。
- 获得执行sql语句的QueryRunner对象。
- 执行sql语句。
- 处理结果。
- 释放资源。
其中ResultSetHandler接口(org.apache.commons.dbutils.ResultSethandler)执行处理一个结果集对象,将数据转变并处理为任何一种形式,供其他应用使用。实现类如下:
常用的结果集对象,只需要记住三个:
- BeanHandler,将查询结果集中的第一条记录封装到指定的JavaBean中,sql语句中的查询条件只能获取到唯一的一条记录时,使用此结果集对象!
- BeanListHandler,将查询结果集中的每一条记录都封装成JavaBean,并将这些JavaBean对象放入List集合中
- ScalarHandler,专门用于封装聚合函数得到的结果,也就是查询的结果为单一的数据。
@Test
public void test1() throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得连接对象
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
"root", "root");
//3.获得执行sql语句的QueryRunner对象
QueryRunner runner=new QueryRunner();
String sql = "select * from stu";
//4.执行sql语句
List<Student> studentList = runner.query(conn,sql, new BeanListHandler<Student>(Student.class));
//5.处理结果
for (Student student : studentList) {
System.out.println(student.toString());
}
//6.释放资源
DbUtils.close(conn);
}
四、使用DBUtils + Druid (推荐)
数据库连接池技术,在java程序中,有三个比较常用:c3p0、dbcp、druid(阿里)
个人建议:如果从代码性能角度出发,建议使用druid或者dbcp
如果代码的简洁性角度出发,建议使用c3p0,但是其有个毛病,就是效率比较低.
1、导入连接池的包 druid-1.0.9.jar
2、将连接信息放置在druid.properties文件中
druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username=root
password=root
DruidUtils.java
public class DruidUtils {
//声明数据源对象
private static DataSource dataSource=null;
//在静态代码块中初始化数据源
static {
try {
//指定一个属性文件对象
Properties properties=new Properties();
//通过反射获取输入的文件流
InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
//通过输入流读取到druid.properties配置文件中的连接信息
//将读取到的信息加载到属性文件对象中
properties.load(is);
//通过属性文件对象获取连接池对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
}
测试:
@Test
public void test2() throws SQLException {
QueryRunner runner = new QueryRunner(DruidUtils.getDataSource());
String sql = "select * from stu";
List<Student> studentList = runner.query(sql, new BeanListHandler<Student>(Student.class));
for (Student student : studentList) {
System.out.println(student.toString());
}
}