java JDBC连接
- jdbc连接案例
实体类:student.java
jdbc连接baseDAO:JDBC.java
测试文件:jdbcTest.java
配置文件数据库连接:db.properties
注意:配置文件放在根目录,也可以直接在JDBC里面写
这个文件是student.java
package panxg_08_01;
public class Student {
private Integer stu_id;
private String stu_name;
private String stu_password;
private String stu_sex;
private String stu_age;
public Student() {
super();
}
public Student(Integer stu_id, String stu_name, String stu_password, String stu_sex, String stu_age) {
super();
this.stu_id = stu_id;
this.stu_name = stu_name;
this.stu_password = stu_password;
this.stu_sex = stu_sex;
this.stu_age = stu_age;
}
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_password() {
return stu_password;
}
public void setStu_password(String stu_password) {
this.stu_password = stu_password;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public String getStu_age() {
return stu_age;
}
public void setStu_age(String stu_age) {
this.stu_age = stu_age;
}
@Override
public String toString() {
return "Student [stu_id=" + stu_id + ", stu_name=" + stu_name + ", stu_password=" + stu_password + ", stu_sex="
+ stu_sex + ", stu_age=" + stu_age + "]";
}
}
这个文件是JDBC.java
package panxg_08_01;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
*
* 1. 导入驱动包 2. 加载驱动 3. 创建连接对象 4. 创建预处理对象 5. 执行SQL语句 6. 获取结果集 7. 处理结果集 8. 关闭连接
*
* jdbc四大连接对象: DriverManager(类):加载驱动类使用 Connection(接口):创建连接对象
* PreparedStatement(接口):创建执行对象 ResultSet(接口):返回结果集对象
*
*
* 在关闭连接对象的时候:先关闭后打开的,后关闭先打开的,分开进行关闭,防止异常不关闭 处理结果集的时候可以使用数据库列名和下标获取
* 数据库的列下标是通过1开始的
*
* @author ASUS
* @param <T>
*
*/
public class JDBC<T> {
private static String DRIVER;
private static String URL;
private static String USERNAME;// 账号
private static String PASSWORD;// 密码
private Connection con = null; // 创建连接对象
private PreparedStatement pst = null; // 创建执行SQL命令对象 安全,参数绑定使用的是占位符
private Statement st = null; // 创建执行SQL命令对象 不安全,会导致sql注入,参数绑定使用的是连接
private ResultSet rs = null; // 结果集对象
private Class<T> cs = null; // 反射查询对象使用
/**
* 加载配置信息
*/
static {
// 使用文件流进行读取sql配置文件
InputStream resourceAsStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("db.properties");
// 的 Properties类代表一个持久的特性。的 Properties可以保存到流或流中加载。属性列表中的每个键和它的相应值是一个字符串。
Properties properties = new Properties();
try {
// 从输入字节流中读取属性列表(键和元素对)。
properties.load(resourceAsStream);
// 给连接对象赋值
DRIVER = properties.getProperty("DRIVER");
URL = properties.getProperty("URL");
USERNAME = properties.getProperty("USERNAME");
PASSWORD = properties.getProperty("PASSWORD");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 私有化无参构造
*/
public JDBC() { }
/**
* 有参构造传入对象类
*
* @param cs
*/
public JDBC(Class<T> cs) {
this.cs = cs;
}
/**
* 开启连接
*/
private void createConnection() {
try {
// 加载驱动
Class.forName(DRIVER);
// 创建连接
con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 查询方法
*
* @param <T>
* @param <T>
* @throws SQLException
*/
public <T> List<T> executeQuery(String sql, Object... params) {
// 开启连接
createConnection();
// 创建返回对象
List<T> list = new ArrayList();
try {
// st = con.createStatement();
// rs = st.executeQuery(sql);
// int executeUpdate = st.executeUpdate(sql);
// 创建执行对象---执行对象一定需要在绑定占位符前面//预编译对象
pst = con.prepareStatement(sql);
// 绑定占位符
bindPlaceholders(params);
// 执行查询语句
rs = pst.executeQuery();
while (rs.next()) {
// 对结果集进进行处理
list.add(disposeRs());
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接
closeConnection();
}
return list;
}
/**
* @param <T>
*
*/
private <T> T disposeRs() {
T t = null;
try {
// 创建反射对象
t = (T) cs.newInstance();
// 获取所有反射对象属性
Field[] Fields = cs.getDeclaredFields();
for (Field field : Fields) {
// 把私有方法开启修改权限
field.setAccessible(true);
// 对对象进行赋值
// 这个地方的赋值使用的是数据库字段进行赋值给实体类属性,可以自己写一个工具类进行驼峰命名赋值
field.set(t, rs.getObject(field.getName()));
}
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | SQLException e) {
e.printStackTrace();
}
return t;
}
/**
* 绑定占位符
*
* @param obj
*/
private void bindPlaceholders(Object[] params) {
try {
// 如果不为空进行绑定
if (params != null) {
int i = 1;
// 遍历数组参数
for (Object object : params) {
// 绑定到ps执行对象,数据库下标从1开始,
pst.setObject(i++, object);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 更新方法
*/
public Integer executeUpdate(String sql,Object...params) {
//获取连接对象,开启连接
createConnection();
Integer executeUpdate = 0;
try {
//创建执行对象
pst = con.prepareStatement(sql);
//绑定数据
bindPlaceholders(params);
//执行sql语句
executeUpdate = pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭连接
closeConnection();
}
return executeUpdate;
}
/**
* 关闭连接 释放资源
*/
private void closeConnection() {
// 結果集为空
rs = null;
// 关闭执行对象
try {
if (pst != null) {
pst.close();
pst = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
// 关闭执行对象
try {
if (st != null) {
st.close();
st = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
// 关闭连接对象
try {
if (con != null) {
con.close();
con = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这个文件是jdbcTest.java
package panxg_08_01;
import java.util.List;
public class jdbcTest {
public static <T> void main(String[] args) throws InstantiationException, IllegalAccessException {
//传入实体对象进行反射出集合
JDBC jdbc = new JDBC(Student.class);
String sql = "select * from student";
List<Student> list = jdbc.executeQuery(sql);
for (Student student : list) {
System.out.println(student.toString());
}
JDBC jdbc = new JDBC();
String sqls = "update student set stu_name=? where stu_id=?";
System.out.println(jdbc.executeUpdate(sqls, new Object[] {"潘先生",5}));
}
}
这个文件是配置文件;使用了mysql
# MySQL\u914D\u7F6E
DRIVER = com.mysql.jdbc.Driver
URL = jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8
USERNAME = root
PASSWORD = 123456
#DRIVER=oracle.jdbc.driver.OracleDriver
#URL=jdbc:oracle:thin:@127.0.0.1:1521:orcl
#USERNAME=scott
#PASSWORD=tiger