Java JDBC

目录

1.jdbc是什么?

2.jdbc的本质是什么?

3.jdbc开发前的准备工作

4.jdbc编程六步

5.代码示例

6.Statement和PreparedStatement


1.jdbc是什么?

java database connectivity (java 连接数据库)

2.jdbc的本质是什么?

jdbc是sun公司指定的一套接口(interface) ----java,sql*;

接口都有调用者和实现者,面向接口调用,面向接口写实现类等等。

为什么要面向接口编程?

解耦合 :降低程序的耦合度,提高程序的扩展力。

java程序员不用关心 每个公司的数据库底层如何实现,只用关心jdbc接口如何实现,jdbc里面有各个公司的。class文件,数据库商家自己实现好了。只需要下载相应厂家的软件,将相应的 jar包(驱动)加载到编程软件里面。从而可以对相应的数据库进行操作。

jar包里面有一大堆,class文件,来对数据库进行具体以实现。

可以通过反射机制来创建对象

3.jdbc开发前的准备工作

下载驱动jar包,配置环境变量。

4.jdbc编程六步

1.注册驱动(作用: 告诉java程序,即将要连接的是哪个品牌的数据库)

2.获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的 通信,重量级的,使用完之后要关闭通道)

3.获取数据库操作对象(专门执行sql语句的对象)

4.执行sql语句

5.处理查询结果(只有当使用select之后才有这一步)

6.释放资源(使用完资源之后,要关闭资源)

5.代码示例

1.注册驱动:

两个Driver 1.是java.sql,Driver(这是一个java自己的一个接口)

2.是mysql公司实现的一个Driver类 在文件里面(com.mysql.jdbc.Driver)

第二个Driver是继承了第一个Driver的

代码

import java,sql.DriiverManager;
import java.sql.SQLException;
import java.sql.Driver;
public class void main(String[] args){
        //1.注册驱动
    try{
        Driver driver=new com.sql.jdbc.Driver();//多态,父类引用指向子类对象
        DriverManager.registerDriver(driver);
        //2.建立连接
        String url="jdbc:mysql://localhost:3306/mysql";
        String user="root";
        String password="123456";
        Connection connection=DriverManager.getConnection(url,user,password);
        //3.建立数据库操作对象
        Staement statement =connection.creatStatement();
        //4.书写sql语句
        String sql1="Create table baby(code int(50) primary key,\n" +
                    "name varchar(50))";
            String sql2="insert into baby(code,name) values(20,'Fang') ";
            String sql3="update baby set name='Ming' where code=20";
        //5.执行sql语句
        statement.executeUpdate(sql1);
    }catch(SQLException e){
        e.printStackTrace();
    }
    finally{
        //6.关闭连接,释放资源
        statement.close;
        connection.close;
    }
}

查询结果集:Statement有一个方法叫做 executeQuery(sql);

该方法可以实现返回一个查询到的结果的集合Resultsetset,该方法当中还有个next()的方法可以返回一个boolean类型的值来确定该行是否有数据,该方法当中还有一个get()方法来获取改行的元素。可以通过以上接口的相关方法来实现对结果集的打印。

Resultset rs=Statement.executeQuery(sql);//获取到查询结果集
while(rs.next){
    //可以通过查询结果集当中的列名来进行遍历输出
    int sno=rs.getint("sno");
    String sname=rs.getString("sname");
    System.out.println(sno+","+sname);
}
​

6.Statement和PreparedStatement

Statement时创建的sql语句操作对象,在操作的时候调用其中的executeStatement(sql)方法来实现操作,并且把操作的结果返回到 Resultset当中去。

而PreparedStatement则是一个预编译的数据库操作对象。它能够提前编译要执行的sql语句,并且sql语句当中可以使用占位符来进行操作。

例如

 String sql="insert into baby(code,name) values(?,?) ";
            pds=conn.prepareStatement(sql);
            //4.给?传值
            pds.setInt(1,10);
            pds.setString(2,"Fang");
            //5.执行sql语句
            int count=pds.executeUpdate();//这里不用传sql语句进去,因为前面与编译的时候已经把sql传进去并且执行过了

使用PreparedStatement的目的就是为了防止注入问题。

注入问题就是:用户通过输入账户名和密码的过程当中,有意的将密码里面输入一些特定的符号例如:123 or ‘1’=‘1  ’     这样子在进行密码验证的时候,密码当中的特殊字符就参与到Statement的sql语句当中去,从而导致密码输入的不正确也可以得到一个true的返回值类型,从而破译了密码

String sql = "select * from user where username = '" + userName + "' and password = '" + password + "'";

这是一段sql语句,用来查询登陆的时候是否存在这样一个用户,当我么输入用户名或者密码的时候使用特殊的字符:123 or ‘1’=‘1  ’ 的时候,则该语句就会找到所有的user,从而破译成功。

为了避免注入问题,我们一般使用预编译的PreparedStatement

String sql = "select * from user where username = ? and password = ?";
        //预编译SQL语句————提前把SQL语句编译为字符串,其中用到了转义字符防止个别符号注入SQL
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        System.out.println(preparedStatement);

        //为占位符下标赋值
        preparedStatement.setString(1, username);
        preparedStatement.setString(2, password);

这样就能够有效的避免了该问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值