JDBCはデータベースに接続します
JDBC、データベースの目的?
データベース駆動型
ドライバーを見たとき、最初にどう思いますか?
生活の中で:サウンドカード、グラフィックカード、ネットワークカードはすべてコンピューターに必要であり、コンピューターなしでは起動できません。
私たちのプログラムは、データベースドライバを介してデータベースを処理します。
JDBC
将来的には、Sunは開発者の操作(データベースの統合)を簡素化し、一般に次のように知られる仕様(データベースのJAVA操作用)を提供します。JDBC
これらの計画の実装は特定のベンダーによって行われます〜
Javaプログラムはデータベースmysqlにアクセスします。標準のJDBC(java database connect)があります。
ドライバー:データベースベンダー提供
jar包:mysql / oracle
ドライバーを登録します。
はっきりと見てください。ドライバーを登録する文は1つだけです。
Class.forName(“com.mysql.jdbc.Driver”);
DriverManage
DriverManagerクラスは、JDBCドライバーをロードし、データベースへの接続を作成するために使用されます。
DriverManger(ドライブマネージャー)には2つの機能があります。
注册驱动:这可以让JDBC知道要使用的是哪个驱动 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了
接続
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”123”);
接続インターフェースは、Javaプログラムとデータベース間の接続を表します。接続オブジェクトを取得した後でのみ、データベースにアクセスしてデータテーブルを操作できます。
Connectionオブジェクトは接続を表し、データベースとの通信は次のオブジェクトを介して実行されます。
Connection最为重要的一个方法就是用来获取Statement对象;
ステートメント
Statement stmt = con.createStatement();
//Statement是用来向数据库发送要执行的SQL语句的!
Jdbcのステートメントオブジェクトは、SQLステートメントをデータベースに送信するために使用されます。データベースの追加、削除、および変更のチェックを完了したい場合は、追加、削除、変更、およびチェックステートメントをデータベースに送信するだけで済みます。このオブジェクトを介して。
StatementオブジェクトのexecuteUpdateメソッドは、追加、削除、および変更のsq |ステートメントをデータベースに送信するために使用されます。executeUpdateが実行されると、整数が返されます(つまり、追加、削除、および変更のステートメントにより、変更するデータベース内のデータ)。
Statement.executeQueryメソッドは、データベースへのクエリステートメントを生成するために使用され、executeQueryメソッドは、クエリ結果を表すResultSetオブジェクトを返します。
ステートメントは、SQLステートメントをデータベースに送信するために使用されます。これにより、データベースは送信されたSQLステートメントを実行します。
void executeUpdate(String sql):更新操作(挿入、更新、削除など)を実行します
1. executeUpdate(String sql)メソッドを使用して、データ追加操作(操作例)を完了します。
Statement statement = connection.createStatement();
String sql = "insert into user(...) values(...)";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("插入成功");
}
2. executeUpdate(String sql)メソッドを使用して、データ削除操作(操作例)を完了します。
Statement statement = connection.createStatement();
String sql = "delete from user where id =1";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("删除成功");
}
3. executeUpdate(String sql)メソッドを使用して、データ変更操作(操作例)を完了します。
Statement statement = connection.createStatement();
String sql = "update user set name ='' where name = ''";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("修改成功");
}
ResultSetexecuteQuery(String sql):クエリ操作を実行します。データベースはクエリの実行後にクエリ結果を配置します。クエリ結果はResultSetです。
executeUpdate(String sql)メソッドを使用して、データクエリ操作(操作例)を完了します。
Statement statement = connection.createStatement();
String sql = "select * from user where id =1";
ResultSet rs= statement.executeQuery(sql);
if(rs.next()){
System.out.println("");
}
ResultSet
ResultSetインターフェイスは、JDBCがクエリを実行したときに返される結果セットを保存するために使用されます。結果セットは論理テーブルにカプセル化されます。
ResultSetインターフェイスには多数のgetXxx()メソッドが定義されており、どのgetXxx()メソッドが使用されるかはフィールドのデータ型によって異なります。
boolean next():「行カーソル」を次の行に移動し、移動した行に
XXXがあるかどうかを返しますgetXXX(int col):現在の行の指定された列の値を取得します。パラメーターは列の数です。列の数は0ではなく1から始まります
データベースからデータを取得し、結果テーブルを返します
ResultSetは、内部に「ラインカーソル」がある2次元テーブルです。カーソルのデフォルト位置は「最初の行の上」です。rsオブジェクトのnext()メソッドを呼び出して、「ラインカーソル」を下に移動できます。 next()メソッドが1回呼び出されると、「行カーソル」は最初の行レコードの位置になります。このとき、ResultSetが提供するgetXXX(int col)メソッドを使用してデータを取得できます。指定された列の:
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据
rs.getInt(1)メソッドを使用する場合は、最初の列のデータ型がint型であることを確認する必要があります。不明な場合は、rs.getObject(1)を使用することをお勧めします。一連のgetXXX()メソッドがResultSetクラスで提供されます。より一般的に使用されるメソッドは次のとおりです。
Object getObject(int col)
String getString(int col)
int getInt(int col)
double getDouble(int col)
シャットダウン
IOストリームと同様に、使用後はすべてを閉じる必要があります。クローズの順序は、最初にクローズし、最後にクローズすることです。
rs.close();
stmt.close();
con.close();
MySQlデータベース
一般的に使用されるコマンド
データベースの作成:データベースデータベース名の作成;
データベースの削除:データベースデータベース名の削除;データベースの
使用:データベース名の使用;
データベーステーブルの作成:テーブルテーブル名の作成(フィールド名1フィールドタイプ[デフォルトのデフォルト値] [制約]、… );
データベーステーブルの削除:テーブルテーブル名の削除;
テーブル構造の表示:descテーブル名;
すべてのデータベースの表示:データベースの
表示;データベースのすべてのテーブルの表示:テーブルの表示;
SQL構文ベース(構造化照会言語、構造化照会ステートメント)強力なデータベース言語
DML-データ操作言語:データの取得または変更
DDL-データ定義言語:データの構造の定義、
DCLの作成、変更、および削除-データ制御言語:データベースユーザーの権限の定義
ステップ:
1)jarパッケージ、ドライバーパッケージをダウンロードします
https://mvnrepository.com/search?q=mysql
2)アイデアはプロジェクトjdbc2011を作成します
3)ディレクトリ内のlibディレクトリをsrcフラッシュし、jarをその中に入れます
4)呼び出すことができるように、このjarパッケージに依存する必要があることをこのプロジェクトに通知します
5)ファイルメニューの下のプロジェクト構造メニューを選択します
モジュールモジュールを選択し、[依存関係]ページフォルダーを選択します
6)jarをこのプロジェクトにバインドすると、コードで使用できます
+署名し、最初の瓶を選択します。。。
7)自分の場所に移動します
IdeaProjects \ jdbc2011 \ lib \ mysql-connector-java-5.1.32.jar
成功条件:jarの前に小さな矢印があります。クリックして開くと、成功を表すパッケージが表示されます。
手順:
アイデアはプロジェクトプロジェクトを作成します。プロジェクト名はjdbc2011です。次に、新しいlibフォルダーを作成し、jarパッケージにドラッグします。
jarパッケージ呼び出し環境を構成し、「ファイル」-「プロジェクト」をクリックします。
モジュールの選択-DEpendencles-最後に+記号を選択し、最初のjarファイルを選択します。。。
ポップアップウィンドウが表示されたら、構成済みのjarパッケージを選択し、選択後に[OK]をクリックします。
設定が完了しました。
私の最初のJDBCプログラム形式
public class TestJDBC {
public static void main(String[] args){
//1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");//固定写法
//2. 用户信息和url
//useUnicode=true&characterEncoding=utf8&&useSSL=true
String url ="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";
//mysql 默认3306
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3
//Oracle--1521
//jdbc:oralce:thin:@localhost:1521:sid
String name = "root";//数据库账号
String password = "123456";//数据库密码
//3. 连接成功,返回数据库对象 connection代表数据库 PrepareStatement 执行SQL的对象
Connection connection= DriverManager.getConnection(url,name,password);
//connection代表数据库
connection.rollback();//事务回滚
connection.commit();//事务提交
connection.setAutoCommit();//数据库设置自动提交
//4. 执行SQL的对象 statement 执行SQL的对象
Statement statement = connection.createStatement();
statement.executeQuery();
statement.execute();
statement.executeUpdate();//更新,插入,删除,返回一个受影响的行数
//5. 执行SQL的对象 去执行SQL 可能存在结果,查看返回结果
String sql="SELECT * FROM users";
//ResultSet 查询的结果集,封装了所以的查询结果
//获得指定的数据类型
ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部查询的结果
resultSet.getObject();//在不知道列类型下使用
//如果知道则指定使用
resultSet.getString();
resultSet.getInt();
resultSet.getChar();
//遍历,指针
while(resultSet.next()){
resultSet.next(); //移动到下一个
resultSet.afterLast();//移动到最后
resultSet.beforeFirst();//移动到最前面
resultSet.previous();//移动到前一行
resultSet.absolute(row);//移动到指定行
System.out.println("id+"+resultSet.getObject("id"));
System.out.println("name+"+resultSet.getObject("NAME"));
System.out.println("password+"+resultSet.getObject("PASSWORD"));
System.out.println("email+"+resultSet.getObject("email"));
System.out.println("birthday+"+resultSet.getObject("birthday"));
}
//6. 释放连接
resultSet.close();
statement.close();
connection.close();//耗资源
}
}
JDBC接続コードを実行します
import java.sql.*;
public class TestJDBC {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
//通过java访问mysql数据库,查询
//这个对象获取数据库链接
//注册驱动,输入链接地址,用户名,密码
String driver = "com.mysql.cj.jdbc.Driver";
//mysql 8.0 (oracle) 把驱动包路径改了,
//8.0之前 com.mysql.jdbc.Driver
//8.0之后 com.mysql.cj.jdbc.Driver
//访问本机的mysql数据库,端口3306,数据库名
String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai&characterEncoding=UTF8";
String username = "root";
String password = "root";
Class.forName(driver);
//获取到数据库链接
Connection cn = DriverManager.getConnection(url, username, password);
//创建一个Statement语句对象
Statement stat = cn.createStatement();
//执行SQL语句
String sql = "select * from student";
//把查询的结果(表记录)存放到ResultSet对象中,结果集
ResultSet rs = stat.executeQuery(sql);
//获取这个表有几个字段,元数据(描述数据的数据)
int cols = rs.getMetaData().getColumnCount();
System.out.println("表的列数:" + cols);
//展示表的字段名称
//索引值是从1开始(数据库要求)
for(int i=1;i<=cols;i++){
//"\t"代表转义,代表tab键,多个空格
System.out.print(rs.getMetaData().getColumnName(i) + "\t");
}
System.out.println();//换行
//展示数据,行数while循环,next()取下一条记录,如果没有,循环就结束
//next()有记录就返回ture,如果到最后面了,就返回false
while (rs.next()){
for (int i = 1; i <= cols; i++) {
//获取他的字段内容
System.out.print(rs.getString(i)+"\t");
}
System.out.println(); //换行
}
}
}
SQLインジェクション:
sqlには脆弱性があり、攻撃されてデータ漏洩を引き起こす可能性があります== SQLがスプライスされるか==
public class SQL注入 {
public static void main(String[] args) {
login("root","123456");//正常登陆
//SQL注入
login("' or '1=1","123456");
}
public static void login(String name,String password){
Connection conn =null;
Statement st = null;
ResultSet rs =null;
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai&characterEncoding=UTF8";
String username = "root";
String password = "root";
Class.forName(driver);
Connection cn = DriverManager.getConnection(url, username, password);
Statement stat = cn.createStatement();
String sql = "select * from users where `NAME`='"+ name +"' AND `PASSWORD`='"+ password +"'" ;
ResultSet resultSet = statement.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getString("NAME"));
}
//6. 释放连接
resultSet.close();
statement.close();
connection.close();//耗资源
}
}
PreparedStatementオブジェクト
PreparedStatementは、SQLインジェクションを防ぐことができ、より効率的です。
lSQLインジェクションを防ぐためのPreparedStatementの本質は、渡されたパラメーターを文字として扱うことです。
'などのエスケープ文字があると仮定すると、直接エスケープされます。
新增
删除
查询
//区别
//使用问好占位符代替参数
String sql = "insert into users(id,`NAME`) values(?,?)";
pstm = connection.prepareStatement(sql);//预编译sql,先写sql然后不执行
//手动给参数赋值
pstm.setInt(1,4);//id
pstm.setString(2,"qingfeng");
pstm.setString(2,"1043051018");
pstm.setString(2,"[email protected]");
//注意点:
//sql.Date 数据库 java.sqL.Date()
//util.Date Java new Date().getTime()获得时问激
st.setDate( parameterlndex: 5,new java.sql.Date(new Date( ).getTime()));
//执行
int i = pstm.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
IDEAを使用してデータベースに接続します
データベースを選択してください
データベースに接続して、
表示するデータベースを選択します