在Java中对SQL进行常规操作的通用方法


一、常规方法增删改查

在常规方法中,我们在Java中对数据库中的表做增删改查操作的时候会发现,代码的答题都大致相同,应该可以将代码优化成一个通用的方法,首先我们要知道增删改要使用到Connection和PreparedStatement两个对象,而查找需要再加一个ResultSet对象,从这里出发我们开始写出一个通用的增删改方法,一个查询方法

二、具体优化步骤

1.准备工作

我们在优化前,需要将一个重复使用的数据写进属性文件中,以便多次使用,提高代码重用率
在src下新建一个包,叫做config,在config包中新建一个文件,jdbc.properties,
在这里插入图片描述
写上常规方法中需要用到的几个数据

2.getcon()方法,获取数据库连接对象

getCon方法,获取数据库连接对象,代码如下

//获得数据库连接对象
    public Connection getcon() {
        Properties pro = null;
        FileReader fr = null;
        Connection con = null;
        try {
            pro = new Properties();			//类加载器
            //相对地址转换成绝对地址
            String str = DBHelper.class.getClassLoader().getResource("config/jdbc.properties").getPath();
            fr = new FileReader(str);		//读取属性文件中的数据
            pro.load(fr);					
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            Class.forName(pro.getProperty("mysql.classname"));
            String username = pro.getProperty("mysql.username");
            String password = pro.getProperty("mysql.password");
            String url = pro.getProperty("mysql.url");
            con = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;			//返回值为Connection类型,在通用方法中调用这个getcon方法,拿到数据库连接对象后继续操作
    }

3.closeAll()方法,关闭所有资源

代码如下

public void closeAll(Connection con, PreparedStatement ps, ResultSet rs){
        try {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

有了这个方法,在我们执行完通用方法之后就不再需要写很多行代码去关闭资源了

4.通用的增删改方法

//通用的增删改方法
    public int update(String sql,Object...objects){
        int i = 0;
        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = getCon();//调用getcon,获得数据库连接对象
            ps = con.prepareStatement(sql);//向传入的sql语句中的问号赋值
            for (int j = 0; j < objects.length; j++) {
                ps.setObject(j + 1, objects[j]);
            }
            i = ps.executeUpdate();//执行sql语句并获得结果
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(con,ps,null);
        }
        return i;//返回执行后的结果以供下一步差异化操作
    }

5.通用的查询方法

public ArrayList query(String sql,Class cla,Object...objs){
        ArrayList list = null;
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = getcon();
            ps = con.prepareStatement(sql);
            for (int i = 0; i < objs.length; i++) {
                ps.setObject(i + 1, objs[i]);//给sql语句中的问号赋值
            }
            rs = ps.executeQuery();//执行sql语句进行查找
            while (rs.next()) {//遍历查找到符合条件的对象
                Object o = cla.newInstance();//通过反射得到一个新的对象
                Field[] declaredFields = cla.getDeclaredFields();//利用反射获取对象成员的所有属性放到数组中
                for (Field f : declaredFields) {//利用强烈for循环遍历数组
                    f.setAccessible(true);//暴力破解权限
                    f.set(o, rs.getObject(f.getName()));//对新的对象的每一个属性赋值,赋的是查找到的对象的值
                }
                list.add(o);//将新的对象添加到集合中,开始对下一个符合条件的对象进行操作
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(con,ps,rs);
        }
        return list;//等对所有符合条件的对象都操作完,把这个集合返回出去,等待下一步使用

    }

6.动态查询语句

我们要知道不同功能的操作的原因是sql语句不同,而查找的sql语句偏偏是一个不能修改的String类型的,我们很难附加一些缩小范围的查询条件,所以动态查询需要用到可变数组,以下代码是在数据层实现类中书写的
以DVD项目做例子,DVD有六个属性,分别是下面代码体现的这些,我们通过传参,传进来一个DVD对象,这个时候我们先写一个可变数组where后面 1 = 1是恒成立的意思,无论后面加不加,加什么都会执行,接下来我们对dvd的各个属性进行判断,如果不为空,那么就代表需要根据这条属性来判断,我们就在sql语句中加上该条件,接着我们在集合中添加这条属性。最后我们再调用通用的查询方法,进行一个动态查询,其实到这里还没结束,需要在控制层再写一次差异化,如果输入一个什么东西,或者下拉勾选需要查询的属性,比如下面第二段演示的代码:

public ArrayList<DVD1> selectDVDs(DVD1 dvd) {
        StringBuilder sql = new StringBuilder("select * from dvd where 1 = 1");
        ArrayList list = new ArrayList();
        if (dvd.getId() != null){
            sql.append("and id = ?");
            list.add(dvd.getId());
        }
        if (dvd.getName() != null){
            sql.append("and name = ?");
            list.add(dvd.getName());
        }
        if (dvd.getState() != null){
            sql.append("and state = ?");
            list.add(dvd.getState());
        }
        if (dvd.getLendDate() != null){
            sql.append("and lendDate = ?");
            list.add(dvd.getLendDate());
        }
        if (dvd.getMoney() != null){
            sql.append("and money = ?");
            list.add(dvd.getMoney());
        }
        if (dvd.getCount() != null){
            sql.append("and count = ?");
            list.add(dvd.getCount());
        }
        return db.query(sql.toString(),DVD1.class,list.toArray());
    }

public void see(){
        DVD dvd=new DVD();
        System.out.println("请输入查看DVD的编号:(输入N,不按照此条件查询)");
        String id = input.next();
        if (!"N".equals(id))dvd.setId(Integer.parseInt(id));
        System.out.println("请输入查看DVD的名称:(输入N,不按照此条件查询)");
        String name = input.next();
        if (!"N".equals(name))dvd.setName(name);
        System.out.println("请输入查看DVD的状态:(输入N,不按照此条件查询)");
        String state = input.next();
        if (!"N".equals(state))dvd.setState(state);
        System.out.println("请输入查看DVD的日租金:(输入N,不按照此条件查询)");
        String money = input.next();
        if (!"N".equals(money))dvd.setMoney(Double.parseDouble(money));
        System.out.println("请输入查看DVD的借出日期:(输入N,不按照此条件查询)");
        String date = input.next();
        if (!"N".equals(date))dvd.setLendDate(date);
        System.out.println("请输入查看DVD的出借次数:(输入N,不按照此条件查询)");
        String count = input.next();
        if (!"N".equals(count))dvd.setCount(Integer.parseInt(count));

        ArrayList<DVD> dvds = dvdService.findDVDs(dvd);
        System.out.println("序号\t\t名字\t\t状态\t\t日租金\t\t借出日期\t\t出借次数");
        for (DVD d : dvds) {
            System.out.println(d.toString());
        }
    }

这样我们就实现了对某一张表进行一个动态查询的操作


总结

以上就是sql语句的通用方法,真~通用,感觉对你有益的话点个收藏吧,防止用的时候找不到!!!

要在Java运行SQL语句,可以使用JDBC(Java Database Connectivity)来实现。 JDBC是Java提供的一种用于与数据库进行交互的API。以下是运行SQL语句的基本步骤: 1. 首先,确保你已经在Java项目引入了适当的数据库驱动程序。这个驱动程序的具体版本取决于你所使用的数据库。你可以从数据库提供商的官方网站上下载适合你数据库版本的驱动程序,并将其添加到项目的类路径。 引用提供了一个示例命令行运行的方式,其包括了驱动程序类路径的设置。 2. 在Java代码,首先需要建立与数据库的连接。这需要提供数据库的连接URL、用户名和密码。连接URL的格式取决于所使用的数据库和驱动程序。你可以在引用找到一个示例连接URL。 3. 一旦建立了数据库连接,就可以使用Statement或PreparedStatement对象来执行SQL语句。Statement用于执行静态SQL语句,而PreparedStatement用于执行带有参数的SQL语句。你可以使用executeQuery方法来执行SELECT语句并返回查询结果集,使用executeUpdate方法来执行INSERT、UPDATE或DELETE语句并返回受影响的行数。 4. 处理查询结果。如果你执行的是SELECT语句并获得了结果集,你可以使用ResultSet对象来遍历结果并提取数据。 下面是一个简单的示例代码,展示了如何在Java运行SQL语句: ```java import java.sql.*; public class ExecuteSQLExample { public static void main(String[] args) throws Exception { String url = "jdbc:mysql://IP地址:端口号/数据库名称?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT+8"; String username = "用户名"; String password = "链接密码"; String sql = "SELECT data_code FROM gather_source;"; // 建立数据库连接 Connection connection = DriverManager.getConnection(url, username, password); // 创建Statement对象 Statement statement = connection.createStatement(); // 执行SQL语句并获取结果集 ResultSet resultSet = statement.executeQuery(sql); // 处理查询结果 while (resultSet.next()) { String dataCode = resultSet.getString("data_code"); System.out.println(dataCode); } // 关闭连接和资源 resultSet.close(); statement.close(); connection.close(); } } ``` 请注意,上述代码的URL、用户名和密码需要根据你自己的数据库配置进行修改。 总结:要在Java运行SQL语句,你需要建立数据库连接,创建Statement或PreparedStatement对象并执行SQL语句,然后处理查询结果。这样就可以在Java运行SQL语句了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [java数据库编程——执行SQL 语句](https://blog.csdn.net/PacosonSWJTU/article/details/50625927)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [JAVA直接执行sql语句](https://blog.csdn.net/lock_xuanqing/article/details/127024290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值