29_Java_データベース_29日目(JDBC、DBUtils)講義
28338 ワード
今日の内容紹介1、JDBC 2、DBUtils
01 JDBCコンセプトとデータベースドライバ
02 JDBC原理
03データの準備
04 JDBCの開発手順
05 mysqlデータベースドライバjarパッケージのインポート
06データベースドライバの登録
07データベースの接続先を取得する
08 SQL文の実行オブジェクトの取得
09 insert文取得結果セットの実行
10 select文の実行結果セットの取得
11 SQL注入攻撃
12 SQL注入攻撃ユーザーログイン事例
13 PrepareStatementインタフェースSQL文のプリコンパイル
14 PrepareStatementインタフェースSQL文の事前コンパイルによる変更
15 PrepareStatementインタフェースSQL文プリコンパイルクエリー
16 JDBCのツールクラスとテスト
17データテーブルデータストアオブジェクト
18 propertiesプロファイル
19 propertiesファイルの作成と作成
20プロファイルのロード
21プロファイルによるデータベース接続
22プロファイルを読み込むツールクラス
23テストツールクラス
ジョブテスト
JDBCUtilsツールクラスを独立して書くことができ、JDBCUtilsツールクラスで機能を完成できることを保証し、JDBCUtilsツールクラスツールクラスを使わなくても機能を完成できることを保証しなければならない.
1.mapには次のようなデータがあります(ユーザー名=パスワード)
2.データベースstdb、ユーザー名adminパスワード123456すでに存在するテーブルstudentに5人の学生の情報、名前、性別、年齢、点数.
01 JDBCコンセプトとデータベースドライバ
* A: JDBC
* a: JDBC
* JDBC(Java Data Base Connectivity,java ) SQL Java API,
, Java 。 Java
* JDBC , , 。
* JDBC , , , ,
, 。
* mysql mysql-connector-java-5.1.39-bin.jar
* b:
* JDBC java
*
02 JDBC原理
* A: JDBC
* a:
* Java JDBC,
* DBC , , , !
, , 。
* day29_source/JDBC .JPG
03データの準備
* A:
* a:
#
create database mybase;
#
use mybase;
###
create table sort(
sid int PRIMARY KEY AUTO_INCREMENT,
sname varchar(100),
sprice DOUBLE,
sdesc VARCHAR(500)
);
* b:
#
insert into sort(sname,sprice,sdesc) values(' ',2000, ' ');
insert into sort(sname,sprice,sdesc) values(' ',8900, ' , ');
insert into sort(sname,sprice,sdesc) values(' ',290, ' ');
insert into sort(sname,sprice,sdesc) values(' ',500.99, ' ');
insert into sort(sname,sprice,sdesc) values(' ',24000, ' ');
insert into sort(sname,sprice,sdesc) values(' ',50, ' ');
04 JDBCの開発手順
* A: JDBC
* a:
1.
JVM
2.
JDBC , MySQL
3.
SQL
4. sql
, SQL
5.
6. close()
05 mysqlデータベースドライバjarパッケージのインポート
* A: mysql jar
* a:
* lib , jar
* jar , build path / Add to Build Path
06データベースドライバの登録
* A:
* a:
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1. ,
// java.sql.DriverManager registerDriver(Driver driver)
// Diver , ,MySQL
//DriverManager.registerDriver(new Driver());
// , 2
Class.forName("com.mysql.jdbc.Driver");
}
}
07データベースの接続先を取得する
* A:
* a:
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1. ,
// java.sql.DriverManager registerDriver(Driver driver)
// Diver , ,MySQL
//DriverManager.registerDriver(new Driver());
// , 2
Class.forName("com.mysql.jdbc.Driver");
//2. DriverManager
//static Connection getConnection(String url, String user, String password)
// Connection , mysql
//url: jdbc:mysql:// IP: //
String url = "jdbc:mysql://localhost:3296/mybase";
//
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
System.out.println(con);
}
}
08 SQL文の実行オブジェクトの取得
* A: SQL
* a:
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1. ,
// java.sql.DriverManager registerDriver(Driver driver)
// Diver , ,MySQL
//DriverManager.registerDriver(new Driver());
// , 2
Class.forName("com.mysql.jdbc.Driver");
//2. DriverManager
//static Connection getConnection(String url, String user, String password)
// Connection , mysql
//url: jdbc:mysql:// IP: //
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3. , , SQL
// con Statement createStatement() Statement , SQL
// Statement ,, mysql
Statement stat = con.createStatement();
System.out.println(stat);
}
}
09 insert文取得結果セットの実行
* A: insert
* a:
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1. ,
// java.sql.DriverManager registerDriver(Driver driver)
// Diver , ,MySQL
//DriverManager.registerDriver(new Driver());
// , 2
Class.forName("com.mysql.jdbc.Driver");
//2. DriverManager
//static Connection getConnection(String url, String user, String password)
// Connection , mysql
//url: jdbc:mysql:// IP: //
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3. , , SQL
// con Statement createStatement() Statement , SQL
// Statement ,, mysql
Statement stat = con.createStatement();
// 4. sql
// SQL ,
// int executeUpdate(String sql) SQL , insert delete update
// int,
int row = stat.executeUpdate
("INSERT INTO sort(sname,sprice,sdesc) VALUES(' ',50000,' ')");
System.out.println(row);
//6. close()
stat.close();
con.close();
}
}
10 select文の実行結果セットの取得
* A: select
* a:
public class JDBCDemo1 {
public static void main(String[] args) throws Exception{
//1.
Class.forName("com.mysql.jdbc.Driver");
//2.
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3 . SQL
Statement stat = con.createStatement();
// SQL
String sql = "SELECT * FROM sort";
//4. , SQL
// ResultSet executeQuery(String sql) SQL select
// ResultSet , mysql
ResultSet rs = stat.executeQuery(sql);
//5 .
// ResultSet boolean next() true, , false
while(rs.next()){
// , ResultSet getXX , String
System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+
" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
stat.close();
con.close();
}
}
11 SQL注入攻撃
* A: SQL
* a:
* SQL :
* SELECT * FROM WHERE NAME = AND PASSWORD = ;
* , , 。
XXX :XXX’ OR ‘a’=’a , :
* SELECT * FROM WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
* , 。 ,
* , SQL 。
* b:
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100),
PASSWORD VARCHAR(100)
);
INSERT INTO users (username,PASSWORD) VALUES ('a','1'),('b','2');
SELECT * FROM users;
--
SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu'1
OR 1=1
SELECT * FROM users WHERE username='a' AND PASSWORD='1'OR'1=1'
:
1
1'OR' 1=1
12 SQL注入攻撃ユーザーログイン事例
* A: SQL
* a:
public class JDBCDemo2 {
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username = "root";
String password = "123";
Connection con = DriverManager.getConnection(url, username, password);
Statement stat = con.createStatement();
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
// SQL , , , , ,
// String sql = "SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' OR 1=1";
String sql = "SELECT * FROM users WHERE username='"+user+"' AND PASSWORD='"+pass+"'";
System.out.println(sql);
ResultSet rs = stat.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("password"));
}
rs.close();
stat.close();
con.close();
}
}
13 PrepareStatementインタフェースSQL文のプリコンパイル
* A: PrepareStatement SQL
* a:
* PreparedStatement , sql , 。
* String sql = "insert into sort(sid,sname) values(?,?)";;
* PreparedStatement :
* PreparedStatement psmt = conn.prepareStatement(sql)
* b: SQL
* int executeUpdate(); -- insert update delete .
* ResultSet executeQuery(); -- select .
* boolean execute(); -- select true false.
* c:
* void setXxx(int index, Xxx xx) Java xx 。 , SQL Xxx 。
* :
* setString(2, " ") SQL 2 ? " "
* d:
/*
* Java , ,
*
* Statement , SQL ,
* PreparedStatement (SQL , SQL)
* PreparedStatement ,
*
* Connection
* PreparedStatement prepareStatement(String sql)
*/
public class JDBCDemo3 {
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username = "root";
String password = "123";
Connection con = DriverManager.getConnection(url, username, password);
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
// SQL , , , , ,
String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
// Connection prepareStatement, PrepareStatement
// ,SQL
PreparedStatement pst = con.prepareStatement(sql);
System.out.println(pst);
// pst set ,
pst.setObject(1, user);
pst.setObject(2, pass);
// , SQL,
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("password"));
}
rs.close();
pst.close();
con.close();
}
}
14 PrepareStatementインタフェースSQL文の事前コンパイルによる変更
* A: PrepareStatement SQL
*
/*
* PrepareStatement ,
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
// SQL , ?
String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
// con prepareStatement SQL
PreparedStatement pst = con.prepareStatement(sql);
// pst setXXX ?
pst.setObject(1, " ");
pst.setObject(2, 49988);
pst.setObject(3, 7);
// pst SQL
pst.executeUpdate();
pst.close();
con.close();
}
}
15 PrepareStatementインタフェースSQL文プリコンパイルクエリー
* A: PrepareStatement SQL
* a:
/*
* PrepareStatement
*/
public class JDBCDemo1 {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM sort";
PreparedStatement pst = con.prepareStatement(sql);
// pst , ,Select
ResultSet rs=pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
pst.close();
con.close();
}
}
16 JDBCのツールクラスとテスト
* A: JDBC
* a:
//JDBCUtils
public class JDBCUtils {
private JDBCUtils(){}
private static Connection con ;
static{
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(ex+" ");
}
}
/*
* ,
*/
public static Connection getConnection(){
return con;
}
public static void close(Connection con,Statement stat){
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
public static void close(Connection con,Statement stat , ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(SQLException ex){}
}
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
}
// JDBCUtils
public class TestJDBCUtils {
public static void main(String[] args)throws Exception {
Connection con = JDBCUtils.getConnection();
PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("sname"));
}
JDBCUtils.close(con, pst, rs);
}
}
17データテーブルデータストアオブジェクト
* A:
* a:
* jar
* day32 JDBCUtils
* b:
// Sort
public class Sort {
private int sid;
private String sname;
private double sprice;
private String sdesc;
public Sort(int sid, String sname, double sprice, String sdesc) {
this.sid = sid;
this.sname = sname;
this.sprice = sprice;
this.sdesc = sdesc;
}
public Sort(){}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public double getSprice() {
return sprice;
}
public void setSprice(double sprice) {
this.sprice = sprice;
}
public String getSdesc() {
return sdesc;
}
public void setSdesc(String sdesc) {
this.sdesc = sdesc;
}
@Override
public String toString() {
return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
}
}
/*
* JDBC sort, Sort
* Sort , List
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception{
// JDBC ,
Connection con = JDBCUtils.getConnection();
// SQL
PreparedStatement pst = con.prepareStatement("SELECT * FROM sort");
// ,
ResultSet rs = pst.executeQuery();
//
List list = new ArrayList();
while(rs.next()){
// , Sort
Sort s = new Sort(rs.getInt("sid"),rs.getString("sname"),rs.getDouble("sprice"),rs.getString("sdesc"));
// Sort ,
list.add(s);
}
JDBCUtils.close(con, pst, rs);
// List
for(Sort s : list){
System.out.println(s);
}
}
}
18 propertiesプロファイル
* A: properties
* a:
* 4 ( 、URL、 、 ) , , ,
。
* , properties , :
1. : , src
2. : , properties
3. : , “key=value”.
a) key , , 。 :jdbc.driver
b) value , , unicode 。
19 propertiesファイルの作成と作成
* A: properties
* a: properties
* src database.properties( )
* b: properties ( )
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3296/mybase
username=root
password=123
20プロファイルのロード
* A:
* a:
/*
* properties
* IO ,
* ,
*/
public class PropertiesDemo {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("database.properties");
System.out.println(fis);
//
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
System.out.println(in);
}
}
21プロファイルによるデータベース接続
* A:
* a:
/*
* properties
* IO ,
* ,
*/
public class PropertiesDemo {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("database.properties");
System.out.println(fis);
//
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
//
String driverClass=pro.getProperty("driverClass");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
Class.forName(driverClass);
Connection con = DriverManager.getConnection(url, username, password);
System.out.println(con);
}
}
22プロファイルを読み込むツールクラス
* A:
* a:
/*
* ,JDBC
*
* , ,static{}
*/
public class JDBCUtilsConfig {
private static Connection con ;
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
try{
readConfig();
Class.forName(driverClass);
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(" ");
}
}
private static void readConfig()throws Exception{
InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
driverClass=pro.getProperty("driverClass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
}
public static Connection getConnection(){
return con;
}
}
23テストツールクラス
* A:
* a:
public class TestJDBCUtils {
public static void main(String[] args) {
Connection con = JDBCUtilsConfig.getConnection();
System.out.println(con);
}
}
ジョブテスト
JDBCUtilsツールクラスを独立して書くことができ、JDBCUtilsツールクラスで機能を完成できることを保証し、JDBCUtilsツールクラスツールクラスを使わなくても機能を完成できることを保証しなければならない.
1.mapには次のようなデータがあります(ユーザー名=パスワード)
[liuyan=123456,wangbaoqiang=123321,fangbian=abcd,miejueshitai=123abc321]
ip 127.0.0.1 stdb, :admin 123456 userinfo (id,username,password)
(1) map
* map keySet() key Set ,
(2) map userinfo " ", userinfo
(map )
*
*
drop database stdb;
create database stdb;
use stdb;
create table userinfo(
id int(10) primary key auto_increment,
username varchar(200),
password varchar(200)
);
2.データベースstdb、ユーザー名adminパスワード123456すでに存在するテーブルstudentに5人の学生の情報、名前、性別、年齢、点数.
id(varchar(20)) name(varchar(20)) sex(varchar(20)) score(int(10))
1 80
2 75
3 95
4 55
5 68
6 50
7 32
(1) , 80
(2) 100
(3) 60 , , ,
(4) ,
(5) (id-name-sex-score), ( )(id-name-sex-score) studentInfo.txt ( :id-name-sex-score)
(6) public List getAllStudent(){}
(7) id public Student getStudentById(String id){}
(8) id public int deleteStudentById(String id){}// ,
(9) public int addStudent(){}// ,
(10) id public int updateStudentById(String id){}// ,