栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDBC、连接数据库,增删改查数据,管理事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDBC、连接数据库,增删改查数据,管理事务

一、JDBC
  1. 概念:Java DataBase Connecting (Java数据库连接  /  Java语言操作数据库)
  2. JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这个接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC执行步骤:
  1. 导入驱动jar包
  2. 注册驱动   注意:新版本mysql请用:com.mysql.cj.jdbc.Driver 
  3. 获取数据库连接对象(Connection)
  4. 定义sql语句
  5. 获取执行sql的对象,Statement
  6. 执行sql
  7. 处理结果
  8. 释放资源

 例子代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class JDBC_Test {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.导入驱动jar包
        //2.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //3.获取数据库连接对象
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test", "root", "yyqx0416");
        //4.定义sql语句
        String sql="update account set balance=500 where id=1";
        //5.获取执行sql的对象 Statement
        Statement sta = con.createStatement();
        //6.执行sql
        int i= sta.executeUpdate(sql);
        //7.处理结果
        System.out.println(i);
        //8.释放资源
        sta.close();
        con.close();
    }
}
详解各个对象: 1.DriverManager:驱动管理对象

 2.Connection:数据库连接对象

 3.statement:执行sql的对象

  1.  添加数据 insert       
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    
    public class JDBC_Test_inse {
        public static void main(String[] args) {
            Connection con=null;
            Statement sta=null;
            try {
                //1.注册驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2.获取Connection对象
                con= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","yyqx0416");
                //3.定义sql语句
                String sql="insert into account values(null,'王五',3000)";
                //4.获取执行sql的对象 statement
                sta=con.createStatement();
                //5.执行sql
                int i = sta.executeUpdate(sql); //收到影响的行数
                //6.处理结果
                System.out.println(i);
                if(i>0){
                    System.out.println("添加数据成功!");
                }else{
                    System.out.println("添加失败!");
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //7.释放资源
                //避免空指针异常,要先判断需要释放的资源是否为空
                if(sta!=null){
                    try {
                        sta.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(con!=null){
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
  2.  修改数据  update   
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    
    public class JDBC_Test2_upda {
        public static void main(String[] args) {
            Connection con=null;
            Statement sta=null;
            try {
                //1.注册驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2.获取连接对象
                con= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","yyqx0416");
                //3.定义sql语句
                String sql="update account set balance=1500 where id=2";
                //4.获取sql执行对象
                sta=con.createStatement();
                //5.执行sql语句
                int i = sta.executeUpdate(sql);
                //6.处理结果
                System.out.println(i);
                if(i>0){
                    System.out.println("修改数据成功!");
                }else{
                    System.out.println("修改数据失败!");
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //7.释放资源
                if(sta!=null){
                    try {
                        sta.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(con!=null){
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

  3.  删除数据  delete  其实只是修改sql语句即可,其他都与上面两条一样                                   
    //3.定义sql语句
    String sql="delete from account where id=3";
    
 4.ResultSet:结果集对象

import java.sql.*;


public class JDBC_Test3_resultset {
    public static void main(String[] args) {
        Connection con=null;
        Statement sta=null;
        ResultSet rs=null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接对象
            con= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","yyqx0416");
            //3.定义sql语句
            String sql="select * from account";
            //4.获取sql执行对象
            sta=con.createStatement();
            //5.执行sql语句
            rs = sta.executeQuery(sql);
            //6.处理结果
            while(rs.next()){
                //判断游标的下一行是否有数据,有就打印出来
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int balance = rs.getInt("balance");
                System.out.println(id+"---"+name+"---"+balance);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //7.释放资源
            if(sta!=null){
                try {
                    sta.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(con!=null){
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  •  练习:
  • 前面先从数据库拿到数据,然后新建emp对象,通过对象set方法把数据传给emp对象
  • 创建一个与emp表中的变量、类型一一对应的emp类,查询该表,将emp表中的每一条记录当作一个emp对象,将这一条条对象放在集合中
5. PreparedStatement:执行sql的对象
  • sql注入问题:用户名随便,密码:a' or 'a' ='a

  

pre.setString(1,username);
pre.setString(2,password);
抽取JDBC工具类:JDBCUtil 
  • 工具类都是静态方法static
  • 静态方法:static关键字修饰,在项目启动之前就开始运行           Java静态、构造代码块、构造函数、普通代码块,还在傻傻的分不清?_哔哩哔哩_bilibili彻底弄懂【静态代码块、构造代码块、构造函数、普通代码块 】有什么区别?以及它们之间的执行顺序。https://www.bilibili.com/video/BV11T4y1y7da?spm_id_from=333.337.search-card.all.click

把配置文件需要提前加载的放在静态代码块中

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;


public class JDBC_Utils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    //1.静态代码块,在项目启动之前就先执行
    
    static{
        //读取资源文件,获取值
        try {
            //1.创建properties集合类
            Properties pro=new Properties();

            
            

            //2.加载文件
            pro.load(new FileReader("E:\Java项目\Test\JavaWeb\src\jdbc.properties"));
            //3.获取数据,赋值
            url= pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");
            //4.注册驱动
            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);
    }

    
    public static void close(Statement sta, Connection con){
        if(sta!=null){
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    
    public static void close(ResultSet rs,Statement sta, Connection con){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(sta!=null){
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

ClassLoader cl=JDBC_Utils.class.getClassLoader();
URL res= cl.getResource("jdbc.properties");
String path = res.getPath();
 练习:通过键盘录入用户名和密码,判断是否登录成功(存在安全问题)
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;


public class JDBC_Test4_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();
        boolean flag = new JDBC_Test4_login().login(username, password);
        if(flag){
            System.out.println("登录成功!");
        }else{
            System.out.println("用户名或密码错误!");
        }
    }

    
    public boolean login(String username,String password){
        if(username==null||password==null){
            return false;
        }
        Connection con=null;
        Statement sta=null;
        ResultSet re=null;
        try {
            //连接数据库
            con = JDBC_Utils.getConnection();
            //定义sql语句
            String sql="select * from user where username='"+username+"' and password='"+password+"'";
            //获取执行sql语句的对象
            sta=con.createStatement();
            re= sta.executeQuery(sql);
            return re.next(); //下一条语句存在,返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            JDBC_Utils.close(re,sta,con);
        }
        return false;
    }
}
登录案例(无安全问题) 
import java.sql.*;
import java.util.Scanner;


public class JDBC_Test4_login2 {
    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();
        boolean flag = new JDBC_Test4_login2().login2(username, password);
        if(flag){
            System.out.println("登录成功!");
        }else{
            System.out.println("用户名或密码错误!");
        }
    }

    
    public boolean login2(String username,String password){
        if(username==null||password==null){
            return false;
        }
        Connection con=null;
        PreparedStatement pre=null;
        ResultSet re=null;
        try {
            //连接数据库
            con = JDBC_Utils.getConnection();
            //定义sql语句
            String sql="select * from user where username=? and password=?";
            //获取执行sql语句的对象
            pre = con.prepareStatement(sql);
            
            pre.setString(1,username);
            pre.setString(2,password);
            //查询,不用传参
            re = pre.executeQuery();
            return re.next(); //下一条语句存在,返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            JDBC_Utils.close(re,pre,con);
        }
        return false;
    }
}

JDBC管理事务

在执行操作前开启事务

 在操作执行结束后提交事务,若执行过程出现异常,就在catch里进行事务回滚

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/872405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号