其实,任何开发工具连接数据库无非就是三步:1.安装驱动。2.加载驱动,创建连接对象。3.创建对象操作游标。4.游标调用函数完成执行SQL语句。 但是在各种语言开发工具进行连接过程中,这些过程操作又有一定的差异。接下来我们来了解Java语言开发工具idea连接数据库的基本操作。
首先进行了解,什么是JDBC。JDBC是一套用于执行SQL语句的Java API,应用程序可通过这套API连接到关系数据库。并使用SQL语句完成对数据库中数据的查询、新增、更新、删除等操作。应用程序使用JDBC访问特定的数据库时,只需要通过不同的数据库驱动与其对应的数据库进行连接,再进行相应的操作即可。
在了解了这些之后,接下来看代了解连接步骤:
1.导入数据库驱动jar包:(加载数据库驱动通常使用Class类的静态方法forName()方法来实现,具体实现方式见下图代码。)
2.通过DriverManager类获取数据库连接,创建数据库对象。
3.通过数据库对象调用createStatement()方法创建游标对象。通过游标对象执行SQL语句。
4.通过ResultSet对象获得执行SQL语句返回的结果集。
5.关闭连接,释放资源。通过try……catch……finally代码块统一关闭资源。(依次关闭ResultSet结果集资源、游标对象、数据库连接对象)。
package Other;
import java.sql.*;
import static java.lang.Class.forName;
public class JDBC_Connector {
public static void main(String[] args) throws SQLException{
//创建java程序与数据库的连接对象
Connection connection = null;
//创建执行静态SQL语句的接口对象
Statement statement = null;
//创建游标对象,返回查询结果集
ResultSet resultSet = null;
//将MySQL数据库驱动名称封装在字符串中
String driver = "com.mysql.cj.jdbc.Driver";
//指定使用数据库的路径、编码格式、时区,并以字符串进行封装
String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
//指定登录账户
String user = "root";
//指定账户密码
String psw = "hcy5120184";
//加载数据库驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//连接数据库
connection = DriverManager.getConnection(url,user,psw);
//通过Connection对象获取Statement对象
statement = connection.createStatement();
String sql = "select * from tb_admin";
resultSet = statement.executeQuery(sql);
System.out.println("id\t|\tuserName\t|\tuserPsw");
while(resultSet.next()){
int id = resultSet.getInt("id");
String userName = resultSet.getString("userName");
String userPsw = resultSet.getString("userPsw");
System.out.println(id+"\t|\t\t"+userName+"\t\t|\t"+userPsw);
}
if (resultSet!=null)resultSet.close();
if (statement!=null)statement.close();
if (connection!=null)connection.close();
}
}
上述有很多方法我并没有进行使用。
这一套连接操作体系,可统一封装在一个类中,但需要使用时,直接通过创建类对象调用相关方法即可。下图为我经常使用的方法封装在了一个类中,代码附上:
package com.other;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.models.TbAdmin;
import org.apache.commons.beanutils.ConvertUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//改进的DBUtils:1.所有的数据库操作都使用了连接池技术 2.查询记录返回值中,不再需要强制转换
public class DBUtils1 {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
String user = "root";
String psw = "Sa123456";
public void close() {
try {
if (resultSet != null && !resultSet.isClosed())
resultSet.close();
if (statement != null && !statement.isClosed())
statement.close();
if (connection != null && !connection.isClosed())
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//通过连接池获取connection对象
public Connection getConnection() {
Connection connection = null;
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass(driver);
cpds.setJdbcUrl(url);
cpds.setUser(user);
cpds.setPassword(psw);
//最大线程池中连接对象10
cpds.setMaxPoolSize(10);
cpds.setMinPoolSize(1);
connection = cpds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
public int executeUpdate(String sql) {
int result = 0;
try {
Class.forName(driver);//加载驱动
connection = DriverManager.getConnection(url, user, psw);//打开数据库,返回连接数据库对象
statement = connection.createStatement();//获取执行sql命令的对象
result = statement.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return result;
}
public ResultSet executeQueryResultSet(String sql) {
try {
Class.forName(driver);//加载驱动
connection = DriverManager.getConnection(url, user, psw);//打开数据库,返回连接数据库对象
statement = connection.createStatement();//获取执行sql命令的对象
resultSet = statement.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return resultSet;
}
//查找单条记录,封装在对象中
public <T> T executeQueryBean(String sql, Class<T> clzss) {
T object = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, psw);
// connection = getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
if (resultSet.next()) {
object = clzss.newInstance();
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
String methodName = resultSetMetaData.getColumnName(i);
Field field = clzss.getDeclaredField(methodName);
methodName = "set" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
Method method = clzss.getMethod(methodName, field.getType());
method.invoke(object, ConvertUtils.convert(resultSet.getString(i), field.getType()));//将数据库中的值的类型转换成类方法中的形参类型
}
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
//查找多条记录,封装在列表中
public <T> List<T> executeQueryBeans(String sql, Class<T> clzss) {
List<T> list = new ArrayList<>();
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, psw);
// connection=getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
while (resultSet.next()) {
T object = clzss.newInstance();
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
String methodName = resultSetMetaData.getColumnName(i);
Field field = clzss.getDeclaredField(methodName);
methodName = "set" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
Method method = clzss.getMethod(methodName, field.getType());
method.invoke(object, ConvertUtils.convert(resultSet.getString(i), field.getType()));//将数据库中的值的类型转换成类方法中的形参类型
}
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
}
if (list.size() == 0)
list = null;
return list;
}
}
如有疑问,欢迎在评论区下方留言交流。若觉得内容稍可,请留下你们的