05-JDBC

这篇博客详细介绍了使用JDBC进行数据库操作的过程,包括环境准备、建立数据库连接、封装连接信息、执行SQL语句(增删改查)、对象存储、事务控制以及常见问题的解决。特别强调了在进行事务操作时,必须在同一connection上进行,同时提到了驱动类找不到的问题及其解决方法——将数据库驱动jar包放入Tomcat的lib目录。
摘要由CSDN通过智能技术生成

规范 JAVA 程序操作数据库的标准,根据标准(接口)进行编程,不同的数据库产商根据标准(接口)做实现

环境准备

  1. 将数据库驱动导入到项目中

  2. 新建项目文件 - lib

  3. 拷贝jar进lib

  4. 右键jar--build path--add to build path

建立数据库连接

Driver接口的connect方法

  1. url : 数据库连接地址

    总协议:子协议:连接地址:端口号/数据库名

    jdbc:mysql://localhost:3306/xx

  2. user 数据库用户名

  3. password 密码

// 手动加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库信息(?...防止时区错误)
String url = "jdbc:mysql://localhost:3306/a?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC";
String user = "root";
String password = "123456";
// 获取数据库连接
Connection connection = DriverManager.getConnection(url, user, password);

封装数据库连接

创建.properties文件存放连接信息

driver = "com.mysql.cj.jdbc.Driver"

url = "jdbc:mysql://localhost:3306/数据库?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC"

user = "root";

pwd = "123456";

// 静态方法
public static Connection getConnection() {
    // Properties类可以解析properties文件
    Properties pro = new Properties();
    // 用读入流将外部文件导入(在src中找到指定文件)
    InputStream ips = Database.class.getClassLoader().getResourceAsStream("db.properties");
    Connection c = null;
    try {
        // 将读入流中的K-V存放到Properties
        pro.load(ips);
        // 通过pro手动加载驱动
        Class.forName(pro.getProperty("driver"));
        // 获取数据库连接
        c = DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("user"), pro.getProperty("pwd"));
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    // 返回Connection连接
    return c;
}

执行SQL语句

增删改

// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 预编译SQL语句
PreparedStatement ps = c.prepareStatement("INSERT INTO pet VALUES(DEFAULT,'小狗',2)");
// 通过excuteUpdate()查看受影响的行数
int result = ps.executeUpdate();
System.out.println(result>0?"更新成功":"更新失败");
// 关闭资源
ps.close();
c.close();

查看

getMetaData()方法(通过ResultSet调用)

方法作用
getColumnName()获取字段名
getColumnCount()获取字段总数
// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 预编译SQL语句
PreparedStatement ps = c.prepareStatement("SELECT * FROM pet");
// 执行查询executeQuery
// 查询的结果的封装到ResultSet
// 解析ResultSet
ResultSet rs = ps.executeQuery();
 方法一
 是否有下一条数据
//while (rs.next()) {
//  // 1、2、3...字段
//  System.out.print(rs.getObject(1) + " ");
//  System.out.print(rs.getObject(2) + " ");
//  System.out.print(rs.getObject(3) + " "+"\n");
//}
// 方法二
// 获取字段总数方法
// 获取结果集的元数据对象
ResultSetMetaData rsm = rs.getMetaData();
// 获取字段总数
int count = rsm.getColumnCount();
while (rs.next()) {
    for (int i = 1; i <= count; i++) {
        // 获取i列的字段名
        System.out.println(rsm.getColumnName(i));
        // 获取i列的字段数据
        System.out.print(rs.getObject(i)+"\n");
    }
}
// 关闭资源
rs.close();
ps.close();
c.close();

对象存储

// 创建对象
Pet p = new Pet(3, "猫", 3);
// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 预编译SQL语句 - 使用?占位符占位,防止SQL注入篡改指令
PreparedStatement ps = c.prepareStatement("INSERT INTO pet VALUES(?,?,?)");
// .setObejct(index,参数)为占位符赋值 ,index是占位符的位置--从1开始
ps.setObject(1, p.id);
ps.setObject(2, p.name);
ps.setObject(3, p.age);
// 执行结果
int result = ps.executeUpdate();
System.out.println(result > 0 ? "更新成功" : "更新失败");
// 关闭资源
ps.close();
c.close();

事务控制

注意:关于事务的操作都在同一个connection连接上才能控制事务

// 调用连接数据库方法(建立数据库连接)
Database d = new Database();
Connection c = d.getConnection();
// 关闭自动提交
try {
    c.setAutoCommit(false);
} catch (SQLException e) {
    e.printStackTrace();
}
// 业务代码放try
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
    // 预编译SQL语句
    ps1 = c.prepareStatement("update pet set age = age-500 where name='猫'");
    ps2 = c.prepareStatement("update pet set age = age+500 where name='狗'");
    // 运行结果
    ps1.executeUpdate();
    ps2.executeUpdate();
    // 事务提交
    // try最后提交事务
    c.commit();
}
catch (Exception e) {
    // catch最后回滚
    try {
        c.rollback();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
    e.printStackTrace();
}finally {
    // finally关闭资源
    if(ps1!=null) {
        try {
            ps1.close();
        } catch (SQLException e) {
                e.printStackTrace();
        }
    }
    if(ps2!=null) {
        try {
            ps2.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if(c!=null) {
        try {
            //关闭之前打开恢复自动连接
            c.setAutoCommit(true);
            c.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

常见问题

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

正常情况下是因为tomcat服务器找不到

com.mysql.jdbc.Driver文件

要将数据库的这个jar包复制到Tomcat/lib目录  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值