>  기사  >  데이터 베이스  >  네이티브 JDBC를 사용하는 방법은 무엇입니까?

네이티브 JDBC를 사용하는 방법은 무엇입니까?

零下一度
零下一度원래의
2017-07-03 09:31:181024검색

JDBC
Java DataBase Connectivity, 즉 Java 데이터베이스 연결은 SQL 문을 실행하는 데 사용되는 Java API입니다.
JDBC는 데이터베이스에 액세스하기 위한 Java의 표준 사양으로, 다양한 관계형 데이터베이스에 대한 통합 액세스를 제공할 수 있습니다. 이는 Java 언어로 작성된 인터페이스와 클래스 집합으로 구성됩니다.

Driver
JDBC는 두 장치가 통신하고 특정 통신 데이터 형식을 충족하기 위한 것입니다. 데이터 형식은 장비 공급자가 장치에 대한 드라이버 소프트웨어를 제공합니다. 소프트웨어를 사용하여 장치와 통신할 수 있습니다.

JDBC 사양(4가지 핵심 객체 마스터링)
DriverManager: 드라이버 등록에 사용
Connection: 데이터베이스와 생성된 연결을 나타냄
Statement: 데이터베이스 sql 문을 작동하는 객체
ResultSet: 결과 집합 또는 가상 테이블

JDBC 기술을 사용하여 mysql에서 제공하는 드라이버를 통해 데이터베이스를 작동하는 단계는 다음과 같습니다.
1. 드라이버 등록
JVM에 사용 중인 드라이버(mysql, oracle....)를 알려줍니다.
DriverManager.registerDriver( new com.mysql.jdbc.Driver());
사용을 권장하지 않는 이유는 다음과 같습니다.
>
> 데이터베이스 드라이버 jar에 크게 의존함
솔루션:
Class.forName("com.mysql.jdbc.Driver");
2. 데이터베이스 연결 가져오기
데이터베이스는 TCP 프로그램 서버이며 서버에 연결합니다( 3-way handshake )
는 Java 프로그램에서 데이터베이스 서버
로 연결 경로를 설정하는 것과 동일합니다. static Connection getConnection(String url, String user, String Password)
주어진 데이터베이스 URL에 대한 연결 설정을 시도합니다.
매개변수 설명: url 데이터베이스가 연결되어야 하는 위치(웹 주소) 사용자 사용자 이름 비밀번호 비밀번호
예: getConnection("jdbc:mysql://localhost:3306/day06", "root", "root") ;
URL: SUN 회사와 데이터베이스 공급업체 간의 계약입니다.
jdbc:mysql://localhost:3306/day06
프로토콜 하위 프로토콜 IP: 포트 번호 데이터베이스
mysql: jdbc:mysql://localhost:3306/day04 또는 jdbc:mysql:///day14 (기본 로컬 연결)
oracle 데이터베이스: jdbc:oracle:thin:@localhost:1521:sid
3. 실행기 개체 가져오기
SQL 문을 실행하는 개체, 해당 기능은 SQL을 실행하는 것입니다
인터페이스 구현은 데이터베이스 드라이버에 있습니다. 데이터베이스와의 모든 상호 작용은 연결 개체를 기반으로 합니다.
Statement createStatement(); //SQL 문을 연산하기 위한 객체 생성
4. SQL 문을 실행하고 결과 집합 가져오기
Executor 객체를 사용하여 SQL 문 실행
SQL 문 결과 집합 가져오기(add, 삭제, 수정: 정수, 유효한 행 번호 쿼리 실행: 반환은 결과 집합입니다.)
? int excuteUpdate(String sql) --Excute insert update deleteQuery(String sql) - -Select 문을 실행합니다.
? booleanexecute(String sql); --select를 실행하여 결과가 있는 경우에만 true를 반환하고, 다른 문을 실행하면 false를 반환합니다.
5. 결과 집합 처리
ResultSet은 실제로 2차원 테이블에서 다음() 메소드를 호출하여 레코드 행을 처음 호출할 때 next() 메소드는 레코드의 첫 번째 행 위치를 가리킵니다. ResultSet에서 제공하는 getXXX(int col) 메소드(0부터 시작하는 인덱스와 다르며 열은 1 Start부터 시작함)를 사용하여 지정된 열의 데이터를 가져올 수 있습니다.
rs.next();//Point to the 첫 번째 행
rs.getInt(1);//첫 번째 행과 첫 번째 열의 데이터 가져오기
일반적인 방법:
? Object getObject(int index) / Object getObject(String name) 모든 개체 가져오기
? index)/ String getString(문자열 이름) 문자열 가져오기
? int getInt(int index)/int getInt(문자열 이름) 정수 가져오기
? double getDouble(int index)/ double getDouble(문자열 이름) 배정밀도 부동 소수점 가져오기
6. 리소스 해제
IO 스트림과 마찬가지로 사용 후 모든 것을 닫아야 합니다! 닫는 순서는 먼저 가져와 닫고, 나중에 가져와 먼저 닫는 순서입니다.
JDBC를 사용하여 데이터베이스 코드 데모를 추가, 삭제, 수정 및 쿼리:

  1 public static void main(String[] args) throws Exception {  2         //1.注册驱动  3         Class.forName("com.mysql.jdbc.Driver");  4         //2.获取数据库连接  5         String url = "jdbc:mysql://localhost:3306/mybase4";  6         String user = "root";  7         String password = "root"; 
  8         Connection conn = DriverManager.getConnection(url, user, password);  9         //3.获取执行者对象 10         Statement stat = conn.createStatement(); 11         //调用更新数据的方法 12         //update(stat); 13         //调用删除数据的方法 14         //delete(stat); 15         //调用增加数据的方法 16         //insert(stat); 17         //调用查询数据的方法 18         select(stat); 19         //6.释放资源 20         stat.close(); 21         conn.close(); 22     } 23  24     /* 25      * 使用JDBC技术,查询数据库中表的数据 26      */ 27     private static void select(Statement stat) throws Exception { 28         //拼接sql语句 29         String sql = "SELECT * FROM category"; 30         /* 31          * 4.执行sql语句 32          * 使用Statement中的方法 33          * ResultSet executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 
 34          * 返回值ResultSet标准接口的实现类对象,实现类对象由mysql驱动提供,可以使用ResultSet接口接收 35          */ 36         ResultSet rs = stat.executeQuery(sql); 37         System.out.println(rs);//com.mysql.jdbc.JDBC4ResultSet@1acb189 38         /* 39          * 5.处理结果 40          * ResultSet中有一个方法 41          * boolean next() 将光标从当前位置向前移一行。 42          * 如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false 
 43          * 如果有结果集返回true,若果没有结果集返回false 44          * 相当于迭代器中的hasNext方法 45          */ 46         while(rs.next()){ 47             /* 48              * next返回true,有结果集 49              * 取出结果集 50              * 使用ResultSet中的方法getXXX(参数); 51              * 参数: 52              *     int columnIndex:列所在的索引,从1开始 53              *     String columnLabel:列名 54              * 注意: 55              *     如果使用getInt,getDouble指定数据类型的方法,返回值就是对应的数据类型 56              *     如果使用getObject方法返回值是object类型(只是打印可用) 57              * 如果使用getString方法返回值是String类型 58              */ 59             /*int i1 = rs.getInt(1); 60             String s2 = rs.getString(2); 61             System.out.println(i1+"\t"+s2);*/ 62              63             //System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)); 64             System.out.println(rs.getObject("cid")+"\t"+rs.getObject("cname")); 65             //5.释放资源 66             rs.close(); 67         } 68     } 69  70     /* 71      * 使用JDBC技术,对数据库中的表数据进行增加 72      */ 73     private static void insert(Statement stat) throws SQLException { 74         //拼接sql语句 75         String sql = "INSERT INTO category(cname) VALUES('玩具')"; 76         //4.执行sql语句 77         int row = stat.executeUpdate(sql); 78         //5.处理结果 79         if(row>0){ 80             System.out.println("增加数据成功!"); 81         }else{ 82             System.out.println("增加数据失败!"); 83         } 84          85     } 86  87     /* 88      * 使用JDBC技术,对数据库中的表数据进行删除 89      */ 90     private static void delete(Statement stat) throws Exception { 91         //拼接sql语句 92         String sql = "DELETE FROM category WHERE cid=5"; 93         //4.执行sql语句 94         int row = stat.executeUpdate(sql); 95         //5.处理结果 96         if(row>0){ 97             System.out.println("删除数据成功!"); 98         }else{ 99             System.out.println("删除数据失败!");100         }101     }102 103     /*104      * 使用JDBC技术,对数据库中的表数据进行更新105      */106     private static void update(Statement stat) throws Exception {107         //拼接sql语句108         String sql = "UPDATE category SET cname='鞋帽' WHERE cid=6";109         //4.执行sql语句110         int row = stat.executeUpdate(sql);111         //5.处理结果112         if(row>0){113             System.out.println("更新数据成功!");114         }else{115             System.out.println("更新数据失败!");116         }117     }
 1 JDBC工具类 2 “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。 3 代码演示: 4 public class JDBCUtils { 5      6     //私有构造方法,防止外界创建对象调用方法 7     private JDBCUtils() { 8     } 9     10     //定义Connectionn变量11     private static Connection conn;12     13     //保证代码只执行一次,可以放入静态代码块中14     static{15         try {16             //注册驱动17             Class.forName("com.mysql.jdbc.Driver");18             //获取连接19             String url="jdbc:mysql://127.0.0.1:3306/mybase4";20             String user="root";21             String password = "root";22             conn = DriverManager.getConnection(url, user, password);23         } catch (Exception e) {24             //注意,如果连接数据库失败,停止程序25             throw new RuntimeException(e+"连接数据库失败");26         }27     }28     29     //创建一个静态方法,获取数据库连接对象,并返回30     public static Connection getConnection(){31         return conn;32     }33     34     /*35      * 创建一个静态方法,对资源进行释放36      * ResultSet rs37      * Statement stat38      * Connection conn39      */40     public static void close(ResultSet rs,Statement stat,Connection conn){41         try {42             if(rs!=null){43                 rs.close();44             }45         } catch (SQLException e) {46             e.printStackTrace();47         }48         try {49             if(stat!=null){50                 stat.close();51             }52         } catch (SQLException e) {53             e.printStackTrace();54         }55         try {56             if(conn!=null){57                 conn.close();58             }59         } catch (SQLException e) {60             e.printStackTrace();61         }62     }63 }

SQL 주입 문제
SQL 주입: 사용자가 입력한 내용이 SQL 문 구문의 일부로 사용되어 원본 SQL의 진정한 의미가 변경됩니다.
로그인 사례가 있고 SQL 문은 다음과 같다고 가정합니다.
SELECT * FROM user table WHERE NAME = 사용자가 입력한 사용자 이름 AND PASSWORD = 사용자가 입력한 비밀번호
이 때 사용자가 올바른 계정을 입력하면; 번호와 비밀번호를 입력하고 정보를 조회한 후 사용자 로그인을 하십시오. 하지만 사용자가 계좌번호 XXX와 비밀번호 a'='a';를 입력하면,
이때, 위 쿼리문은 언제나 결과를 출력할 수 있습니다. 그런 다음 사용자는 성공적으로 직접 로그인합니다. 분명히 우리는 그러한 결과를 보고 싶지 않습니다. 이것은 SQL 삽입 문제입니다.
이를 위해 ReadyStatement를 사용하여 해당 문제를 해결합니다.

preparedStatement: 미리 컴파일된 객체로, State 객체의 하위 클래스입니다.

특징:
고성능
SQL 문이 먼저 컴파일됩니다.
사용자가 입력한 키워드를 필터링할 수 있습니다.

PreparedStatement 전처리 객체에서 처리된 각 SQL 문의 모든 실제 매개변수를 자리 표시자로 바꿔야 합니까?

String sql = "select * from user where 사용자 이름 = ? 및 비밀번호 = ?";
ReadyStatement를 사용하려면 다음 3단계를 완료해야 합니다.
1.PreprocessedStatement 전처리 개체 코드:
전처리 개체를 얻으려면 다음이 필요합니다. 문자 처리 후 사용된 계정 SQL문 제공
preparedStatement psmt = conn.prepareStatement(sql)
2. 실제 매개변수 설정
void setXxx(int ​​​index, Xxx xx) 지정된 매개변수를 지정된 유형의 값으로 설정
매개변수 1: 인덱스 실제 매개변수 시퀀스 번호, 1부터 시작.
매개변수 2: xxx 실제 매개변수 값, xxx는 특정 유형을 나타냅니다.
예:
setString(2, "1234") SQL 문의 두 번째 위치에 있는 ?를 실제 매개변수 "1234"로 바꿉니다.
int excuteUpdate(); update delete 문.
ResultSet excuteQuery(); --select 문을 실행합니다.
booleanexecute() --select를 실행하고 true를 반환합니다.

위 내용은 네이티브 JDBC를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.