首页 > 作文

java中JDBC增删改查操作详解

更新时间:2023-04-04 03:20:18 阅读: 评论:0

目录
前言一、增删改操作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 对象的 txxx() 方法来设置这些参数. txxx() 方法有两个参数,第一个参数是要设置的 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 <args.length ; i++) {                ps.tobject(i+1,args[i]);            }            //4.执行操作            b = ps.execute();        } catch (exception e) {            e.printstacktrace();        } finally {            //5.关闭资源            jdbcutils.clo(conn,p江铠同和陈翔s);        }        return 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 ur = prop.getproperty("ur");            string password = prop.getproperty("password");            string url = prop.getproperty("url");            string driverclass = prop.getproperty("driverclass");             //3.加载驱动            class.forname(driverclass);             //4.建立连接            conn = drivermanager.getconnection(url, ur, password);        } catch (exception e) {            e.printstacktrace();        }          return conn;    }     //关闭    public static void clo(connection conn, preparedstatement ps){        try {            if (conn != null){                conn.clo();            }            if (ps != null){                ps.clo();            }        } catch (sqlexception e) {            e.printstacktrace();        }    }    //关闭带resultt    public static void clo(connection conn, preparedstatement ps , resultt rs){        try {            if (conn != null){                conn.clo();            }            if (ps != null){                ps.clo();            }            if (rs != null){                rs.clo();            }        } catch (sqlexception e) {            e.printstacktrace();        }    }}

1.3 测试

我们来测试一下上面的代码

这里有一张order表,里面有初始数据:

​​​​​​​

然后我们通过上面提供的方法给他增加一条数据:

public class test {    public static void main(string[] args) {        operation operation = new operation();        string inrtsql = "inrt into `order`(order_id,order_name,order_date) values (?,?,?)";        boolean b = operation.updateinfo(inrtsql, 3, "cc", new date(12312132));        if (!b){            system.out.println("操作成功!");        }el {            system.out.println("操作失败!");        }    }}

控制台打印输出:

那么是不是已经插入成功了呢,我们去数据库中看一下:

我们lect * from `order`;

看来我们确实成功了!所以我们给出的方法还是没有问题。

二、查操作

接下来我们就是查操作了。

2.1通用对不同表进行一条数据查询操作

public  <t> t doquery(class<t> clazz,string sql,object...args) {        connection conn = null;        preparedstatement ps = null;        resultt rs = null;        try {            //1.建立连接            conn = jdbcutils.getconnection();            //2.预编译sql语句            ps = conn.preparestatement(sql);            //3.填充占位符            for (int i = 0; i <args.length ; i++) {                ps.tobject(i+1,args[i]);            }            //4.得到结果集resultt            rs = ps.executequery();            //5.得到结果集元数据            resulttmetadata rsdm = rs.getmetadata();             //6.通过rs得到列值,rsdm得到列名和列数            //得到列数            int columncount = rsdm.getcolumncount();           残奥会中国首金 if (rs.next()){                t t = clazz.getdeclaredconstructor().newinstance();                for (int i = 0; i <columncount ; i++) {                    //得到列值                    object columnvalue = rs.getobject(i + 1);                    //得到列的别名                    string columnlabel = rsdm.getcolumnlabel(i + 1);                     //通过反射给对象赋值                    field field = clazz.getdeclaredfield(columnlabel);                    //暴力反射                    field.taccessible(true);                    field.t(t,columnvalue);                }                return t;            }        } catch (exception e) {            e.printstacktrace();        } finally {            //关闭资源            jdbcutils.clo(conn,ps,rs);        }        return null;    }

老样子,测试!

public class test {    public static void main(string[] args) {        operation operation = new operation();        string sql = "lect 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 <t> list doquerymore(class<t> clazz,string sql,object...args){        connection conn = null;        preparedstatement ps = null;        resultt rs = null;        try {            //1.建立连接            conn = jdbcutils.getconnection();            //2.预编译sql语句            ps = conn.preparestatement(sql);            //3.填充占位符            for (int i = 0; i <args.length ; i++) {                ps.tobject(i+1,args[i]);            }            //4.得到结果集resultt            rs = ps.executequery();            //5.得到结果集元数据            resulttmetadata rsdm = rs.getmetadata();             //6.通过rs得到列值,rsdm得到列名和列数            //得到列数            int columncount = rsdm.getcolumncount();            //创建集合            arraylist<t> list = new arraylist<>();            while (rs.next()){                t t = clazz.getdeclaredconstructor().newinstance();                for (int i = 0; i <columncount ; i++) {                    //得到列值                    object columnvalue = rs.getobject(i + 1);                    //得到列的别名                    string columnlabel = rsdm.getcolumnlabel(i + 1);                     //通过反射给对象赋值                    field field = clazz.getdeclaredfield(columnlabel);                    //暴力反射                    field.taccessible(true);                    field.t(t,columnvalue);                }                list.add(t);            }            return list;        } catch (exception e) {            e.printstacktrace();        } finally {            //关闭资源            jdbcutils.clo(conn,ps,rs);        }        retur脑经急转弯n null;    }

这一个测试就交给各位吧!

总结

到此这篇关于java中jdbc增删改查操作详解的文章就介绍到这了,更多相关java jdbc增删改查内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 03:20:16,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/3c2afafc5b28af145b9c4f330d8fce37.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java中JDBC增删改查操作详解.doc

本文 PDF 下载地址:java中JDBC增删改查操作详解.pdf

标签:操作   语句   对象   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图