在IDEA中如何用JDBC连接Java程序和MySQL数据库
一、工具
工具:IDEA(创建Java项目)、MySQL(存储数据)、驱动包(下载网址:https://dev.mysql.com/downloads/connector/j/5.1.html)
1.1、MySQL(存储数据)
数据库、表都已经创建,且存在数据,如下所示:
1.2、驱动包导入
导入 MySQL 驱动包(下载网址:https://dev.mysql.com/downloads/connector/j/5.1.html )
1.3、Java项目结构
这里没建其他包区分类,因为只是一个小测试。如果要优化,可以将 Candidate.java 放在实体包(如bean)中,JDBCUtils.java 放在工具包(如utils)中。
二、代码
2.1、(重点)工具类JDBCUtils.java
连接数据库,关闭资源
package com;
import java.sql.*;
/*
* 工具类:获取连接、关闭资源①②
* */
public class JDBCUtils {
/*
* 获取连接
* 返回连接的结果
* */
public static Connection getConnResult() throws Exception{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//1.数据库连接的4个基本要素:
String url = "jdbc:mysql://localhost:3306/test";//test是数据库名
String user = "root";//这里是登录MySQL数据库的用户名
String password = "root";//这里是登录登录MySQL数据库的密码
String driverName = "com.mysql.jdbc.Driver";//这个是驱动名字,不是前面导入的包名。
// MySQL的驱动【com.mysql.jdbc.Drive】,Oracle的驱动【oracle.jdbc.driver.OracleDriver】
//2.加载驱动
Class.forName(driverName);
//3.获取连接
conn = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, user, password);
//4.返回值
return conn;
}
/*
* 关闭资源①
* 关闭Connection、PreparedStatement和ResultSet对象
* */
public static void Close(Connection conn, PreparedStatement ps, ResultSet rs) throws SQLException {
if (rs!=null){
rs.close();
}
if (ps!=null){
ps.close();
}
if (conn!=null){
conn.close();
}
}
/*
* 关闭资源②
* 关闭Connection、PreparedStatement对象
* */
public static void Close(Connection conn, PreparedStatement ps) throws SQLException {
if (ps!=null){
ps.close();
}
if (conn!=null){
conn.close();
}
}
}
2.2、实体类Candidate.java
实体类中属性的拼写跟 SQL 语句中的查询字段一样,不跟着数据表中的列名走
package com;
public class Candidate {
private int id;
private String name;
public Candidate() {
}
public Candidate(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id + "t" + name;
}
}
2.3、Main.java
package com;
import com.mysql.jdbc.Connection;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//1、查询表【candidate】的所有数据,并打印在控制台
String sqlQ = "select * from candidate";
ArrayList<Candidate> queryRs = Query(Candidate.class, sqlQ, null);
queryRs.forEach(System.out::println);
//2、添加一行数据
int id = 6;
String name = "ABC";
String sqlA = "insert into candidate values(?,?)";
Object[] paramA = new Object[2];
paramA[0] = id;
paramA[1] = name;
Add(sqlA, paramA);
}
}
2.4、查询表【candidate】中的所有数据
代码如下
public static <T> ArrayList<T> Query(Class<T> tCalss, String sql, Object param[]) {
ArrayList<T> arrayList = new ArrayList<T>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取Connection对象conn
conn = (Connection) JDBCUtils.getConnResult();
//获取PreparedStatement对象ps
ps = conn.prepareStatement(sql);
//填充占位符
if (param != null) {
for (int i = 0; i < param.length; i++) {
ps.setObject(i + 1, param[i]);
}
}
//执行查询语句,获取结果集rs。如果是增删改,则用execute()方法
rs = ps.executeQuery();
//获取结果集rs中列的类型和属性信息
ResultSetMetaData metaData = rs.getMetaData();
//获取列的个数columnCount
int columnCount = metaData.getColumnCount();
System.out.println("表【candidate】共有" + columnCount + "列");
//结果集rs指针不为false,即指针指向的一行存在数据
while (rs.next()) {
T t = tCalss.newInstance();//新建实体类对象
for (int i = 0; i < columnCount; i++) {
//获取列名
String columnLabel = metaData.getColumnLabel(i + 1);
//通过列名获取包括private权限的成员变量
Field field = tCalss.getDeclaredField(columnLabel);
//获取列值
Object columnValue = rs.getObject(i + 1);
//取消Java语言访问检查
field.setAccessible(true);
//给成员变量赋值
field.set(t, columnValue);
}
arrayList.add(t);
//在控制台打印第一列和第二列的数据(注意索引从1开始)
//System.out.println(rs.getInt(1) + "t" + rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源。资源是要即是关闭的,而且最好还是将数据放在数组中去访问,防止程序卡顿等问题
try {
JDBCUtils.Close(conn, ps, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
return arrayList;
}
执行查询操作结果:
2.5、添加一行数据
删、改同理。
public static void Add(String sql, Object param[]){
Connection conn = null;
PreparedStatement ps = null;
try {
//获取Connection对象conn
conn = (Connection) JDBCUtils.getConnResult();
//获取PreparedStatement对象ps
ps = conn.prepareStatement(sql);
//填充占位符
if (param != null) {
for (int i = 0; i < param.length; i++) {
ps.setObject(i + 1, param[i]);
}
}
//执行操作:增/删/改
int i = ps.executeUpdate();
//执行结果是一个更新计数i。这里只添加了一行,所以返回的计数i是1
if (i>0){
System.out.println("操作成功!");
} else {
System.out.println("操作失败!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源。资源是要即是关闭的,而且最好还是将数据放在数组中去访问,防止程序卡顿等问题
try {
JDBCUtils.Close(conn, ps);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
执行添加操作结果:
三、总结
- 连接需要的只有两步:导入包,加载驱动
- 获取连接后执行操作:查,增/删/改
- 重要的是要关闭资源,推荐将结果集放在数组中使用。资源不关闭,会使进程就会一直占用资源,导致系统宕机。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码