JDBC
创建数据库连接最终版★
//创建数据库连接
//方式5(final版):将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件,获取连接
/*
* 此种方法的好处?
* 1.实现了数据与代码的分离。实现了解耦,代码不用动,修改只要修改配置文件
* 2.如果需要修改配置文件信息,可以避免程序重新打包
*/
@Test
public void testConnection5() throws IOException, ClassNotFoundException, SQLException {
//1.读取配置文件中的4个基本信息
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(is);
String user = pro.getProperty("user");
String password = pro.getProperty("password");
String url = pro.getProperty("url");
String driver = pro.getProperty("driver");
//2.加载驱动
Class.forName(driver);
//3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
PreparedStatement来替换Statment,实现对数据表的增删改查
PreparedStatement好处:解决sql注入问题
除了解决Statement的拼串、sql问题之外,PreparedStatement还有哪些好处呢?
1.PreparedStatement操作Blob的数据,而Statement做不到
2.PreparedStatement可以实现更高效的批量操作。
/*
* 使用PreparedStatement来替换Statment,实现对数据表的增删改查
*
* 增删改;查
*
*/
public class PreparedStatementUpdateTest {
// 向customers表中添加一条记录
@Test
public void testInsert() {
// 1.读取配置文件中的4个基本信息
// 3.获取连接
Connection conn = null;
PreparedStatement ps = null;
try {
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(is);
String user = pro.getProperty("user");
String password = pro.getProperty("password");
String url = pro.getProperty("url");
String driver = pro.getProperty("driver");
// 2.加载驱动
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
//4.预编译sql语句,返回PrepareStatement的实例
String sql = "insert into customers(name,email,birth)values(?,?,?)"; //?代表占位符
ps = conn.prepareStatement(sql);
//5.填充占位符
ps.setString(1, "杨hhh");
ps.setString(2,"yangzhaojie@qq.com");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date parse = sdf.parse("2020-11-11");
ps.setDate(3, new Date(parse.getTime()));
//6.执行操作
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
通用的连接数据库模板
/**通用的获取数据库连接
*
* @Description
* @author muYang
* @date 2020年11月10日上午12:06:02
* @return
* @throws Exception
*/
public static Connection getConnection() throws Exception {
//1.读取配置文件中的4个基本信息
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(is);
String user = pro.getProperty("user");
String password = pro.getProperty("password");
String url = pro.getProperty("url");
String driver = pro.getProperty("driver");
//2.加载驱动
Class.forName(driver);
//3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
return conn;
}
/**
* 通用的资源的关闭
* @Description
* @author muYang
* @date 2020年11月10日上午12:05:44
* @param conn
* @param ps
*/
public static void closeResourse( Connection conn, PreparedStatement ps) {
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通用的增删改操作
//通用的增删改操作
public void update(String sql,Object ...args) {
//1.获取数据库连接
Connection conn = null;
//2.预编译sql语句,返回PreparedStatement的实例
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConnection();
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}
//4.执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
//5.资源的关闭
JDBCUtil.closeResourse(conn, ps);
}
查询操作
/**
* @Description 针对customers表的通用查询操作
* @author muYang Email:786885864@qq.com
* @version
* @throws Exception
* @date 2020年11月10日上午11:30:52
*
*/
public Customer queryForCustomers(String sql,Object ...args) throws Exception {
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库连接
conn = JDBCUtil.getConnection();
//预编译sql语句
ps = conn.prepareStatement(sql);
for(int i =0; i < args.length; i++) {
ps.setObject(i+1, i);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaDate
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaDate获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()) {
Customer cust = new Customer();
//处理结果集一行数据中的每一个列
for(int i =0; i < columnCount; i++) {
//获取列值
Object columnValue = rs.getObject(i+1);
//获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i+1);
//给cust对象指定columnName属性,赋值为columValue,通过反射
Field field = Customer.class.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(cust, columnValue);
return cust;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtil.closeResourse(conn, ps, rs);
}
return null;
}
通用查询(返回单个记录)
使用PreparedStatement实现对于不同表的通用的查询操作
/**
*
* @Description 使用PreparedStatement实现对于不同表的通用的查询操作 //通用的获取一个对象的方法
* @author muYang Email:786885864@qq.com
* @version
* @date 2020年11月10日下午5:02:51
*
*/d
public class PreparedStatementQueryTest {
//针对于不同的表的通用的查询操作返回表中的一条记录
@Test
public <T> T getInstance(Class<T> clazz, String sql, Object ...args) {
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库连接
conn = JDBCUtil.getConnection();
//预编译sql语句
ps = conn.prepareStatement(sql);
for(int i =0; i < args.length; i++) {
ps.setObject(i+1, i);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaDate
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaDate获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()) {
T t = clazz.newInstance();
//处理结果集一行数据中的每一个列
for(int i =0; i < columnCount; i++) {
//获取列值
Object columnValue = rs.getObject(i+1);
//获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i+1);
//给cust对象指定columnName属性,赋值为columValue,通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
return t;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtil.closeResourse(conn, ps, rs);
}
return null;
}
//测试
@Test
public void testGetInstance() {
String sql = "select id,name,email from customers where id = ?";
Customer customer = getInstance(Customer.class, sql, 2);
System.out.println(customer);
}
}
针对不同的表的通用查询操作,返回表中的多条记录(返回多条记录)
/**
*
* @Description 针对不同的表的通用查询操作,返回表中的多条记录
* @author muYang
* @date 2020年11月10日下午6:57:31
* @param <T>
* @param clazz
* @param sql
* @param args
* @return
*/
@Test
public <T>List<T> getForList(Class<T> clazz,String sql,Object ...args) {
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库连接
conn = JDBCUtil.getConnection();
//预编译sql语句
ps = conn.prepareStatement(sql);
for(int i =0; i < args.length; i++) {
ps.setObject(i+1, i);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaDate
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaDate获取结果集中的列数
int columnCount = rsmd.getColumnCount();
//创建集合对象
ArrayList<T> list = new ArrayList<T>();
while(rs.next()) {
T t = clazz.newInstance();
//处理结果集一行数据中的每一个列:给t对象属性赋值
for(int i =0; i < columnCount; i++) {
//获取列值
Object columnValue = rs.getObject(i+1);
//获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i+1);
//给cust对象指定columnName属性,赋值为columValue,通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
list.add(t);
}
return list;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtil.closeResourse(conn, ps, rs);
}
return null;
}