ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JDBC

2020-11-21 23:32:07  阅读:172  来源: 互联网

标签:JDBC java String 数据库 resultSet sql


JDBC

目录

JDBC

Java DateBase Connectivity 是一个独立于特定数据库的管理系统,通用的SQL数据库存取和操作的公共接口。

定义了一组标准,为访问不同的数据库提供了统一的途径。

image-20201121150742349


JDBC体系结构

JDBC接口包括两个层面:

​ 面向应用的API,供程序员调用。

​ 面向数据库的API,供厂商开发数据库的驱动程序。

image-20201121151518046

image-20201121152415396

JDBC API:

​ 提供者:java官方。

​ 内容:供开发者调用的接口。

​ java.sql javax.sql

DriverManager类

Connection接口

Statement接口

ResultSet接口

DriverManager

​ 提供者:java官方。

​ 作用:管理不同的JDBC驱动。

JDBC驱动

​ 提供者:数据库厂商。

​ 作用:连接不同的数据库。


JDBC的使用

1.加载数据库驱动。数据库驱动是java程序和数据库之间的桥梁。

2.获取Connection。Connection是java程序与数据库的一次连接。

3.创建Statement对象,由Connection产生。执行SQL语句。

4.如果需要接受返回值,创建ResultSet对象,保存Statement执行之后所查询到的结果。


JDBC简易示例:增删改查

示例:

1.创建java项目。

2.在项目中新建lib文件夹。

3.在文件夹中加入mysql-connector-java-8.0.16.jar。这个是跟MySql的版本对应的,是向下兼容的,如果你使用的是Mysql8.0,你没有办法使用mysql-connector-java-5.0.jar,但是如果你使用mysql-connector-java-8.0.16.jar,MySQL5.0和8.0都能使用。

4.添加jar包到Libraries中。

package com.wildfire.jdbc;

import java.sql.*;

public class Jdbc1 {
    public static void main(String []args){
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
            //jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
            //jdbc:数据库类型://url:端口号/数据库名?属性  useUnicode=true&characterEncoding=UTF-8处理中文乱码问题
            String user="root";
            String password="xjmwan1314";
            Connection connection= DriverManager.getConnection(url,user,password);
//            String sql="insert into student(name,score,birthday) values('边信哲',20,'2000-03-18')";
//            String sql="update student set name='张志流' where score=20";
//            String sql="delete from student where name='张三'";
//            Statement statement=connection.createStatement();
//            int result=statement.executeUpdate(sql);
//            System.out.println(result);

            String sql="select * from student";
            Statement statement =connection.createStatement();
            ResultSet resultSet=statement.executeQuery(sql);
            while(resultSet.next()){
                //resultSet.next()返回值是一个布尔型,如果下一行不存在,就返回false,即跳出循环。
                String name=resultSet.getString(1);
                Integer score=resultSet.getInt(2);
                String birthday=resultSet.getString(3);
                System.out.println(name+":"+score+":"+birthday);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   catch (SQLException e) {
            e.printStackTrace();
        }


    }
}

注意:增删改使用的是executeUpdate方法,返回的是int类型,影响了几行就返回几。

​ 查使用的是executeQuery方法,返回的是ResultSet类型,是查询的结果集。

使用IDEA提供的简单的数据库可视化工具:

1.右边DateBase--》+--》Data Source(数据来源)--》MySQL

2.

3.点击Test Connection,返回success则返回成功。

PreparedStatement

实际开发中,我们常用Statement的子类PreparedStatement来完成增删改查的操作。

使用Statement进行开发有两个问题:

​ 1.需要频繁拼接String字符串,出错率较高。

​ 例如:

String username="夜雨声烦";
String pwd="xjmwan1314";
String sql="select * from user where username="+username+"and password ="+password;
System.out.println(sql);

​ 运行的结果是:

​ select * from user where username=夜雨声烦and password =xjmwan1314

​ 很明显不是我们想要的结果。

​ 2.存在SQL注入的风险。

​ SQL 注⼊:利⽤某些系统没有对⽤户输⼊的信息进⾏充分检测,在⽤户输⼊的数据中注⼊⾮法的 SQL 语句,从⽽利⽤系统的 SQL 引擎完成恶意⾏为的做法。

​ 例如:在输入框拼接SQL语句。

​ 使用PreparedStatement能很好的避免以上问题。

package com.wildfire.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class jdbc2 {
    public static void main(String []args){
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url="jdbc:mysql:localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
            String user="root";
            String password="xjmwan1314";
            Connection connection= DriverManager.getConnection(url,user,password);
            
            String username="夜雨声烦";
            String userpassword="123";
            //问号就是占位符
            String sql="select * from user where username = ? and userpassword = ?";
            //在这里就输入了sql语句,后面调用方法却没有用。
            PreparedStatement preparedStatement=connection.prepareStatement(sql);
            //第一个问号赋值为username    不进行字符串拼接  直接使用字符串进行判断
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,userpassword);
            ResultSet resultSet=preparedStatement.executeQuery();
            if(resultSet.next()){
                System.out.print("登录成功!");
            }else{
                System.out.println("登陆失败!");
            }
            


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();

这里是创建对象的时候就传入了SQL语句,而不是使用方法的时候传入sql语句。

标签:JDBC,java,String,数据库,resultSet,sql
来源: https://www.cnblogs.com/wind-and-sky/p/14017882.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有