JDBC(详解)

1.什么是JDBC?

● JDBC(Java DataBase Connectivity)java数据库连接

● 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

● 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.

JDBC API:

供程序员调用的接口与类,集成在java.sql包中

  1. DriverManager类作用:管理各种不同的jDBC驱动

  2. Connection 接口与特定数据库的连接

  3. Statement 接口执行sql

  4. PreparedStatement接口执行sql

  5. ResultSet接口 接收查询结果

2.JDBC的搭建

  • 注册JDBC驱动程序

  • 需要初始化驱动程序,可以打开与数据库的通信通道Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现或者DriverManager.registerDriver(new Driver());

  • 建立与数据库的连接

这需要使用DriverManager.getCOnnection()方法来创建一个

Connection对象,它代表一个物理连接的数据库

Connection conn =

DriverManager.getConnection(URL,USER,PASS);

URL:jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库

名?serverTimezone=Asia/Shanghai

USER:用户名(root)

PASS:密码

  • 获得Satement执行sql语句

    Statement st = connection.createStatement();

    Satement中的方法:

    Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句 返回

    操作的行数

    用于执行ddl语句返回0

    用于执行dml语句返回操作的行数

    ResultSet executeQuery(String sql); 用于执行查询语句 返回一个

    ResultSet 集合

  • 获得PrepareStatement执行sql语句

  • 在sql语句中参数位置使用占位符,使用set***方法向sql中设置参数

    PrepareStatement ps = connection.prepareStatement(sql);

    PrepareStatement中的方法:

    Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数

    用于执行ddl语句返回0

    用于执行dml语句返回操作的行数

    ResultSet executeQuery(); 用于执行查询语句 返回一个ResultSet 集合

  • 关闭与数据库的链接通道

    每次操作完成后关闭所有与数据库交互的通道

    st.close();

    rs.close();

    conn.close();

    ps.close();

3.PreparedStatement和Statement

1、代码的可读性和可维护性.

虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values

('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4)

values (?,?,?,?)");

perstmt.setString(1,var1);

perstmt.setString(2,var2);

perstmt.setString(3,var3);

perstmt.setString(4,var4);

perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例

2、最重要的一点是极大地提高了安全性. 防止sql注入

Stringsql=“

delete from user where id = ”+num;

如果我们把[or 1=1]作为id传入进来?

delete from tb_name where id = 1 or 1 = 1;

因为‘1’=‘1’肯定成立

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹

配的关系. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.

4.结果集处理

● PreparedStatement和Statement中的executeQuery()方法中会返回一

个ResultSet对象,查询结果就封装在此对象中.

● 使用ResultSet中的next()方法获得下一行数据

● 使用getXXX(String name)方法获得值

public static void main(String[] args) throws SQLException, ClassNotFoundException {
//        DriverManager类作用:管理各种不同的jDBC驱动
//        Connection 接口 与特定数据库的连接
//        Statement 接口 执行sql
//        PreparedStatement接口 执行sql
//        ResultSet接口 接收查询结果

        String cname="admin";
        int age=10;
        int num=34;
        DriverManager.registerDriver(new Driver());
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");
        Statement st=connection.createStatement();//执行SQL语句
        st.executeUpdate("INSERT INTO students(cname,age,num)\n" +
                "VALUES('刘子文',20,34)");
//        st.executeUpdate("INSERT INTO students(cname,age,num)" +"VALUE('"+cname+",'"+age+",'"+num+"',noe()");
        st.close();
        connection.close();
    }

 

public static void main(String[] args) throws ClassNotFoundException, SQLException {
        DriverManager.registerDriver(new Driver());
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");
        PreparedStatement ps=connection.prepareStatement("insert into students(cname,age,num)values(?,?,?) ");
        ps.setObject(1,"刘子文");
        ps.setObject(2,22);
        ps.setObject(3,34);
        ps.executeLargeUpdate();
        ps.close();
        connection.close();

    }
import java.sql.*;
//用特定非值调用元素
public class Demo3 {
    public static void main(String[] args) {
        int num=24;
        User user= null;
        try {
            try {
                user = new Demo3().getUserById(num);//调用Demo4的方法
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(user);//输出元素

    }

    public User getUserById(int num) throws ClassNotFoundException, SQLException {
        User user= null;
        PreparedStatement ps=null;
        Connection connection=null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");//初始化驱动程序,打开与数据库的通信通道
            connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");//创建一个对象,它代表一个物理连接的数据库
            ps=connection.prepareStatement("select*from students where num=?");//在SQL语句中参数位置使用占位符,使用set**向SQL语句中设置参数
            ps.setObject(1,num);
            ResultSet rs= ps.executeQuery();//查询语句,执行查询操作,得结果封装到ResultSet
            //从ResultSet中将数据封装到我们自己定义的对象中
            while(rs.next()){
                user=new User();
                user.setNum(rs.getInt("num"));
                user.setAge(rs.getInt("age"));
                user.setCname(rs.getString("cname"));

            }




        } finally{
            //每次操作完关掉与数据库连接的通道
            ps.close();
            connection.close();
        }
        return user;

    }
}

import java.sql.*;
import java.util.ArrayList;
//查询表里的全部元素,将表里的元素逐一打印出来
public class Demo4 {
    public static void main(String[] args) {

        try {
            try {
            ArrayList<User> users = new Demo4().getUsers();
                System.out.println(users);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public ArrayList<User>getUsers() throws ClassNotFoundException, SQLException {
       ArrayList<User> users=new ArrayList<>();
        PreparedStatement ps=null;
        Connection connection=null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/schoolms?serverTimezone=Asia/Shanghai","root","root");
            ps=connection.prepareStatement("select*from students");
            ResultSet rs= ps.executeQuery();//查询语句,执行查询操作,得结果封装到ResultSet
            //从ResultSet中将数据封装到我们自己定义的对象中
            while(rs.next()){
             User  user=new User();
                user.setNum(rs.getInt("num"));
                user.setAge(rs.getInt("age"));
                user.setCname(rs.getString("cname"));
users.add(user);
            }




        } finally{
            ps.close();
            connection.close();
        }
        return users;

    }
}
import java.util.ArrayList;

public class User extends ArrayList<User> {
    private  int num;
    private int age;
    private  String cname;


    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "User{" +
                "num=" + num +
                ", age=" + age +
                ", cname='" + cname + '\'' +
                '}';
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第1页。 2 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第2页。 3 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第3页。 JDBC是一个相对"低级"的接口,也就是说,它能够直接调用SQL命令。在这方面它的功能极佳,数据库连接API易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的API。 在关系数据库的"对象/关系"映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。于是,程序员可直接对Java对象进行操作;存取数据所需的SQL调用将在"掩盖下"自动生成。此外还可提供更复杂的映射,例如将多个表中的行结合进一个Java类中。 随着人们对JDBC兴趣的提高,程序员也一直在编写力图使最终用户对数据库的访问变得更为简单的应用程序。例如应用程序可提供一个选择数据库任务的菜单,任务被选定后,应用程序将给出提示及空白以填写执行选定任务所需的信息,信息输入应用程序后将自动调用所需的SQL命令。在这样一种程序的协助下,即使用户根本不懂SQL的语法,也可以执行数据库任务。 4 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第4页。 8.1.1 JDBC驱动类型 8.1.2 JDBC的常用接口和类 8.1.3 JDBC编程的基本步骤 5 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第5页。 JDBC是应用程序编程接口,描述了一套访问关系数据库的标准Java类库,并且还为数据库厂商提供了一个标准的体系结构,让厂商可以为自己的数据库产品提供JDBC驱动程序,这些驱动程序可以用Java应用程序直接访问厂商的数据产品,从而提高Java程序访问数据库的效率。 Java程序的JDBC可以分为如下四种驱动类型: 1)JDBC-ODBC桥 ODBC是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC,因为ODBC推出的时间要比JDBC早,所以大部分数据库都支持通过ODBC来访问。 SUN公司提供了JDBC-ODBC这个驱动来支持像Microsoft Access之类的数据库JDBC API通过调用JDBC-ODBC桥JDBC-ODBC调用了ODBC API从而达到访问数据库的ODBC层,这种方式经过了多层调用效率比较低,用这种方式访问数据库,需要客户的机器上具有JDBC-ODBC驱动,ODBC驱动和相应的数据库的本地API。 6 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第6页。 2)本地API驱动 本地API驱动直接把JDBC调用转变为数据库的标准调用,然后再去访问数据库,这种方法需要本地数据库驱动代码。本地API驱动比JDBC-ODBC的执行效率更高,但是它仍然需要在客户端加载数据库厂商提供的代码库,这样就不适合基于internet的应用。并且,他的执行效率比三代和四代的JDBC驱动还是不够高。 3)网络协议驱动 这种驱动实际上是根据我们熟悉的三层结构建立的。JDBC先把对数据库的访问请求传递给网络上的中间件服务器,中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用传给数据库服务器。如果中间件服务器也是用Java开法的,那么在在中间层也可以使用一代、二代JDBC驱动程序作为访问数据库的方法,由此构成了一个"网络协议驱动—中间件服务器—数据库Server"的三层模型,由于这种驱动是基于Server的,所以它不需要在客户端加载数据库厂商提供的代码库。而且它在执行效率和可升级性方面是比较好的,因为大部分功能实现都在Server端,所以这种驱动可以设计的很小,可以非常快速的加载到内存中。但是这种驱动在中间件中仍然需要有配置数据库的驱动程序,并且由于多了一个中间层传递数据,它的执行效率还不是最好。 7 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第7页。 4)本地协议驱动 这种驱动直接把JDBC调用转换为符合相关数据库系统规范的请求,由于四代驱动写的应用可以直接和数据库服务器通讯,这种类型的驱动完全由Java实现,对于本地协议驱动的数据库Server来说,由于这种驱动不需要先把JDBC的调用传给ODBC或本地数据库接口或者是中间层服务器,所以它的执行效率是非

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃橘子的Crow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值