jdbc第一天---基础写法

1、什么是jdbc?

  jdbc(Java Database Connectivity,java数据库连接),就是使用java让sql在mysql中执行。为访问不同的关系型数据库提供了统一方式,它是一组由java语言开发类和接口。jdbc为数据库连接提供了基准。

  jdbc中只有接口,没有具体实现。体现了多态和定制规则。

 

    Application:java应用程序

    JDBC Driver Interface:jdbc接口

    Oracle/SQLServer/MySQL JDBC Driver:各个数据库厂商根据jdbc接口实现的驱动包

2、jdbc如何使用

  ①使用之前先导入mysql-connector-java-5.6.21-bin.jar

  ②分为DML和DQL两种语句使用介绍:

  Ⅰ、DML语句(update\delete\insert)

    在jdbc中,这三种语句使用一个方法executeUpdate();

        会有两种代码示例,一种是只能使用静态sql的Statement类,一种是PrepareStatement类,可以使用动态sql

      详细代码示例:

    1、使用的Statement,只能使用静态sql,容易被sql注入,不推荐使用     

public static void main(String[] args){
    //1、加载驱动     
  Class.forName("com.mysql.jdbc.Driver"); //Class.forName()是反射中的,通过类全限定名来找到Driver字节码文件
    //2、创建连接
  String url="jdbc:mysql://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"  
  Connection conn=DriverManager.getConnection(url,username,password);
  //3、执行sql
  String sql="insert into role values(null,'怡宝')";  
  Statement statement= conn.createStatement();//Statement类用于执行sql并返回结果对象,该类之能执行静态sql,容易造成sql注入   
  int i=statement.executeUpdate(sql);    
  //4、关闭连接
  statement.close();
  conn.close();      
}

 

    2、使用PrepareStatement类,可以使用动态sql,推荐使用

public static void main(String[] args){
    //1、加载驱动     
  Class.forName("com.mysql.jdbc.Driver"); //Class.forName()是反射中的,通过类全限定名来找到Driver字节码文件
    //2、创建连接
  String url="jdbc:mysql://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"  
  Connection conn=DriverManager.getConnection(url,username,password);
  //3、预编译sql
  String sql="insert into role values(null,?)"; //使用   ?  来作为占位符  
  PrepareStatement ps= conn.PrepareStatement(sql);//PrepareStatement类用于执行sql并返回结果对象,该类之能执行动态sql
  ps.setObject(1,'万岁山');  //setObject(index,value):index表示是sql语句的第几个占位符,value是要向该占位符中输入的值  
  //4、执行sql     
  int i=statement.executeUpdate();    
  //4、关闭连接
  ps.close();
  conn.close();      
}

  Ⅱ、DQL语句 (select)

    在jdbc中,select语句使用executeQuery()方法

      本次示例只使用PrepareStatement类来编写

    1、基本操作,先只写查询代码,不接收结果

 

public static void main(String[] args){
  //1、加载驱动
  Class.forName("com.mysql.jdbc.Driver");
  //2、创建连接
  String url="jdbc:mysql://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";  
  Connection conn =DriverManager.getConnection(url,username,password);     
  //3、预编译sql
  String sql="select * from role where id>?";  
  PrepareStatement ps=conn.PrepareStatement(sql);//获取PrepareStatement类对象
  ps.setObject(1,2);//给动态sql赋值
  //4、执行sql
  ResultSet rs=ps.execteQuery(); //ResultSet类:表示数据库查询后的数据表
  System.out.println(rs); //输出rs的地址值 
  //5、关闭连接
  rs.close();
  ps.close();
  conn.close();        
}

 

    2、使用List<List>来接收ResultSet中的值

public static void main(String[] args){
  //        1、加载驱动
        Class.forName("com.mysql.jdbc.Driver");
//        2、创建连接
        String url="jdbc:mysql://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection connection = DriverManager.getConnection(url, "root", "root");
//        3、预编译sql
        String sql="select * from role where id>?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //向sql中传参
        ps.setObject(1,1);
//        4、执行sql
        ResultSet resultSet = ps.executeQuery();  //ResultSet中包含数据库语句执行后的数据表对象

//        将表信息转存入到list
        ArrayList<List> biglists = new ArrayList<List>(); //存储整张表结构

//        next():该方法是ResultSet类中的方法,用来判断是否还有下一条数据
        while (resultSet.next()){ //获取数据表中的每行
            ArrayList<Object> sList = new ArrayList<>(); //存储每一行数据
            //getMetaData():用来获取数据表中每行的列数量,属性和类型。
            //getColumnCount():获取每行的总列数
            for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){ //遍历每行中的每列
                Object o = resultSet.getObject(i);
                sList.add(o);
                System.out.println(sList);
            }
            biglists.add(sList);
        }
        System.out.println(biglists);
        resultSet.close();
        ps.close();
        connection.close();        
}

    3、使用List<Map>来存储数据表,就从ResultSet resultSet = ps.executeQuery();以下的代码有差异,本次仅修改这一部分

   //创建List来存储查出来的所有数据
        ArrayList<Map> mList = new ArrayList<>();

  //next()方法判断数据表中是否还有下一行数据
        while(resultSet.next()){  //遍历数据表中的每行
            HashMap<String, Object> sMap = new HashMap<>();//使用map来存储每一行数据
            //getMetaDate()检索此resultset对象中列的数量,类型和属性
            //getColumnCount():得到列的数量
            for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){ //检索每行中的每列
                //getColumnName():得到列的名字      getObject():得到列的值
                    sMap.put(resultSet.getMetaData().getColumnName(i),resultSet.getObject(i));
            }
            mList.add(sMap);
        }

    4、使用List<对象>来存储数据表中的值,就从ResultSet resultSet = ps.executeQuery();以下的代码有差异,本次仅修改这一部分

      该方法需要先创建一个和查询的数据库表相对应的实体实体类,类中的属性和表中的列名相对应

     实体类:Role

public class Role implements Serializable {
    private int id;
    private String rolename;

    public Role() {
    }

    public Role(int id, String rolename) {
        this.id = id;
        this.rolename = rolename;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", rolename='" + rolename + '\'' +
                '}';
    }
}
View Code

     jdbc类的代码:

//        创建List集合来存储数据表的所有值
        ArrayList<Role> roles = new ArrayList<>();

        while (resultSet.next()){
//            创建对象来存储每行的值
            Role role = new Role();
//            由于id存储的是int类型,getObject(index)获取每行第几列的值,得到的是Object类型,需要转换
            int id=Integer.parseInt(resultSet.getObject(1)+"");
            role.setId(id);
            role.setRolename(resultSet.getObject(2).toString());

            roles.add(role);
        }

   Ⅲ、异常处理

//        提升这三个对象的作用域
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet resultSet=null;
        try {
            // 1、连接驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2、创建连接
            String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
            conn = DriverManager.getConnection(url, "root", "root");
            //3、预编译sql
            String sql="select * from role";
            ps = conn.prepareStatement(sql);
            //4、执行sql
            resultSet = ps.executeQuery();

            //创建List<Map>来接收数据,先创建外层List
            ArrayList<Map> bigList = new ArrayList<>();

            while (resultSet.next()){
                HashMap<String, Object> hM = new HashMap<>();//创建map来存储每行的数据
                for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){
                    hM.put(resultSet.getMetaData().getColumnName(i), resultSet.getObject(i));
                }
                bigList.add(hM);
            }
            System.out.println(bigList);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
//            5、关闭连接
            try{
                if(resultSet!=null){
                    resultSet.close();
                }
            }catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                try{
                    if(ps!=null){
                        ps.close();
                    }
                }catch (SQLException throwables) {
                    throwables.printStackTrace();
                }finally {
                    try{
                        if(conn!=null){
                            conn.close();
                        }
                    }catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }
                }
            }

        }
View Code

 

 

 

 

posted @ 2020-12-29 08:54  橙汁one  阅读(116)  评论(0编辑  收藏  举报