DBアクセス
DBアクセス技術の変遷
※他サイトを参照
java.sqlパッケージの主なインターフェース
ADO.NET仕組
C#
★接続文字列(ADO.NET)
・書き方1:Data Source
Data Source=localhost;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=xxx"
Data Source=.\SQLExpress;Initial Catalog=Northwind;Integrated Security=True
Data Source=.;Initial Catalog=Northwind;Integrated Security=SSPI
Provider=Microsoft.Jet.OLEDB.4.0;Data source=C:\DataSource\mydb.mdb Access用
・書き方2:Server
Server=.\SQLExpress;Database=Northwind;UID=sa;PWD=xxx"
Server=.\SQLExpress;Database=Northwind;Trusted_Connection=True
★App.configとWeb.configでの設定
・方法1:appSettings
<appSettings>
<add key="connStr" value="接続文字列"/>
</appSettings>
取得:System.Configuration.ConfigurationManager.AppSettings["connStr"]
・方法2:connectionStrings
<connectionStrings>
<add name="connStr" connectionString="接続文字列" providerName="System.Data.SqlClient" />
</connectionStrings>
取得:System.Configuration.ConfigurationManager.ConnectionStrings["connStr"]
ADO.NET
SqlConnection System.Data.SqlClient
OleDbConnection System.Data.OleDb
OdbcConnection System.Data.Odbc
OracleConnection System.Data.OracleClinet
using (SqlConnection conn = new SqlConnection(@"接続文字列"))
using (SqlCommand cmd = conn.CreateCommand())
{
// 実行タイプを指定
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "stored_xxx";
// 入出力引数を指定
cmd.Parameters.Add("@tag", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@count", SqlDbType.Int);
cmd.Parameters["@tag"].Value = "aaa";
cmd.Parameters["@count"].Direction = ParameterDirection.Output;
conn.Open();
// ●ExecuteScalar 一行目の一列目を返す SELECT <集計関数>
object result1 = cmd.ExecuteScalar();
// ●ExecuteNonQuery 影響行数を返す UPDATE, INSERT, DELETE
int result2 = cmd.ExecuteNonQuery();
// ●ExecuteReader DataReaderを返す SELECT
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
object id = dr["id"]; // 方法1
//object id = dr.GetValue(0); // 方法2
//object id = dr[0]; // 方法3
object name = dr["name"];
}
}
conn.Close();
// 出力を取得
object output = cmd.Parameters["@count"].Value;
}
Java
★接続文字列(JDBC)
oracle
driverClass oracle.jdbc.driver.OracleDriver
url jdbc:oracle:thin:@//127.0.0.1:1521/XE ServiceName(推薦)
jdbc:oracle:thin@127.0.0.1:1521:dbname SID
jdbc:oracle:thin:@GL TNSName
mysql
driverClass com.mysql.jdbc.Driver org.gjt.mm.mysql.Driver (旧式)
url jdbc:mysql://127.0.0.1:3306/dbname
DB2
driverClass com.ibm.db2.jcc.DB2Driver
url jdbc:db2://127.0.0.1:50000/dbname
sybase
driverClass com.sybase.jdbc.SybDriver
url jdbc:sybase:Tds:127.0.0.1:5007/dbname
PostgreSQL
driverClass org.postgresql.Driver
url jdbc:postgresql://127.0.0.1/dbname
Sql Server2000
driverClass com.microsoft.jdbc.sqlserver.SQLServerDriver
url jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=dbname
Sql Server2005
driverClass com.microsoft.sqlserver.jdbc.SQLServerDriver
url jdbc:sqlserver://127.0.0.1:1433; DatabaseName=dbname
JDBC
Connection conn = null;
Statement stmt = null; // 引数なし
PreparedStatement pStmt = null; // 引数あり
CallableStatement cStmt = null; // ストアド
ResultSet rs = null;
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//書き方1
conn = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=dbname;user=sa;password=1234");
//書き方2(推薦)
conn = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=dbname", "sa", "1234");
conn.setAutoCommit(false);
//●引数なしのSQL文
// 戻り値なし
stmt = conn.createStatement();
stmt.execute("INSERT INTO Table1 ...");
// 戻り値あり
rs = stmt.executeQuery("SELECT * FROM Table1");
while(rs.next()){
String name = rs.getString("Name");
...
}
//●引数ありのSQL文
pStmt = conn.prepareStatement("INSERT INTO book VALUES(?,?)");
pStmt.setString(1, "bookid");
pStmt.setString(2, "bookname");
// 日付の場合
Calendar today = Calendar.getInstance();
java.sql.Date sqlDate = new java.sql.Date(today.getTimeInMillis());
pStmt.setDate(1,sqlDate);
pStmt.executeUpdate();
//●ストアド
cStmt = conn.prepareCall("{?=call stored_xxx(?,?)}");
cStmt.registerOutParameter(1, Types.INTEGER);
cStmt.setString(2, "bookid");
cStmt.setString(3, "bookname");
rs = cStmt.executeQuery();
while(rs.next()){
String id = rs.getString("id"); // 方法1
//String id = rs.getString(2); // 方法2
String name = rs.getString("name");
}
// 出力を取得
int count = cStmt.getInt(1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null && !rs.isClosed()) {
rs.close();
}
if (stmt != null && !stmt.isClosed()) {
stmt.close();
}
if (pStmt != null && !pStmt.isClosed()) {
pStmt.close();
}
if (cStmt != null && !cStmt.isClosed()) {
cStmt.close();
}
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}//try-catch-finally
★注意点:時分秒の欠落
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ResultSet rset = stmt.executeQuery("SELECT SYSDATE FROM DUAL");
rset.next();
String date = sdf.format(rset.getDate("SYSDATE")); // 2012-04-11 00:00:00
環境によってgetDateとgetObjectでは時分秒を取得できないため、getTimestamp()を利用しよう
★Fetch Size
デフォルト(Oracleの場合):10
大量データを取得する際、100に設定
JDBC
pStmt = conn.prepareStatement(
"SELECT * FROM table",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
pStmt.setFetchSize(100);
rs = pStmt.executeQuery();
int cnt = rs.getMetaData().getColumnCount();
Object obj;
while (rs.next()) {
for (int i = 1; i <= cnt; i++) {
obj = rs.getObject(i);
}
}
iBatis
<select id="getAllUser" resultMap="HashMap" fetchSize="100">
select * from table
</select>
Connection Pool
Tomcatの場合
context.xml
<Context>
<Resource
name="jdbc/myoracle"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orclsid"
username="admin"
password="1234"
maxActive="20"
maxIdle="10"
maxWait="-1"/>
</Context>
web.xml
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
try {
//書き方1
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myoracle");
//書き方2
Context ctx2 = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds2 = (DataSource) ctx.lookup("myoracle");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement(ResultSet.CONCUR_READ_ONLY, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM example");
while (rs.next()) {
System.out.println(rs.getString("id"));
}
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}