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 
javaBean
public 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);
}