JDBCの詳細

1. JDBCを使用する理由
データは永続化する必要があるため、データを永続化する最良の方法は、データをデータベースに保存することであり、JavaはJDBCを使用してデータをデータに保存する必要があります。

2.データベースに永続化される唯一のテクノロジーはJDBCです。他のすべてのフレームワークの最下層はJDBCです。

3. JDBCとは何ですか?
JDBC(Javaデータベース接続、Javaデータベース接続):
SQLステートメント(DML、DDL、DQL)を実行するために使用されるJava APIであり、さまざまなリレーショナルデータベース(oracle、mysql、SQLサーバー)への統合アクセスを提供できます。 Java言語で記述されたクラスとインターフェースのセット。JDBCは、データベース開発者がデータベースアプリケーションを作成できるように、より高度なツールとインターフェイスを構築できるベンチマークを提供します。

4.結論:将来どのようなデータベースを使用する場合でも、このデータベースによって提供されるjdbc実装jarパッケージ(mysql:mysql-connector-java-5.1.7-bin.jarなど)をインポートする必要があります。

5. JDBCの使用手順:追加(ドライバーのロード)、接続(データベースへの接続)、事前(事前コンパイル済みオブジェクトの取得)、実行(SQLの実行)、解放(接続の解放)

	//添加示例
	public void testAdd() throws ClassNotFoundException, SQLException {
    
    
		//1.注册驱动[反射机制:jvm 拿到Mysql已经写好的驱动类] 
		Class.forName("com.mysql.jdbc.Driver");
		//2.获得连接对象
		//url可简写为jdbc:mysql:///数据库名
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "用户名", "密码");
		//3.获得预编译对象,准备执行Sql
		Statement statement = conn.createStatement();
		//4执行Sql 
		String sql = "insert into user(name,sex,phoneNum) value ('孙孙',false,'666')";
		System.out.println(sql);
		statement.execute(sql);//执行sql语句
		//5.释放资源
		statement.close();//关闭  
		conn.close();
	}

6. ResultSet:クエリによって返されたデータを保存します
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

7. PreparedStatementとcreateStatementの違い
(1)ステートメントオブジェクトを作成するとき、ステートメントはsqlで渡す必要はありませんが、PreparedStatementは準備済みステートメントであり、sqlで渡す必要があります。この時点で、データベースはsqlステートメントを受け取り、コンパイルされています(使用?パラメーターは単一の場所を占めるため、プレースホルダーと呼ばれます)、パラメーターが動作するのを待っているため、createStatementよりも高速です;
(2)したがって、sqlステートメントを実行するときは、Statementをsqlで渡す必要があり、PreparedStatementがsqlステートメントを実行しているときは、 sqlを渡す必要はありません;
(3)PreparedStatementはプレースホルダーを使用して値を割り当てます(ps.setObject(index、value))、およびcreateStatementはスプライシングを介して
(4)したがって、PreparedStatementは安全で、createStatementは安全ではない(ユニバーサルパスワード: 'or 1 = 1 or')、SQLインジェクション
(5)接続があります:PreparedStatementはStatementのサブインターフェースです

8. Daoレイヤー抽出ツール:1つのメソッドの追加、削除、チェック、変更

	public List<User> execute(String sql, Object... arr) {
    
    
		ArrayList<User> userList = new ArrayList<User>();
		Connection connection = null;
		PreparedStatement ps =null;
		try {
    
    
			connection = DBCPUtil2.getConnection();
			ps = connection.prepareStatement(sql);
			
			for (int i = 0; i < arr.length; i++) 
				ps.setObject(i+1, arr[i]);
			
			if (sql.contains("select")) {
    
    //是select,获取结果集,放到集合里,返回集合
				ResultSet eq = ps.executeQuery();
				while (eq.next()) {
    
    
					userList.add(new User(eq.getInt("id"), eq.getString("name"), eq.getBoolean("sex"), eq.getString("phoneNum"), eq.getString("pwd")));
				}
				return userList;
			} 
			ps.execute();//是DML操作,执行即可,最后返回null
		} catch (SQLException e) {
    
    
			e.printStackTrace();
		}
		return null;
	}

9.トランザクション:
データをある状態から別の状態に変換する論理演算ユニットのグループを指します
ACID属性:原子、一貫性、分離、および耐久性

	/**
	*	转账示例
	*/
	public void testTransaction() {
    
    
		Connection conn = null;
		Statement cs =null;
		try {
    
    
			conn = JDBCUtil.getConnection();//一个连接就是一个事务
			conn.setAutoCommit(false);//事务默认是自动提交,所以设置为手动提交
			
			cs = conn.createStatement();
			
			String sql="update user set money=money-10 where name=shp";//转钱:转方
			cs.execute(sql);
			
			System.out.println(1/0);//模仿异常发生
			
			sql="update user set money=money+10 where name=heping";//转钱:收方
			cs.execute(sql);
			
			conn.commit();//在操作完成后提交事务
		} catch (Exception e) {
    
    
			try {
    
    
				conn.rollback();//发生异常就事务回滚
			} catch (SQLException e1) {
    
    
				e1.printStackTrace();
			}
		}finally {
    
    
			JDBCUtil.close(conn, cs, null);
		}
	}

10.データベース構成情報のハードコーディング問題を解決し、DHCPを介して接続プールを実現し、リソースファイルを解析する
ガイドパッケージcommons-dbcp-1.3.jarおよびcommons-pool-1.5.6.jar
(1)接続プール

public class DBCPUtil {
    
    
	static Properties properties = new Properties();
	
	static BasicDataSource bds = new BasicDataSource();//BasicDataSource
	static{
    
    
		try(
			InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		) {
    
    
			properties.load(is);//解析资源文件,解决硬编码问题
			
			bds.setDriverClassName(properties.getProperty("driverClassName"));
			bds.setUrl(properties.getProperty("url"));
			bds.setUsername(properties.getProperty("username"));
			bds.setPassword(properties.getProperty("password"));
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
    
    
		try {
    
    
			return bds.getConnection();//向连接池获取连接
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		return null;
	}
}

(2)工場モデル

public class DBCPUtil2 {
    
    
	static Properties properties = new Properties();
	
	static DataSource bds;
	static{
    
    
		try(
			InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		) {
    
    
			properties.load(is);//解析资源文件,解决硬编码问题
			
			//工厂已定义好字段名,所以想要正确获取,就应该在配置文件中的配置参数写对应的名字
			bds=BasicDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
    
    
		try {
    
    
			return bds.getConnection();//向连接池获取连接
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		return null;
	}
}

おすすめ

転載: blog.csdn.net/ExceptionCoder/article/details/108294259