JDBC学习

JDBC学习

1.介绍

1.1 概念

jdbc:Java DataBase Connectivityjava,数据库连接,Java语言操作数据库;

1.2 本质

JDBC本质是由(SUN公司)定义的一套操作所有关系型数据库的规则,各个数据库厂商去实现这套接口,提供驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类;

1.3 快速入门

  • 步骤
    • 1.导入驱动jar
      • 创建目录libs将包mysql-connector-java-5.1.37.jar导入;使用后修改jar包的版本为8.0.17,与本机数据库的版本相互对应
      • addlibary
      • image-20211209113003979
    • 2.注册驱动
      • jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC;根据版本的不同选择是否写?serverTimezone=UTC
    • 3.获取数据库连接对象Connection
    • 4.定义SQL语句
    • 5.获取执行语句的对象Statement
    • 6.执行SQL,接收返回结果
    • 7.处理结果
    • 8.释放资源
  • 代码示例
    package cn.sql.one;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class JabcDemo {
        public static void main(String[] args) throws Exception{
            //1.jar包放入对应的libs文件夹,Mysql版本对应的不同的jar包
            //2.注册驱动;使用反射,将字节码文件加载进内存
            Class.forName("com.mysql.jdbc.Driver");//需要抛出异常,在主方法头部进行抛出
            //3.获取数据库连接对象;数据库连接引擎:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
            Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
            //4.定义sql语句,修改语句
            String sql="update t1 set username='章北海' where id=1";
            //5.获取执行sql的对象Statement
            Statement stmt = conn.createStatement();
            //6.执行sql
            int conut=stmt.executeUpdate(sql);
            //7.处理结果
            System.out.println(conut);
            //8.释放资源
            stmt.close();
            conn.close();
        }
    }
    

    image-20211209153530472

2.基本使用

2.1详解各个对象

1.DriverManager(驱动管理对象)
  • 1.注册驱动

    • 通过静态代码块进行的注册

    • Class.forName("com.sql.Driver")
      
  • 2.获取数据库连接

    • jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
    • url,指定连接路径
    • test:数据库名
    • 如果连接的是本机mysql服务器且mysql服务默认端口是3306,则url可以简写为jdbc:mysql:///数据库名称
    • user:用户名
    • password:密码
2.Connection
  • 数据库连接对象

  • 1.获取执行sql的对象
    • Statement
    • PreparedStatement(参数化)
  • 2.管理事务
    • 开启事务 : setAutoCommit(boolean autoCommit),调用该方法设置参数为false,即开启事务;
    • 提交事务:commit()
    • 回滚事务:rollback()
3.Statement
  • 执行sql的对象

  • 执行静态sql语句,返回结果对象

  • 1. boolean execute(sql)
    • 执行任意sql,返回布尔值
  • 2. int executeUpdate(sql)
    • 执行DML(增、删、改)语句;DDL(表和库的增、删、改)语句,DDL一般不在程序中使用。
    • 返回值INT类型,返回受影响的行数。通常可以根据返回值是否大于0,检查DML语句是否运行成功;
  • 3.ResultSet executeQuery(String sql)
    • 执行DQL(select)语句;
4.ResultSet
  • 结果集对象,封装查询结果

  • next()方法
    • 游标向下获取一行,返回布尔值;
    • 当到最后一行则返回False;
  • getXXX():获取数据
    • 如getInt()方法
    • 参数
    • getString("username"),参数传入列名;
  • 使用方式
    • 游标向下移动一行
    • 判断是否有数据
    • 获取数据
5.PreparedStatement
  • 继承于(Statement),主要用与格式化SQL语句执行,动态,可能还具备防守SQL注入的操作;

image-20211217145012292

package cn.sql.one;

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

public class TestPstmt {
    public static void main(String[] args) throws Exception {
        //1.jar包放入对应的libs文件夹,Mysql版本对应的不同的jar包
        //2.注册驱动;使用反射,将字节码文件加载进内存
        Class.forName("com.mysql.jdbc.Driver");//需要抛出异常,在主方法头部进行抛出
        //3.获取数据库连接对象;数据库连接引擎:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
        Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
        //4.定义sql语句,修改语句
        String sql="update t1 set username=? where id=?";
        //5.获取执行sql的对象Statement
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1,"章北海");
        pstmt.setString(2,"1");
        //6.执行sql,此时不需要在传入对应的sql
        int conut=pstmt.executeUpdate();
        //7.处理结果
        System.out.println(conut);
        //8.释放资源
        pstmt.close();
        conn.close();
    }
}

2.2 添加语句

package cn.sql.one;

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

public class JdbcDemo2 {
    public static void main(String[] args) {
        Connection conn=null;
        Statement stmt=null;//方便在finally进行管比的操作;
        try{
            //1.
            Class.forName("com.mysql.jdbc.Driver");
            String sql="insert into t1(username,age)values('程心',30)";
            conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
            stmt=conn.createStatement();
            int count=stmt.executeUpdate(sql);
            System.out.println(count);//接收返回结果
            if(count>0){
                System.out.println("添加成功");
            }else {
                System.out.println("添加失败");
            }
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }catch ( SQLException e){
            e.printStackTrace();
        }finally {
            //释放资源之前先检查对象是否为引用数据类型的默认类型;
            if(stmt !=null){
                try{
                    stmt.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(conn !=null){
                try{
                    conn.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

增加为此程序,如果要使用UPDATE或者是insert,delete语句程序同上,但是需要把SQL语句改为对应的SQL语句;

2.3 查询语句

package cn.sql.one;

import java.sql.*;

public class JdbcQuery {
    public static void main(String[] args) {
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String sql="select * from t1";
            conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
            stmt=conn.createStatement();
            //执行查询语句
            rs=stmt.executeQuery(sql);
            //处理查询结果,使用next判断是否为最后一行
            while (rs.next()){
                String name=rs.getString("username");
                int age= rs.getInt("age");
                System.out.println(name+"========"+age);
            }
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }catch ( SQLException e){
            e.printStackTrace();
        }finally {
            if(rs !=null){
                try{
                    rs.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(stmt !=null){
                try{
                    stmt.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(conn !=null){
                try{
                    conn.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
        }

    }
}

2.4 查询结合集合存储对象

package cn.sql.demo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JdbcDemoMain {
    public static void main(String[] args) {
        List<Person> list=new JdbcDemoMain().show();
        System.out.println(list);
    }
    public List<Person> show(){
        //将需要用到的对象资源定义在外面,引用数据类型的默认值都是null;
        Connection conn=null;//数据库连接对象
        Statement stmt =null;//执行sql语句的对象
        ResultSet rs=null;//查询结果集的操作
        List<Person> list=null;//存储结果的集合,没有数据则直接返回null;

        try {
            //1.加载数据库的驱动进入内存
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
            //3.定义sql语句
            String sqlstr="select * from t1";
            //4.获取执行sql语句的对象
            stmt=conn.createStatement();
            //5.执行sql语句
            rs=stmt.executeQuery(sqlstr);
            Person per =new Person();
            list =new ArrayList<>();
            while (rs.next()){
                int id = rs.getInt("id");
                String username=rs.getString("username");
                int age=rs.getInt("age");

                per.setId(id);
                per.setUsername(username);
                per.setAge(age);
                list.add(per);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            //释放资源,注意顺序;
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        return list;
    }
}

image-20211209213727952

2.5 控制事务

image-20211217145936897

package cn.sql.demo;

import cn.sql.utils.DButils;

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

//实现事务的控制
public class Affairs {

    public static void main(String[] args) {
        DButils db= new DButils();
        Connection conn=db.getConn();
        try {
//            conn.setAutoCommit(false);//设置为False,自动开启事务
            String sqlstr1="update t1 set username='东方' where id=1";
            String sqlstr2="update t1 set username='章北海' where id=2";
            PreparedStatement pstmt1=conn.prepareStatement(sqlstr1);
            PreparedStatement pstmt2=conn.prepareStatement(sqlstr2);
            pstmt1.executeUpdate();
            int r=3/0;
            pstmt2.executeUpdate();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }finally {
            db.close();
        }

    }
}

image-20211217154052172

制造异常,第一句执行成功但是第二句没有执行成功,不符合事务的特性;下面开启事务。

package cn.sql.demo;

import cn.sql.utils.DButils;

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

//实现事务的控制
public class Affairs {

    public static void main(String[] args) {
        DButils db= new DButils();
        Connection conn=db.getConn();
        try {
            conn.setAutoCommit(false);//设置为False,自动开启事务
            String sqlstr1="update t1 set username='东方' where id=1";
            String sqlstr2="update t1 set username='章北海' where id=2";
            PreparedStatement pstmt1=conn.prepareStatement(sqlstr1);
            PreparedStatement pstmt2=conn.prepareStatement(sqlstr2);
            pstmt1.executeUpdate();
            int r=3/0;//删除掉此句即可成功执行事务;
            pstmt2.executeUpdate();
            conn.commit();//提交事务
        } catch (SQLException throwables) {
            try {
                conn.rollback();//进行事务的回滚
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throwables.printStackTrace();
        }finally {
            db.close();
        }

    }
}

image-20211217155551309

3.封装使用

3.1 简单封装(工具类)

package cn.sql.utils;

import java.sql.*;

/*实现将操作类进行封装*/
public class DButils {
    private String user="root";
    private String password="1234567";
    private String database="test";
    private String port="3306";
    private String ipaddres="127.0.0.1";
    private Connection conn=null;
    private Statement statm=null;
    private ResultSet rs=null;
    private String sqlconnstr="";
    private int res;
    private PreparedStatement pstatm=null;
    public DButils(){
        //使用无参构造方法,直接使用默认变量的默认值构造数据库连接字符串;
        sqlconnstr="jdbc:mysql://"+ipaddres+":"+port+"/"+database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
    }

    //地址端口数据库不同使用 此构造方法
    public DButils(String database, String port, String ipaddres) {
        this.database = database;
        this.port = port;
        this.ipaddres = ipaddres;
        sqlconnstr="jdbc:mysql://"+this.ipaddres+":"+this.port+"/"+this.database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
    }

    //只有数据库不同的时候使用此构造方法
    public DButils(String database) {
        this.database = database;
        sqlconnstr="jdbc:mysql://"+ipaddres+":"+port+"/"+this.database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
    }

    //使用不同地址,不同数据库的方法
    public DButils(String ipaddres,String database){
        this.database=database;
        this.ipaddres=ipaddres;
        sqlconnstr="jdbc:mysql://"+this.ipaddres+":"+port+"/"+this.database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
    }

    //获取连接对象
    public Connection getConn(){
        try {
            //1.使用反射将字节码文件写入内存
            Class .forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn= DriverManager.getConnection(sqlconnstr,user,password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e){
            e.printStackTrace();
        }
        return conn;
    }

    public void close(){
        if(rs!= null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(statm!= null){
            try {
                statm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!= null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    //获取Statement的对象
    public Statement getStatm(){
        conn=getConn();
        try {
            statm=conn.createStatement();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return statm;
    }

    //执行查询语句,获取查询结果的返回值
    public ResultSet executQuery(String sqlstr){
        statm=getStatm();
        try {
            rs=statm.executeQuery(sqlstr);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return rs;
    }

    //执行增删改语句
    public int executUpdate(String sqlstr){
        statm=getStatm();
        try {
            res=statm.executeUpdate(sqlstr);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return res;
    }

    public PreparedStatement getPstatm(String sql){
        conn=getConn();
        try {
            pstatm=conn.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return pstatm;//此时返回的对象可以自行使用设置参数方法;
    }
}
  • 简单测试

  • package cn.sql.demo;
    
    import cn.sql.utils.DButils;
    
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class TestDButils {
        public static void main(String[] args) throws SQLException {
            DButils db= new DButils("testlearn");
            String sqlstr="INSERT into student(sname,gender,class_id)VALUES('东方延续','女',3)";
            int res=db.executUpdate(sqlstr);
            System.out.println(String.format("数据库成功插入了%s条数据",res ));
            String sqlstr2="select * from student";
            ResultSet rs=db.executQuery(sqlstr2);
            while (rs.next()){
                System.out.println(rs.getInt("sid"));
                System.out.println(rs.getString("sname"));
                System.out.println(rs.getString("gender"));
            }
            db.close();
            PreparedStatement pstatm= db.getPstatm(sqlstr);
            pstatm.executeUpdate();
            db.close();
        }
    }
    
    
  • image-20211217161341375

  • 执行成功!

手敲不易,转载请注明出处;

原文地址:https://www.cnblogs.com/Blogwj123/p/15702746.html