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;
}
}