JDBCパッケージ関連ツール

クリエイティブコモンズライセンス 著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ

ツールのJDBC、その後、ジェネリック医薬品のパッケージがある場合教えて先生の前に網易クラウド教室を見て、反射がないだけで、最近非常に理解し、自分自身についての一般的な、ブラッシュアップ反映して、意図がする再書き込み、私の印象を上げています

、JDBC接続ツール(MySQLの例)

それぞれJDBC接続が必要ないくつかのパラメータに対応する、データの4行を定義db.propertiesプロファイルのルート項目のプロパティを作成する1は、(注:ハッシュテーブルのプロパティ底を、プロファイル「=」前これは)対応するキーに対応する代表値の後、地図のキーを表します

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc_db?rewriteBatchedStatements=true
username=root
password=123456

2、JDBC接続ツール

/**
 * JDBC工具类
 * @Author: fangju
 * @Date: 2019/6/15 
 */
public class JDBCUtil {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    //静态代码块,在程序编译的时候执行
    static {
        try {
            //创建Properties对象
            Properties p = new Properties();
            //获取文件输入流
            InputStream in = new FileInputStream("db.properties");
            //加载输入流
            p.load(in);
            //获取数据库连接驱动名字
            driver = p.getProperty("driverClassName",null);
            //获取数据库连接地址
            url = p.getProperty("url",null);
            //获取数据库连接用户名
            username = p.getProperty("username",null);
            //获取数据库连接密码
            password = p.getProperty("password",null);
            if(driver != null && url != null
                    && username != null && password != null){
                //加载驱动
                Class.forName(driver);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接对象
     * @return Connection连接对象
     */
    public static Connection getConn(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭连接(Connection连接对象必须在最后关闭)
     * @param conn Connection连接对象
     * @param st 编译执行对象
     * @param rs 结果集
     */
    public static void close(Connection conn, Statement st, ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
            if(st != null){
                st.close();
            }
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

第二に、ツールのCRUD

1.カプセル化しなければならない理由

(1)あなたは、データベース操作を実行するたびに、あなたは最初にデータベース接続オブジェクト(接続)を取得する必要があり、その後、プリコンパイルされた実行文(のprepareStatement)を取得し、結果セット(ResultSetを)得るために必要なクエリ時間、基本的には業務のちょうどシリーズでありますSQL文の差、パッケージのこの部分は、であってもよいために
)のexecuteUpdate()、のexecuteQuery差((2)私たちの一般的な方法一般的に使用されるデータベース操作の実行()を次のように、いくつかの方法があります

メソッド名 効果
実行 あなたはCRUDすることができます
executeUpdate 追加と削除はできますが、照会することはできません。
executeQuery のみ照会することができます

したがって、私たちのプロセス2、1として定義することができるツールが1を照会するために使用され、CRUD操作のためにあります

2、CRUDツールパッケージ

通常の状況下で、我々は、テーブル名、フィールド名と同じテーブルの列名と同じJavaBeanクラス名を定義し、その結果は非常に簡単の値を設定します。

CRUDツール

/**
 * 增删改查工具类
 * @Author: fangju
 * @Date: 2019/6/15
 */
public class CRUDTemplate {
    /**
     * 增删改操作
     * @param sql 传入的SQL语句
     * @param params 可变参数
     * @return 操作结果
     */
    public static int executeUpdate(String sql,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        int result = 0;
        try {
            //获取数据库连接对象
            conn = JDBCUtil.getConn();
            //获取预编译语句对象
            psmt = conn.prepareStatement(sql);
            //给预编译语句赋值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //执行SQL语句获取执行结果
            result = psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭数据库连接
            JDBCUtil.close(conn,psmt,null);
        }
        return result;
    }

    /**
     * 查询操作
     * @param sql SQL语句
     * @param handler 判断查询一个还是多个
     * @param params 可变参数
     * @param <T> 具体操作的实体类
     * @return 返回IResultSetHandler接口中的泛型
     */
    public static <T> T executeQuery(String sql, IResultSetHandler<T> handler,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            //获取数据库连接对象
            conn = JDBCUtil.getConn();
            //获取预编译语句对象
            psmt = conn.prepareStatement(sql);
            //给预编译语句赋值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //执行SQL语句获取结果集
            rs = psmt.executeQuery();
            //处理结果集
            return handler.handle(rs);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭数据库连接
            JDBCUtil.close(conn,psmt,rs);
        }
        return null;
    }
}

クエリはまた、JavaBeanのコレクションを返すことがJavaBeanオブジェクトを返すことが、私たちはインタフェースを定義することができるために、このインタフェースは、具体的には、この方法は、一般的なパラメータのインターフェースを返し、結果セットを扱うユーザーによって定義されたものを特定戻ります。

/**
 * 把JDBC返回的结果集封装成特定类型
 * @Author: fangju
 * @Date: 2019/6/15
 */
public interface IResultSetHandler<T> {
    T handle(ResultSet rs) throws Exception;
}

IResultSetHandler特定のカテゴリ

/**
 * 返回一个JavaBean
 * @Author: fangju
 * @Date: 2019/6/15
 */
public class BeanHandler<T> implements IResultSetHandler<T> {
    private Class<T> clazz;

    public BeanHandler(Class<T> clazz){
        this.clazz = clazz;
    }

    @Override
    public T handle(ResultSet rs) throws Exception{
        //结果集默认指向为第一个数据的前一个
        if (rs.next()){
            //根据传入的字节码创建传入的指定对象
            T obj = clazz.newInstance();
            //获取指定字节码信息
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
            //获取所有属性描述器
            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor pd:pds){
                //获取结果集中对应字段名的值
                Object o = rs.getObject(pd.getName());
                //执行当前方法并传入参数
                pd.getWriteMethod().invoke(obj,o);
            }
            return obj;
        }
        return null;
    }
}
/**
 * 返回一个JavaBean的集合
 * @Author: fangju
 * @Date: 2019/6/15 17:31
 */
public class BeanListHandler<T> implements IResultSetHandler<List<T>> {
    private Class<T> clazz;

    public BeanListHandler(Class<T> clazz){
        this.clazz = clazz;
    }

    @Override
    public List<T> handle(ResultSet rs) throws Exception {
        //获取指定字节码信息
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
        //获取所有属性描述器
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        List<T> list = new ArrayList<>();
        while (rs.next()){
            T obj = clazz.newInstance();
            for (PropertyDescriptor pd:pds){
                //获取结果集中对应字段名的值
                Object o = rs.getObject(pd.getName());
                //执行当前方法并传入参数
                pd.getWriteMethod().invoke(obj,o);
            }
            list.add(obj);
        }
        return list;
    }
}

3、試験

学生の場合

/**
 * @Author: fangju
 * @Date: 2019/6/15 
 */
public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/qq_40833790/article/details/92164828
おすすめ