文档章节

【数据库_04】JDBC

Demo_Null
 Demo_Null
发布于 02/14 22:44
字数 1081
阅读 174
收藏 0

一、什么是JDBC

1. JDBC概念

① 官方
    * JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API
    可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
② 个人理解
    * JDBC就是定义了一组操作关系型数据库的接口。

2. 一个示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Demo_JDBC {
    public static void main(String[] args) throws Exception {
        //加载com.mysql.jdbc.Driver进内存,Driver中在静态代码块中注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
        //sql语句
        String sql = "insert emp(empno,ename) values(8888,'皇家马德里')";
        //获取执行对象
        Statement statement = connection.createStatement();
        //执行sql
        int i = statement.executeUpdate(sql);
        //处理数据
        System.out.println(i);
        //释放资源
        statement.close();
        connection.close();
    }
}

3. 相关类功能

① DriverManager
    * 注册驱动
        java.sql.DriverManager.registerDriver(new Driver());        //在静态代码块中
    【一般使用】
        Class.forName("com.mysql.jdbc.Driver");                     // MySQL5 以后的jar包可以省略,不推荐省略
    * 获取数据库连接
        DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
② Connection
    * 获取执行 sql 对象
        connection.createStatement()        // 有漏洞,一般使用PreparedStatement
    * 事务管理
        - 开启事务
            setAutoCommit(false)            // 默认自动提交所以要设置为 false
        - 提交事务
            commit()
        - 回滚
            rollback()                      // catch 中回滚
③ Statement
    * 执行 sql 
        - int executeUpdate(String)                // 执行 DML 
        - RelustSet executeQuray(String)           // 执行 DQL
    * ResultSet 结果集
        - Boolean next()               // 向下移动一个
        - getString(int/String)        // 获取表中数据(int 索引,string 字段名)  ★ 禁止传 int 参数
④ PreparedStatement extends Statement
    * sql 改变
        //防止 sql 注入问题
        String sql = "select * from user where username = ? and password = password(?)"
    * 获取 SQL 执行对象改变
        //需要传递 SQL 预编译
        connection.prepareStatement(sql)
    * 增加赋值
        /**
        *    1 ---> 是第几个 ?
        *    2 ---> ? 代表的值
        */
        setXxx(1,2)
    * 执行 SQL 改变
        //无需传参
        preparedStatement.execute()

二、JDBC工具类

//配置文件 jdbc.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/db1
user = work
password = gaohu

//utils
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
 
public class jdbc_utils {
    static String driver;
    static String url;
    static String user;
    static String password;
 
    static {
        //加载字节码文件获取配置文件流
        InputStream is = jdbc_utils.class.getClassLoader().getResourceAsStream("jdbc.properties");
        
        /**【需要获取配置文件路径是使用这种方式】
        *    //加载本类字节码文件进内存,获取统一资源定位符(URL)
        *    URL url = jdbc_utils.class.getClassLoader().getResource("jdbc.properties");    
        *    //获取URL路径
        *    String s = url.getParth();
        *    //使用 File
        *    pro.load(new File(s));
        */
 
        try {
            //创建properties集合,加载文件进内存
            Properties pro = new Properties();
            pro.load(is);
 
            //获取属性并复制
            driver = pro.getProperty("driver");
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
 
            //加载驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    //获取数据库连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }
 
    //释放资源
    // DML 释放两个资源
    public static void close(PreparedStatement preparedStatement, Connection connection) {
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
 
    // DQL 释放三个资源
    public static void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

三、修改密码案例

import com.java.utils.jdbc_utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
 
public class jdbc_login {
    public static void main(String[] args) {
        //从键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入旧密码");
        String password = sc.nextLine();
 
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
 
        try {
            //获取数据库连接
            connection = jdbc_utils.getConnection();
            //sql语句
            String sql = "select * from user where username = ? and password = password(?)";
            //获取执行sql对象,预编译SQL
            preparedStatement = connection.prepareStatement(sql);
            //给?赋值
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            //执行sql
            resultSet = preparedStatement.executeQuery();
            //结果处理
            if (resultSet.next()) {
                //键入新密码
                System.out.println("请输入新密码");
                String newpassword = sc.nextLine();
                //SQL
                String sqlUpdate = "update user set password = password(?) where username = ?";
                //预编译 SQL
                preparedStatement = connection.prepareStatement(sqlUpdate);
                
                //赋值
                preparedStatement.setString(1,newpassword);
                preparedStatement.setString(2,username);
                //执行SQL
                int i = preparedStatement.executeUpdate();
                
                if (i > 0) {
                    System.out.println("修改成功");
                } else {
                    System.out.println("修改失败");
                }
            } else {
                System.out.println("账号或密码错误!");
            }
 
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            jdbc_utils.close(resultSet,preparedStatement,connection);
        }
    }
}

四、事务管理案例

import com.java.utils.jdbc_utils;

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

public class JDBC_Transaction {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            //获取连接

            connection = jdbc_utils.getConnection();
            //开启事务
            connection.setAutoCommit(false);
            //sql
            String sql = "update account set balance = balance + ? where name = ?";
            //预编译sql
            preparedStatement = connection.prepareStatement(sql);
            //转出500
            preparedStatement.setInt(1,-500);
            preparedStatement.setString(2,"tom");
            //执行sql
            preparedStatement.executeUpdate();
            //转入500
            preparedStatement.setInt(1,500);
            preparedStatement.setString(2,"jack");
            //执行sql
            preparedStatement.executeUpdate();
     
            connection.commit();
        } catch (Exception e) {
            if (connection != null) {
                try {
                    connection.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            jdbc_utils.close(preparedStatement,connection);
        }
    }
}

© 著作权归作者所有

Demo_Null

Demo_Null

粉丝 1
博文 64
码字总数 68109
作品 0
深圳
私信 提问
加载中

评论(0)

使用ANT生成证书的时候出错

我想使用Ant生成CA证书,在做好build.xml,写好./bin/cli.xml 执行脚本时出现 [java] Initializing CA [java] Generating rootCA keystore: [java] CA name: AdminRootCA [java] SuperAdmin CN......

fringe-liu
2012/06/26
499
2
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
JVM -verbose参数详解(转)

转自:http://www.javaranger.com/archives/367 java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息。 1.java -verbose:class 在程序运行的时候有多少类被加载!你可以用verbose...

巴顿
2014/12/04
4.1K
0
BeginnersBook Java 教程

来源:ApacheCN BeginnerBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
2019/10/08
50
0
访问不了http://localhost:8080/ecommerce和https://localhost:8443/webtools?

1.ofbiz版本是:ofbiz12 2.根据这篇博文(http://blog.csdn.net/xiaoliouc/article/details/10223095?reload#html),前面都没有问题,但是在最后一步: 1)执行ant load-demo,成功创建了数...

对岸
2014/11/12
3.5K
2

没有更多内容

加载失败,请刷新页面

加载更多

金三银四——离大厂offer你就只差一张路线图

很多人做Java开发4,5年后,都会感觉自己遇到瓶颈。什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是因为不懂底层原理。公司的工作节奏又比较快,...

Java天天
27分钟前
32
0
用Java递归删除目录

有没有办法用Java递归删除整个目录? 在正常情况下,可以删除一个空目录。 但是,要删除带有目录的整个目录,就不再那么简单了。 如何用Java删除包含目录的整个目录? #1楼 具有堆栈且没有递...

javail
27分钟前
95
0
在hbuilderx中vue-cli脚手架配置router文件夹

配置router文件 新建一个文件夹router,再在新建的router文件夹里新建一个index.js文件 index.js import Vue from 'vue' import Router from 'vue-router' import Home from '../components......

软件开发小白
36分钟前
57
0
高并发软件层面解决思路-从前端到后端

1、页面缓存、前后端分离、CDN、静态页面(减少后台接口请求,需要CMS系统支持)、代码等优化(百度关键词“雅虎前端优化”) 2、nginx或其它配置合理的负载均衡策略,按主机性能设置合理的权...

无名氏的程序员
51分钟前
69
0
Maven项目使用打包时使用本地jar包库

在使用maven管理项目时,有时候我们可能会使用一些第三方的jar包依赖库,但是这些jar包依赖库又没有在共有的maven仓库。 通常只能下来放到本项目的lib目录下。但是我们打包时如果不做处理,那...

上官胡闹
今天
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部