java中JDBC增删改查操作详解

网友投稿 323 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 T doQuery(Class clazz,String sql,Object...args) {

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 List doQueryMore(Class clazz,String sql,Object...args){

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 list = new 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 T doQuery(Class clazz,String sql,Object...args) {

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 List doQueryMore(Class clazz,String sql,Object...args){

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 list = new 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 List doQueryMore(Class clazz,String sql,Object...args){

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 list = new 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 List doQueryMore(Class clazz,String sql,Object...args){

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 list = new 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 list = new 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小时内删除侵权内容。

上一篇:企业网络入门-抓包ospf数据包(ospf报文抓包)
下一篇:PageRank算法简介(PageRank算法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~