java JDBC连接

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值