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

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

一、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;

/*
    JDBC快速入门
*/
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;
    
    /*
        account表 添加一条记录 insert语句
    */
    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;
    
    /*
        account表 修改一条记录 update语句
    */
    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.*;

/*
    在ResultSet结果集中获取数据 
*/
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;

/*
     抽取JDBC工具类:JDBCutils
*/
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();

            /* 获取src路径下的文件路径---->ClassLoader类加载器
            * 使用这个出错原因:文件路径中有中文,使用这个路径必须全为英文*/
            /*ClassLoader cl=JDBC_Utils.class.getClassLoader();
            URL res= cl.getResource("jdbc.properties");
            String path = res.getPath();*/

            //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();
        }
    }

    /**
     * 获取连接
     * @return 连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /**
     * 释放资源
     * @param sta  执行sql语句的对象
     * @param con  获取连接的对象
     */
    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();
            }
        }
    }

    /**
     * * 释放资源
     * @param rs   封装查询结果的结果集对象
     * @param sta  执行sql语句的对象
     * @param con  获取连接的对象
     */
    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();
            }
        }
    }
}

 

/* 获取src路径下的文件路径---->ClassLoader类加载器
* 使用这个出错原因:文件路径中有中文,使用这个路径必须全为英文*/
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里进行事务回滚

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/889730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存