JDBC介绍

JDBC:

JDBC(Java Data Base Connection)Java中提供的一套操作数据库的API接口,用于java语言连接操作数据库

常用的API插件:

DriverManager:这个类是驱动管理类,管理一系列数据库驱动程序,用于简历和数据库的连连接
Connection:该接口具有接触数据库所有的方法,表示和数据库通信的上下文对象
Statement:该对象将SQL提交的数据库
ResultSet:SQL查询语句的结果集通过resultSet返回给用户
SQLException:该类是和数据库交互中任何错误

JDBC使用:

1、引入MySQL驱动
通过maven引入依赖

<!--MySQL的驱动依赖-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.39</version>
      </dependency>

2、jdbc连接数据库编程
(1、引入mysql-connector-java依赖包
(2、引入MySQL驱动
(3、DriverManager连接数据库获取Connection对象
(4、通过Connection获取Statement对象进行SQL操作
(5、如果是查询操作处理结果集:ResultSet
(6、关闭资源

public static void main(String[] args) {
        try {
            //加载数据库驱动:com.mysql.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库:
            /**
             * DriverManager管理连接
             *Connection getConnection(String url,String user, String password)
             * url:jdbc:mysql://120.0.0.1:端口号(3306)/test
             * user:用户名
             * password:密码
             */
            Connection connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3305/javatest","root","123456");
            System.out.println("连接成功");
            //获取Statement结果
            Statement statement=connection.createStatement();
            //查询功能:
            String sql="select * from student";
            ResultSet resultSet=statement.executeQuery(sql);
            while (resultSet.next()) {
                String sname = resultSet.getString("Sname");
                System.out.println(sname);
            }

           //修改功能:
            String sql2=" update student set sage=20 where SID=1 or SID=2";
            int i=statement.executeUpdate(sql2);//返回的是修改数据的行数
            System.out.println("修改了"+i+"行数据");

            //关闭资源
            statement.close();
            resultSet.close();
            connection.close();

        } catch (Exception e) {
            System.out.println("连接失败")
            e.printStackTrace( );
        }
    }

常用的API:

Connection接口:数据库连接的对象

//获取Statement对象:
PreparedStatement prepareStatement(String sql) //获取PreparedStatement对象
Statement createStatement() //获取Statement对象
CallableStatement prepareCall(String sql) //取CallableStatement对象
//处理事务:
void commit()  //提交事务

Statement接口:用来执行SQL语句

boolean execute(String sql)//提交SQL语句 返回Boolean类型 可以提交变更操作(插入、删除、修改)
int executeUpdate(String sql) //提交执行DML语言,返回结果表示影响数据库数据行数
ResultSet executeQuery(String sql)//执行查询操作,返回的结果在ResultSet中
ResultSet()//返回结果集
boolean next()//判断是否还有数据,每调用一次获取的是数据库对应的一行记录

PreparedStatement和Statement的区别:

            //获取Statement结果
            Statement statement = connection.createStatement();
            //修改数据
            String sql1 = "update student set Sname='tulun' where SID=18 ";
            int i = statement.executeUpdate(sql1);


            /**
             * PreparedStatement
             * 采用预编译机制处理
             * SQL和参数分别传递
             * SQL上参数的位置通过占位符'?'处理
             * preparedStatement.setString 起始位置为1 
             */
            //需要将SQL和参数分别传递,采用了预编译机制 '?'占位符
            String sql2="update student set Sname = ?  where SID = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.setString(1,"tulun1");
            preparedStatement.setString(2,"18");

            preparedStatement.execute();

SQL注入问题即解决方案:

以登陆界面为例:

public class App 
{
    public static void main( String[] args )
    {
        String name="123";
        String passwd="123456";
        dologin dologin1 = new dologin( );
        boolean result = dologin1.dologin(name, passwd);
        if (result==true){
            System.out.println("登录成功" );
        }else{
            System.out.println("登陆失败" );
        }

    }
}

public class dologin {
    boolean dologin(String name,String passwd){
        boolean result =false;
        try {
            //加载SQL驱动:
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库:
           Connection connection =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3305/javatest","root","123456");
            System.out.println( "连接成功");
            Statement statement =connection.createStatement();

//            //模拟登录操作:(该方法会出现SQL注入问题)
//            String sql="select * from user where name= '"+name+"' and passwd='"+passwd+"'";
//            ResultSet resultSet=statement.executeQuery(sql);
//            if (resultSet.next()) {result=true;}

           //模拟登录操作:PreparedStatement方法
            String sql2="select * from user where name= ? and passwd= ? ";
            PreparedStatement preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.setString(1,name);
            preparedStatement.setString(2,passwd);
            ResultSet resultSet = preparedStatement.executeQuery( );
            if (resultSet.next()){result=true;}

            //关闭资源
//            resultSet.close();
            preparedStatement.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            System.out.println("连接失败");
            e.printStackTrace( );
        }
        return result;
    }
}

sql注入问题描述:

在上述代码中,用户名和密码来和SQL进行拼接查询数据库,查询操作是需要用户名和密码正确才能执行成功。
将name参数写成”name = 12345 or 1=1 and passwd=1234“ name参数拼接中通过非法的SQL拼接达到修改SQL语义,就达到了入侵数据库的目的 当name = 12345或者 1=1and passwd=1234 后面中只要任何一个成绩即可 1=1 为true ,就不在判断passwd是否正确,因此对应登录操作给定用户名,不知道密码情况下也能完成登陆
问题解决:
将SQL及参数分别传递到MySQL服务端,会先进行SQL语义检查
能够规避SQL注入问题,建议使用prepareStatement来处理JDBC连接数据库问题

JDBC处理事务:

            /**
             * 事务操作
             * 在COnnection中也提供相应方法
             */
            connection.setAutoCommit(false); //true  自动提交  false:手动提交  首先要取消自动提交
            connection.commit();  //事务提交
            connection.rollback();//事务回滚
            /**
             *  int TRANSACTION_NONE             = 0;  不提供事务
             *int TRANSACTION_READ_UNCOMMITTED = 1;  未提交事务
             *int TRANSACTION_READ_COMMITTED = 2;   读已提交事务
             *int TRANSACTION_REPEATABLE_READ = 4;   可重复事务
             *int TRANSACTION_SERIALIZABLE = 8;      串行化事务
             * try {
             *  connection.setAutoCommit(false);
             *    sql操作
             *    
             *    connection.commit();
             *     
             * } execption(e){
             *     
             *     connection.rollback();
             * }
             * 
             */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值