【javaweb学习笔记】JDBC

本文主要介绍了JDBC的常规操作,包括连接MySQL数据库、增删改查和批处理。接着通过水果库存系统的项目实战,详细阐述了DAO设计及实现,并探讨了JDBC的优化,如抽取连接释放资源、通用方法以及使用数据源连接池来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制层: servLet相应服务器端请求。
服务层:service/BIz
数据层:DAO

在这里插入图片描述

1.JDBC常规操作:

1.JDBC:sun发布的一个java程序和数据库之间通信的规范(接口)
2.各大数据库厂商去实现JDBc规范(实现类),这些实现类打成压缩包,就是所谓的jar包

1).JDBC连接MYSQL数据库

安装mysql,创建数据库fruitdb
idea引入jdbcJar包

package com.atguigu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class demo01 {
   
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
   
        // 1. 添加jar包
        // 2. 加载驱动
        Class.forName("org.gjt.mm.mysql.Driver");
        // 3. 通过驱动管理器获取连接对象
        String url = "jdbc:mysql://localhost:3306/fruitdb";
        String user = "root";
        String pwd = "123456";
        Connection conn = DriverManager.getConnection(url, user, pwd);

        System.out.println("conn = " + conn);

    }
}

2).JDBC对数据库进行增、删、改

package com.atguigu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Demo02 {
   
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
   
        // 1. 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2. 通过驱动管理器 获取连接对象

        //url表示 和数据库通信的地址
        //如果url中需要带参数,则需要使用?进行连接
        //如果需要带多个参数,则从第二个参数开始使用 & 连接

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fruitdb?usrSSL=falseuse&Unicode=true&characterEncoding=utf8", "root", "123456");
        // 3. 编写sql语句
        // id, fname, price, fcount, remark
        String sql = "insert into t_fruit values(0,?,?,?,?)";
        // 4. 创建预处理对象
        PreparedStatement psmt = conn.prepareStatement(sql);
        // 5. 填充参数
        psmt.setString(1,"榴莲");
        psmt.setInt(2,15);
        psmt.setInt(3,100);
        psmt.setString(4,"榴莲是一种神器的水果");
        // 6. 执行更新,返回影响行数
        int count = psmt.executeUpdate();
        System.out.println(count > 0 ? "execced": "failed");
        // 7. 释放资源(关闭连接)
        psmt.close();
        conn.close();

    }
}

package com.atguigu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

//JDBC - 修改和删除
public class Demo04 {
   
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
   
        Class.forName("org.gjt.mm.mysql.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
        String sql = "delete from t_fruit where fid = ? " ;
        PreparedStatement psmt = conn.prepareStatement(sql);
        psmt.setInt(1,6);
        int count = psmt.executeUpdate();

        System.out.println(count > 0 ? "删除成功!" : "删除失败!");

        psmt.close();
        conn.close();
    }
}

3).JDBC对数据库进行查询操作

package com.atguigu.jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

//JDBC - 查询所有的库存
public class Demo05 {
   
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
   
        Class.forName("org.gjt.mm.mysql.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","123456");
        //3.编写SQL语句
        String sql = "select * from t_fruit" ;
        //4.创建预处理命令对象
        PreparedStatement psmt = conn.prepareStatement(sql);
        //5.执行查询,返回结果集
        ResultSet rs = psmt.executeQuery();
        //6.解析结果集
        List<Fruit> fruitList = new ArrayList<>();
        while(rs.next()){
   
            //1表示读取当前行的第一列的数据
            //getInt , 因为这一列是int类型,所以使用getInt
            //getInt(结果集的列名)
            //int fid = rs.getInt("fid");
            int fid = rs.getInt(1);
            String fname = rs.getString("fname");
            int price = rs.getInt(3);
            int fcount = rs.getInt(4);
            String remark = rs.getString(5);

            Fruit fruit = new Fruit(fid , fname , price , fcount , remark );
            fruitList.add(fruit);
        }
        //7.释放资源
        rs.close();
        psmt.close();
        conn.close();

        fruitList.forEach(System.out::println);
    }
}

4).添加操作时获取自增列主键值

在这里插入图片描述

//执行更新,返回影响行数
    protected int executeUpdate(String sql , Object... params){
   
        boolean insertFlag = false ;
        insertFlag = sql.trim().toUpperCase().startsWith("INSERT");
        try {
   
            conn = getConn();
            if(insertFlag){
   
                psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            }else {
   
                psmt = conn.prepareStatement(sql);
            }
            setParams(psmt,params);
            int count = psmt.executeUpdate() ;

            rs = psmt.getGeneratedKeys();
            if(rs.next()){
   
                return ((Long)rs.getLong(1)).intValue();
            }
            return count ;
        } catch (SQLException e) {
   
            e.printStackTrace();
        }finally {
   
            close(rs,psmt,conn);
        }
        return 0;
    }

5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值