ツールの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 + '\'' +
'}';
}
}