JDBCカスタムフレーム
使用する接続池:druid-1.0.90.jar Druidはアリババが開発した防犯用データベース接続池で、Druidは現在最高のデータベース接続池です。機能、性能、拡張性については、他のデータベース接続池を超えており、ログ監視を加えてDBプール接続とSQLの実行状況をよく監視することができます。Druidダウンロードアドレス:https://github.com/alibaba/druid 前書きのJdbcUtils類
package com.example.jdbcUtils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
* :
* jdbc
*/
public class JdbcUtils {
private static DataSource dataSource;
static {
try {
// src druid
InputStream is = JdbcUtils.class.getResourceAsStream("/druid.properties");
Properties properties = new Properties();
properties.load(is);
dataSource= DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection(){
//
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void close(Connection connection,PreparedStatement preparedStatement){
close(connection,preparedStatement,null);
}
public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
//
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
分析:フレームを実現するには、2つのカテゴリの1に分けられます。添削2.検索は簡単に添削機能を実現します。private DataSource dataSource;
//
public JdbcTemplet(DataSource dataSource) {
this.dataSource=dataSource;
}
public int Update(String sql,Object...params) {
Connection connection = null;
PreparedStatement pstm=null;
try {
connection = dataSource.getConnection();
pstm = connection.prepareStatement(sql);
// sql
ParameterMetaData parameterMetaData = pstm.getParameterMetaData();
int parameterCount = parameterMetaData.getParameterCount();
//
if (parameterCount != params.length) {
throw new RuntimeException(" SQL ");
}
//
for (int i = 0; i < parameterCount; i++) {
pstm.setObject(i + 1, params[i]);
}
// int
return pstm.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
//
JdbcUtils.close(connection,pstm);
}
}
テスト:@Test
public void test(){
DataSource dataSource = JdbcUtils.getDataSource();
JdbcTemplet jdbcTemplet = new JdbcTemplet(dataSource);
jdbcTemplet.Update("update product set price=10000 where pid=?", 1);
}
クエリ機能は複雑です。以下のように実現します。public Object query(String sql,ResultSetHandler handler, Object...params){
Connection connection=null;
PreparedStatement pstm=null;
ResultSet resultSet=null;
try {
connection= dataSource.getConnection();
pstm =connection.prepareStatement(sql);
// sql
ParameterMetaData parameterMetaData = pstm.getParameterMetaData();
int parameterCount = parameterMetaData.getParameterCount();
//
if(parameterCount!=params.length){
throw new RuntimeException(" SQL ");
}
//
for (int i = 0; i
Result SetHandlerインターフェースpublic interface ResultSetHandler {
Object handle(ResultSet rs);
}
パッケージ化対象のプロセッサを作成します。**public class BeanHandler implements ResultSetHandler {
private Class clazz;
//
public BeanHandler(Class clazz){
this.clazz=clazz;
}
@Override
public Object handle(ResultSet rs) {
try {
if (!rs.next()){
return null;
}
Object bean = clazz.newInstance();//
// bean
// : JavaBean
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//
for (int i = 0; i
javaBeanpublic class Product {
private int pid;
private String pname;
private double price;
@Override
public String toString() {
return "Product{" +
"pid=" + pid +
", pname='" + pname + '\'' +
", price=" + price +
'}';
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Product() {
}
}
テスト:@Test
public void test4() {
DataSource dataSource = JdbcUtils.getDataSource();
JdbcTemplet jdbcTemplet = new JdbcTemplet(dataSource);
Object query = jdbcTemplet.query("select * from product where pid=?", new BeanHandler(Product.class), 2);
System.out.println(query);
}
複数の記録をカプセル化したプロセッサ原理は、上述したように、戻ってきたbeanオブジェクトをLISTセットに追加して返す。public class BeanListHandler implements ResultSetHandler {
private Class clazz;
public BeanListHandler(Class clazz) {
this.clazz = clazz;
}
@Override
public Object handle(ResultSet rs) {
try {
List list = new ArrayList<>();
while (rs.next()) {
System.out.println();
Object bean = clazz.newInstance();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
for (int i = 0; i < count; i++) {
String columnName = rsmd.getColumnName(i + 1);
Object columnData = rs.getObject(i + 1);
System.out.println(columnName + columnData);
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(bean, columnData);
}
list.add(bean);
}
return list;
} catch (Exception e) {
throw new RuntimeException(" , bean ",e);
}
}
}
テスト@Test
public void test5() {
DataSource dataSource = JdbcUtils.getDataSource();
JdbcTemplet jdbcTemplet = new JdbcTemplet(dataSource);
Object query = jdbcTemplet.query("select * from product", new BeanListHandler(Product.class));
System.out.println(query);
}