コンセプト
データベース接続のJava Javaデータベース接続
定義リレーショナルデータベース操作のすべてのルール(インターフェイス)、別のデータベースベンダが異なるユーザのみ統一データベースインタフェースの操作を使用する必要があるように、これらのクラスは、データベース駆動型と呼ばれ、書き込みクラスにこれらのインタフェースを実装します
はじめに
public void test(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
//1.导入驱动jar包,如mysql-connector-java-5.1.37-bin.jar
// 新建目录,复制jar包,将存放jar包的目录右键选择add as library
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象 Connection
conn = DriverManager.getConnection("jdbc:mysql//localhost:3306/dbName,root,1234");
//4.定义sql语句
String sql = "select * from account";
//5.获取执行sql语句的对象Statement,实际开发用PreparedStatement
stmt = conn.createStatement();
//6.执行sql,接收返回结果
rs = stmt.executeQuery(sql);
//7.处理结果
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString("name");
System.out.println(id + " " + name);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
//释放资源
if(rs != null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(stmt != null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
成分分析
DriverManagerの:ドライバの管理オブジェクト
登録ドライブ、5.0バージョンが自動的に許可省略登録されている登録することができます
Class.forNameの(「はcom.mysql.jdbc.Driver」);実際の静的コード・ブロックは静的な無効なregisterDriver(ドライバのドライバ)を呼び出して、(使用するデータベースドライバプログラムを伝える)ドライバを登録します
データベース接続
静的接続のgetConnection(文字列のURL、文字列のユーザー、文字列のパスワード)。
URL:マシンが接続され、ポートがmysqlの3306かどうかを指定します独自の接続のためのパスは、URLがのように記述することができる「JDBCます。mysql /// DBNAME」
接続:データベース接続オブジェクト
実行SQLのオブジェクトを取得します。
ステートメントのcreateStatement();
PreparedStatementのprepareStatement(文字列のSQL)。
管理
オープントランザクション:にsetAutoCommit(ブール値はautoCommit);パラメータをfalseに設定開いています
トランザクションをコミットします。コミット();
トランザクションをロールバック:ロールバックを();
ステートメント:(与えられたパラメータを変更することはできない)静的SQLを実行し、リターン結果セットオブジェクト
SQLの実行
ブール(文字列のSQL)を実行し、任意のSQL文を実行(使用しません)
int型のexecuteUpdate(文字列のSQL); DML(INSERT、UPDATE、DELETE)およびDDL(作成、変更、削除)ステートメントを実行し、DDLを使用していない値を返しません。
戻り値:影響を受けた行の数は、成功0より大きい、戻り値成功するかどうかを判定することにより行うことができます
ResultSetののexecuteQuery(文字列のSQL);実行DQL(選択)声明
ResultSetの結果セットオブジェクト
次の():一行下カーソル移動、最初の行の上の最初の行にカーソル
getXXX():XXXは、このようなのgetInt()などのデータ型、表現、データの取得、のgetStringを();
パラメータ:INTは:1から始まる、列番号を表し
文字列:列の名前を表し
試してみる前に宣言のResultSet rsを= NULL;
PreparedStatementの(共通):(与えられたパラメータを変更することはできない)静的SQLを実行し、リターン結果セットオブジェクト
SQLインジェクションの問題:スプライシングSQLは、特別なキーワードSQL参加文字列連結の数が存在する場合には、セキュリティ上のリスクがあります
- ログイン、長い「または」「=」Aと同じパスワード
- SQL:ユーザ名は=「何」とパスワード=「」または「」=「」利用者からの選択*;
- 条件は、すべてのユーザーのクエリ真であります
SQLの問題を解決するための注入:使用してオブジェクトのprepareStatement
プリコンパイルされたSQL:疑問符シンボル点として使用
手順を使用します
String sql = "select * from user where username = ? and password = ?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, username); //参数位置从1开始 pstmt.setString(2, password); rs = pstmt.executeQuery();
PreparedStatementを使用して一般的には、SQLインジェクションを防ぐことができ、より効率的な
カスタムJDBCツール:JDBCUtils
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///dbName
user=root
password=1234
public class JDBCUtils{
private static String driver;
private static String url;
private static String user;
private static String password;
//使用静态代码块读取文件,使得类加载时就读取文件且只读取这一次
static{
try{
//创建Properties集合类
Properties pro = new Properties();
//获取src路径下文件的方式,ClassLoader 类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = ClassLoade.getResource("jdbc.properties");
String path = res.getPath();
//加载文件
pro.load(new FileReader(path));
//读取数据
driver = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
class.forName(driver);
} catch(IOException e){
e.printStackTrace();
} catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public static Connection getConnection(){
return DriverManager.getConnection(url, user, password);
}
public static void close(Statement stmt, Connection conn){
if(rs != null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(stmt != null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
public static void close(Statement stmt, Connection conn, Result rs){
close(stmt, conn);
if(rs != null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
ツールを使用します
public class login(String username, String password){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = JDBCUtils.getConnection();
String sql = "select * from user where username = ? and password = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
return rs.next(); //如果有结果,则返回true
}catch(SQLException e){
e.printStackTrace();
}finally{
JDBCUtils.close(rs, pstmt, conn);
}
}
JDBCトランザクション制御
トランザクションを管理するためのConnectionオブジェクト
オープントランザクション:にsetAutoCommit(ブール値はautoCommit);パラメータをfalseに設定開いています
- 開いているトランザクションのSQLを実行する前に、
トランザクションをコミットします。コミット();
- すべてのSQLを実行している場合、トランザクションをコミット
トランザクションをロールバック:ロールバックを();
- キャッチでトランザクションをロールバックします
接続プーリング
データベース接続プール
- コンセプト:データベース接続プールは、貯蔵容器のデータベース接続で、ときに良いシステムの初期化した後、ウィンドウが作成され、ユーザは、コンテナから完成へのユーザーアクセスを接続オブジェクトを取得するためにデータベースにアクセスする際、コンテナは接続オブジェクトのいくつかのために適用されます、コンテナは、接続オブジェクトを返します。
- 利点:資源の保全、より効率的なユーザー・アクセス
- 実装:のjavax.sql.DataSourceデータベースベンダがインタフェースを実装する、インターフェースを強化するためのgetConnection()メソッドは、close()メソッドへの接続のプールがあり、近くの接続がリターン接続なります
C3P0
インポートジャーパッケージ(2)c3p0-0.9.5.2.jar mchange-コモンズ-javaの-0.2.12.jar
srcディレクトリにC3p0.properties定義されたプロファイルまたはC3P0-config.xmlには(...)dataSource.setXxxをも使用することができるコードに配置
# c3p0.properties c3p0.driverClass=com.mysql.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc c3p0.user=root c3p0.password=java ...
<!-- c3p0-config.xml --> <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <property name="user">root</property> <property name="password">1234</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/dbName</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">3</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">2</property> <property name="maxStatements">200</property> </default-config> <!-- 命名的配置,配置多个config,可以通过相同的配置文件去配置不同的数据源,新建数据源时传入name即可 --> <named-config name="test"> <property name="user">root</property> <property name="password">1234</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/dbName</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <!-- 初始化数据库连接池时连接的数量 --> <property name="initialPoolSize">20</property> <!-- 数据库连接池中的最大的数据库连接数 --> <property name="maxPoolSize">25</property> <!-- 数据库连接池中的最小的数据库连接数 --> <property name="minPoolSize">5</property> </named-config> </c3p0-config>
中核オブジェクト、オブジェクト・データベース接続プールのデータソースDS =新しいComboPooledDataSource()を作成します。
接続を得る:のgetConnection();
ドルイド
JARパッケージドルイド-1.0.9.jarをご紹介
任意のディレクトリにカスタムプロファイル、プロパティの種類、
負荷プロファイル
Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is);
データベース接続プールのオブジェクト、ファクトリクラスによって取得DruidDataSourceFactory
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
接続を得る:のgetConnection();
カスタムツール
public class JDBCUtils{ private static DataSource ds; static{ try{ Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader(). getResourceAsStream("druid.properties");); ds = DruidDataSourceFactory.createDataSource(pro); }catch(IOException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void close(...){...} public static DataSource getDataSource(){return ds;} }
春JDBCTemplate
春のフレームワークJDBCシンプルなパッケージには、簡略化されJDBC-JdbcTemplateを開発するためのオブジェクトが提供され、
手順を使用します
インポートのjarパッケージ
コモンズ・ロギング、春豆、春・コア、春-JDBC、春-TX
データソースに応じて、オブジェクトの作成データソース
JdbcTemplate template = new JdbcTemplate(dataSource);
コールJdbcTemplate CRUD操作を実行する方法
()更新:DMLステートメントを実行します
queryForMap():DQL、結果セットがパッケージ化されたマップのセット、キーフィールド名、フィールド値の値は、パッケージは、エラーが複数あれば検出される記録することができ
queryForList():DQL、パッケージを設定するための結果セットリスト、各レコードマップのパッケージは、マップがリストに格納されています
クエリ():DQL、とJavaBeanのリストに閉鎖して、結果を設定し、
//自定义RowMapper方式(不常用) List<User> list = template.query(sql, new RowMapper<User>{ @Override public User mapRow(ResultSet rs, int i) throws SQLException{ User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; } }); //使用spring提供的RowMapper方式,JavaBean中基本类型用封装类可以避免null错误 List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
queryForObject():DQL、その結果をオブジェクトにカプセル化され、典型的には、パッケージの基本的なタイプは、集約関数を照会するオブジェクト
デモ
public void test(){ JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "update account set balance = 5000 where id = ?"; int count = template.update(sql, 1); //sql后按顺序传参数 System.out.println(count); }