多平台统一管理软件接口,如何实现多平台统一管理软件接口
330
2022-09-09
java中JDBC增删改查操作详解
目录前言一、增删改操作1.1 PreparedStatement介绍1.2 增删改操作 1.3 测试二、查操作2.1通用对不同表进行一条数据查询操作2.2通用对不同表进行多条数据查询操作总结
前言
在上一篇博客我们介绍了JDBC的概念以及连接数据库的五种方式JDBC概述及数据库连接方式(数据库连接方式推荐使用第五种),那么我们既然连接上数据库了,那就要对数据进行操作了,那么这一篇我们就来介绍常规的增删改 查操作。
我们先看一遍步骤:
这里不推荐使用Statement,两个原因:
1.存在拼串操作,繁琐。
2.存在sql注入问题。
那我们使用谁来代替Statement呢?
一、增删改操作
操作前,我们先解决上面的问题,我们使用PreparedStatement来代替Statement。
1.1 PreparedStatement介绍
可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取 PreparedStatement 对象
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
优点:
解决字符串拼串问题,防止sql注入提高性能
1.2 增删改操作
这里给出一个针对不同表的通用增删改操作,拿着直接用就可以了。
//通用增删改操作
public boolean updateInfo(String sql,Object...args){
Connection conn = null;
PreparedStatement ps = null;
boolean b = true;
try {
//1.建立连接
conn = JDBCUtils.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for (int i = 0; i ps.setObject(i+1,args[i]); } //4.执行操作 b = ps.execute(); } catch (Exception e) { e.printStackTrace(); } finally { //5.关闭资源 JDBCUtils.close(conn,ps); } return http://b; } 是不是复制使用会报错,这是因为博主把数据库连接和关闭资源也封装成了一个类JDBCUtils。 下面给出这个类的具体代码: 配置文件就自己写吧,毕竟每个人的数据库都不一样。以及该导入的包自己动动手就行了。 public class JDBCUtils { //连接 public static Connection getConnection(){ Connection conn = null; try { //1.加载配置文件 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"); Properties prop = new Properties(); prop.load(is); //2.读取配置文件 String user = prop.getProperty("user"); String password = prop.getProperty("password"); String url = prop.getProperty("url"); String driverClass = prop.getProperty("driverClass"); //3.加载驱动 ClasvljuzUts.forName(driverClass); //4.建立连接 conn = DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } return conn; } //关闭 public static void close(Connection conn, PreparedStatement ps){ try { if (conn != null){ conn.close(); } if (ps != null){ ps.close(); } } catch (SQLException e) { e.printStackTrace(); } } //关闭带resultset public static void close(Connection conn, PreparedStatement ps , ResultSet rs){ try { if (conn != null){ conn.close(); } if (ps != null){ ps.close(); } if (rs != null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); } } } 1.3 测试 我们来测试一下上面的代码 这里有一张order表,里面有初始数据: 然后我们通过上面提供的方法给他增加一条数据: public class Test { public static void main(String[] args) { Operation operation = new Operation(); String insertSql = "INSERT INTO `order`(order_id,order_name,order_date) VALUES (?,?,?)"; boolean b = operation.updateInfo(insertSql, 3, "CC", new Date(12312132)); if (!b){ System.out.println("操作成功!"); }else { System.out.println("操作失败!"); } } } 控制台打印输出: 那么是不是已经插入成功了呢,我们去数据库中看一下: 我们SELECT * FROM `order`; 看来我们确实成功了!所以我们给出的方法还是没有问题。 二、查操作 接下来我们就是查操作了。 2.1通用对不同表进行一条数据查询操作 public Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.建立连接 conn = JDBCUtils.getConnection(); //2.预编译sql语句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i ps.setObject(i+1,args[i]); } //4.得到结果集ResultSet rs = ps.executeQuery(); //5.得到结果集元数据 ResultSetMetaData rsdm = rs.getMetaData(); //6.通过rs得到列值,rsdm得到列名和列数 //得到列数 int columnCount = rsdm.getColumnCount(); if (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } return t; } } catch (Exception e) { http:// e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 老样子,测试! public class Test { public static void main(String[] args) { Operation operation = new Operation(); String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;"; Order order = operation.doQuery(Order.class, sql, 2); System.out.println(order); } } 控制台输出: 2.2通用对不同表进行多条数据查询操作 public Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.建立连接 conn = JDBCUtils.getConnection(); //2.预编译sql语句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i ps.setObject(i+1,args[i]); } //4.得到结果集ResultSet rs = ps.executeQuery(); //5.得到结果集元数据 ResultSetMetaData rsdm = rs.getMetaData(); //6.通过rs得到列值,rsdm得到列名和列数 //得到列数 int columnCount = rsdm.getColumnCount(); //创建集合 ArrayList while (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 这一个测试就交给各位吧! 总结
ps.setObject(i+1,args[i]);
}
//4.执行操作
b = ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭资源
JDBCUtils.close(conn,ps);
}
return http://b;
}
是不是复制使用会报错,这是因为博主把数据库连接和关闭资源也封装成了一个类JDBCUtils。
下面给出这个类的具体代码:
配置文件就自己写吧,毕竟每个人的数据库都不一样。以及该导入的包自己动动手就行了。
public class JDBCUtils {
//连接
public static Connection getConnection(){
Connection conn = null;
try {
//1.加载配置文件
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties prop = new Properties();
prop.load(is);
//2.读取配置文件
String user = prop.getProperty("user");
String password = prop.getProperty("password");
String url = prop.getProperty("url");
String driverClass = prop.getProperty("driverClass");
//3.加载驱动
ClasvljuzUts.forName(driverClass);
//4.建立连接
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//关闭
public static void close(Connection conn, PreparedStatement ps){
try {
if (conn != null){
conn.close();
}
if (ps != null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭带resultset
public static void close(Connection conn, PreparedStatement ps , ResultSet rs){
try {
if (conn != null){
conn.close();
}
if (ps != null){
ps.close();
}
if (rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1.3 测试
我们来测试一下上面的代码
这里有一张order表,里面有初始数据:
然后我们通过上面提供的方法给他增加一条数据:
public class Test {
public static void main(String[] args) {
Operation operation = new Operation();
String insertSql = "INSERT INTO `order`(order_id,order_name,order_date) VALUES (?,?,?)";
boolean b = operation.updateInfo(insertSql, 3, "CC", new Date(12312132));
if (!b){
System.out.println("操作成功!");
}else {
System.out.println("操作失败!");
}
}
}
控制台打印输出:
那么是不是已经插入成功了呢,我们去数据库中看一下:
我们SELECT * FROM `order`;
看来我们确实成功了!所以我们给出的方法还是没有问题。
二、查操作
接下来我们就是查操作了。
2.1通用对不同表进行一条数据查询操作
public
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.建立连接
conn = JDBCUtils.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for (int i = 0; i ps.setObject(i+1,args[i]); } //4.得到结果集ResultSet rs = ps.executeQuery(); //5.得到结果集元数据 ResultSetMetaData rsdm = rs.getMetaData(); //6.通过rs得到列值,rsdm得到列名和列数 //得到列数 int columnCount = rsdm.getColumnCount(); if (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } return t; } } catch (Exception e) { http:// e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 老样子,测试! public class Test { public static void main(String[] args) { Operation operation = new Operation(); String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;"; Order order = operation.doQuery(Order.class, sql, 2); System.out.println(order); } } 控制台输出: 2.2通用对不同表进行多条数据查询操作 public Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.建立连接 conn = JDBCUtils.getConnection(); //2.预编译sql语句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i ps.setObject(i+1,args[i]); } //4.得到结果集ResultSet rs = ps.executeQuery(); //5.得到结果集元数据 ResultSetMetaData rsdm = rs.getMetaData(); //6.通过rs得到列值,rsdm得到列名和列数 //得到列数 int columnCount = rsdm.getColumnCount(); //创建集合 ArrayList while (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 这一个测试就交给各位吧! 总结
ps.setObject(i+1,args[i]);
}
//4.得到结果集ResultSet
rs = ps.executeQuery();
//5.得到结果集元数据
ResultSetMetaData rsdm = rs.getMetaData();
//6.通过rs得到列值,rsdm得到列名和列数
//得到列数
int columnCount = rsdm.getColumnCount();
if (rs.next()){
T t = clazz.getDeclaredConstructor().newInstance();
for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } return t; } } catch (Exception e) { http:// e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 老样子,测试! public class Test { public static void main(String[] args) { Operation operation = new Operation(); String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;"; Order order = operation.doQuery(Order.class, sql, 2); System.out.println(order); } } 控制台输出: 2.2通用对不同表进行多条数据查询操作 public Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.建立连接 conn = JDBCUtils.getConnection(); //2.预编译sql语句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i ps.setObject(i+1,args[i]); } //4.得到结果集ResultSet rs = ps.executeQuery(); //5.得到结果集元数据 ResultSetMetaData rsdm = rs.getMetaData(); //6.通过rs得到列值,rsdm得到列名和列数 //得到列数 int columnCount = rsdm.getColumnCount(); //创建集合 ArrayList while (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 这一个测试就交给各位吧! 总结
//得到列值
Object columnvalue = rs.getObject(i + 1);
//得到列的别名
String columnLabel = rsdm.getColumnLabel(i + 1);
//通过反射给对象赋值
Field field = clazz.getDeclaredField(columnLabel);
//暴力反射
field.setAccessible(true);
field.set(t,columnvalue);
}
return t;
}
} catch (Exception e) {
http:// e.printStackTrace();
} finally {
//关闭资源
JDBCUtils.close(conn,ps,rs);
}
return null;
}
老样子,测试!
public class Test {
public static void main(String[] args) {
Operation operation = new Operation();
String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;";
Order order = operation.doQuery(Order.class, sql, 2);
System.out.println(order);
}
}
控制台输出:
2.2通用对不同表进行多条数据查询操作
public
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.建立连接
conn = JDBCUtils.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for (int i = 0; i ps.setObject(i+1,args[i]); } //4.得到结果集ResultSet rs = ps.executeQuery(); //5.得到结果集元数据 ResultSetMetaData rsdm = rs.getMetaData(); //6.通过rs得到列值,rsdm得到列名和列数 //得到列数 int columnCount = rsdm.getColumnCount(); //创建集合 ArrayList while (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 这一个测试就交给各位吧! 总结
ps.setObject(i+1,args[i]);
}
//4.得到结果集ResultSet
rs = ps.executeQuery();
//5.得到结果集元数据
ResultSetMetaData rsdm = rs.getMetaData();
//6.通过rs得到列值,rsdm得到列名和列数
//得到列数
int columnCount = rsdm.getColumnCount();
//创建集合
ArrayList
while (rs.next()){
T t = clazz.getDeclaredConstructor().newInstance();
for (int i = 0; i //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的别名 String columnLabel = rsdm.getColumnLabel(i + 1); //通过反射给对象赋值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { //关闭资源 JDBCUtils.close(conn,ps,rs); } return null; } 这一个测试就交给各位吧! 总结
//得到列值
Object columnvalue = rs.getObject(i + 1);
//得到列的别名
String columnLabel = rsdm.getColumnLabel(i + 1);
//通过反射给对象赋值
Field field = clazz.getDeclaredField(columnLabel);
//暴力反射
field.setAccessible(true);
field.set(t,columnvalue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCUtils.close(conn,ps,rs);
}
return null;
}
这一个测试就交给各位吧!
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~