JavaSE 第十一章 JDBC

  • Post author:
  • Post category:java




11 第十一章 JDBC



JDBC 搭建

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

public class JDBCDemo {
    public JDBCDemo() {
    }

    //1、导入mysql数据库驱动包    lib   ok
    //2、加载数据库驱动
    //3、建立与数据库的连接  ?后面是参数   时区参数是必须的  serverTimezone=UTC
    //4、获得statement,用于向数据库发送sql语句(静态)。
    //5、接受查询的结果
    //6、关闭与数据库的连接通道
    public static void main(String[] args){
        //1、导入mysql数据库驱动包    lib   ok
        //2、加载数据库驱动
            //方法一:  利用反射机制加载Driver类
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");  //利用反射机制加载Driver类
                System.out.println("加载驱动类成功");

                //方法二:利用java的API  java.sql包中的DriverManager  注册登记驱动
              /*  try {
                    DriverManager.registerDriver(new Driver());
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }*/
                
                
        //3、建立与数据库的连接  ?后面是参数   时区参数是必须的  serverTimezone=UTC
                String url = "jdbc:mysql://127.0.0.1:3306/my_db?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
                //  获得连接
                Connection connect = DriverManager.getConnection(url, "root", "227224");
                System.out.println("数据库连接成功");
                
           //4、获得statement,用于向数据库发送sql语句。
            // 通过连接获取Statement对象
            Statement statement = connect.createStatement();

            String name = "王liu";
            String sex = "男";
            String mobile = "13279370686";
            String sql = "create table test(name varchar (64) , mobile varchar (11))";
                System.out.println(statement.execute(sql));
                
            //关闭
            connect.close();
            statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    }
}



11.1 Statement



‘“+字符值+”’

双单引号 双双引号 双加号

public class JDBCDemo {
    public JDBCDemo() { }
    public static void main(String[] args) {
        //与  my_db  建立连接
        Connection conn = JDBCUUtil.getConnection("my_db");

        try {
            Statement statement = conn.createStatement();

            String name = "wangwu";

            //execute 适合执行DDL语句
            //boolean res = statement.execute("insert into test(name,mobile)" + "values('" + name + "','" + "13279370686" + "')");
            //System.out.println(res);

            //executeUpdate  适合插入,更新,删除操作。
            /*int res = statement.executeUpdate("insert into test(name ,mobile)" + "values ('" + "mary" + "','" + "13277777777" + "')");*/

            /*int res = statement.executeUpdate("update test set name = '"+"Tom"+"' where mobile = '"+"13277777777"+"'");*/

            int res = statement.executeUpdate("delete from test where  name = '"+"aaa"+"'");
            System.out.println(res);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}



11.2 PrepareStatement

               //sql
ps.setDate(3,new Date(new java.util.Date().getTime()));
//或
ps.setObject(3,new Date());  // util  这种更好用  
public class PrepareStatementDemo {

    public PrepareStatementDemo() {
    }

    public static void main(String[] args) {
        Connection conn = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            //DriverManager.registerDriver(new Driver());

            String url = "jdbc:mysql://127.0.0.1:3306/my_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
            conn = DriverManager.getConnection(url,"root","227224");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        //Connection conn = JDBCUUtil.getConnection("my_db");

        try {
            //SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
            //发送一次,可以执行多次
            //用问号当占位符  , 提高了安全性  防止sql注入
            String sql = "insert into test(name,mobile)"+"values(?,?)";
            
            //把sql语句存储在PrepareStatement对象中,然后调用该对象中的execute()方法执行
            PreparedStatement ps = conn.prepareStatement(sql);
            
            ps.setNString(1,"mmmm"); //下标从1开始
            ps.setNString(2,"13299999999"); //下标从1开始
            /*ps.setDate(3,new Date(new java.util.Date().getTime()));*/

            int res = ps.executeUpdate();//sql语句发送到数据库
            System.out.println(res);

            ps.close();
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}



Statement 和 PrepareStatement 的区别

  1. PrepareStatement安全性更高(sql注入,恶意攻击,or 1=1);
  2. PrepareStatement的预处理(预编译)会使效率更高;
  3. PrepareStatement可读性好,便于维护。



11.3 ResultSet 结果集

public class ResultSetDemo {
    public ResultSetDemo() { }
    public static void main(String[] args) {
        Connection conn = JDBCUUtil.getConnection("my_db");

        try {

            String sql = "select * from test where name = ?";
            PreparedStatement ps = conn.prepareStatement(sql);

            ps.setObject(1,"Tom"); //下标从1开始

            ResultSet res = ps.executeQuery();

            while (res.next()){
                String string = res.getString("mobile");
                String string1 = res.getString("name");
                System.out.println(string);
                System.out.println(string1);
            }
            res.close();  //关掉结果集
            
            
            ps.close();
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}



也可以使用model类来存储查询出来的数据



版权声明:本文为qq_37079157原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。