• 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

    • 执行成功!

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

  • 相关阅读:
    JAVA_Collection容器
    ArrayList实现分组功能
    scrapy 安装出错 [err2] no such file or directory: 'README.rst'【已解决】
    python spyder 今天突然打不开了【已解决】
    SVN使用教程总结
    MVC框架浅析(基于PHP)
    Web性能优化方案
    野生程序员的故事
    js控制页面跳转,清缓存,强制刷新页面
    js中json处理总结之JSON.parse
  • 原文地址:https://www.cnblogs.com/Blogwj123/p/15702746.html
Copyright © 2020-2023  润新知