Java入门——JDBC(1)

  • Post author:
  • Post category:java


一、什么是JDBC

  1. JDBC(Java Database Connection)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。
  2. 它是java程序与数据库系统通信的标准API,JDBC API使得开发人员可以使用纯java的方式来连接数据库,并执行操作。

二、JDBC的访问数据流程

  • 驱动管理器 :加载JDBC驱动程序
Class.forName(“com.mysql.jdbc.Driver”);
  • 连接数据库:建立数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "root", "密码");
  • SQL语句:发送SQL查询
//编写SQL语句
String sql = "selectp.pid,pname,cname,city,birthday,height,weight,position,body,shoot,control from players as p inner join clubs as c on p.cid=c.cid inner join abilities as a on p.pid=a.pid";
//预编译指令
Statement st = con.createStatement();
  • 结果集:得到查询结果
//返回结果集
 ResultSet rs = st.executeQuery(sql);
//对结果进行遍历输出
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4)+ "\t" + rs.getDate(5) + "\t" + rs.getInt(6) + "\t" + rs.getInt(7) + "\t" + rs.getString(8)+ "\t" + rs.getInt(9) + "\t" + rs.getInt(10) + "\t" + rs.getInt(11));}
  • 关闭:关闭结果集,关闭编译指令,关闭数据库连接
rs.close();//关闭结果集
st.close();//关闭编译指令
con.close();//关闭数据库连接

三、DriverManager 类

  • DriverManager 是JDBC的管理层,作用于用户和驱动程序之间。
  • DriverManager 跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。

四、Connection接口

  • Connection与特定数据库的连接(会话),在连接上下文中执行SQL语句并且返回结果。
  • DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上。

五、Statement接口

用于执行静态SQL语句并返回它所生成结果的对象。

三种Statement类:

  • Statement 由createStatement创建,用于发送简单的SQL语句。(不带参数的)
  • PreparedStatement 继承自Statement接口,由prepareStatement创建,用于发送含有一个或者多个数据参数的sql语句。
  • PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般使用PreparedStatement。
  • CallableStatement 继承自PreparedStatement。由方法prepareCall创建,用于调用存储过程。
  • 常用的Statement方法
  1. execute():运行语句,返回是否有结果集
  2. executeQuery():运行select语句,返回ResultSet结果集
  3. executeUpdate():运行insert/update/delete 操作,返回更新的行数。
  4. useUnicode=true&characterEncoding=utf8加上这个防止中文乱码。


使用Statement的缺点 参数必须以字符串拼接。 SQL注入的危险。


为避免SQL注入,我们可以使用PreparedStatements.

//sql注入

//String id = “5 or 1=1”;

String sql1= “delete from user where id=”+id; stmt.execute(sql);

六、ResultSet

ResultSet rs = ps.executeQuery();

Statement 执行Sql语句时返回ResultSet结果集

ResultSet提供的检索不同类型字段的方法,常用的有:

  • getString():获得在数据库里是varchar,char等数据类型的对象。
  • getFloat():获得在数据库里是Float类型的对象。
  • getDate():获得……Date类型对象
  • getBoolean():获得……Boolean类型的对象。

依次关闭使用之对象及连接 – Result -> Statement -> Connection

七、JDBC综合练习,实现对数据库的增改删查动作

import java.sql.*;

/**
 * @author lss
 * JDBC练习1
 */
public class Demo1 {
    public static void main(String[] args) {

   findAll();
       findId(4);
       insert("insert into bank(name,money) values('梁三岁','6000')");
        select();
    }
    private static void findAll(){
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.连接数据库
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/nbadb","root","root");
            System.out.println(connection);
            //3.SQL语句
            String sql = "select * from players";
            PreparedStatement pst = connection.prepareStatement(sql);
            //4.返回结果集
            ResultSet rs = pst.executeQuery();
            //对结果集进行遍历
            while (rs.next()){
                System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getDate(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getString(6)+"\t"+rs.getInt(7));
            }
            rs.close();
            pst.close();
            connection.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    private static void findId(int n){
        try {
            //1.加载JDBC驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.建立数据库连接
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/nbadb","root","root");
            //3.编写SQl语句
            String sql = "select * from players where pid=?";
            //预编译指令
            PreparedStatement pst = con.prepareStatement(sql);
            pst.setInt(1,n);
            //4.返回结果集
            ResultSet rs = pst.executeQuery();
            //对结果集进行遍历
            while (rs.next()){
                System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getDate(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getString(6)+"\t"+rs.getInt(7));
            }
            rs.close();
            pst.close();
            con.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    private static void insert(String s){
        try {
            //1.加载JDBC驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.建立数据库连接
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
            //3.编写SQL语句
            String sql = s;
            //预编译指令
            PreparedStatement pst = con.prepareStatement(sql);
            //4.执行预编译指令,得到返回值
            int i = pst.executeUpdate();
            System.out.println(i>0?"插入成功":"插入失败");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    /**
     * 使用内连接查询表
     */
    private static void select(){
        try {
            //1.加载JDBC驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.建立数据库连接
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/nbadb","root","root");
            //3.编写SQL语句
            String sql = "select p.pid,pname,cname,city,birthday,height,weight,position,body,shoot,control from players as p inner join clubs as c on p.cid=c.cid inner join abilities as a on p.pid=a.pid";
            //预编译指令
            Statement st = con.createStatement();
            //4.返回结果集
            ResultSet rs = st.executeQuery(sql);
            //对结果进行遍历输出
            while (rs.next()) {
                System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4)
                        + "\t" + rs.getDate(5) + "\t" + rs.getInt(6) + "\t" + rs.getInt(7) + "\t" + rs.getString(8)
                        + "\t" + rs.getInt(9) + "\t" + rs.getInt(10) + "\t" + rs.getInt(11));
            }
            rs.close();
            st.close();
            con.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

总结:



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