DBHelper
package com.nll.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DBHelper {
//加载驱动一般来说只加载一次
static {
try {
//第一步加载驱动
//mysql5.0+版("com.mysql.cj.jdbc.Driver")8.0+版("com.mysql.cj.jdbc.Driver")
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() {
//第二步 建立连接 我们也封装一下没有为什么 主要是太长了 自己写麻烦
Connection conn=null;
try {
//mysql可以改为"jdbc:mysql://localhost:3306/(数据库名)?allowPublicKeyRetrieval=true&serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8"
conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","scott");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//第三步 写sql语句 对我们来说 sql语句只是预处理语句对象里面的一个参数而已 而且功能不一样 sql语句不一样
//因此 sql语句我们最终也就当做一个参数即可
//增删改 都是同一个方法 executeUpdate 而且返回值也是一样
//所以我们封装的时候 增删改一起封装
public int doUpdate(String sql,Object...params) {
//首先获取连接
Connection conn=getConnection();
//确定一个返回值
int result=-1;
try {
//预处理语句对象
PreparedStatement pstmt=conn.prepareStatement(sql);
//参数呢,会不会有占位符?
//因为不单单是增删改会员参数 我们查询也会有参数所以我们也封装一下
doParams(pstmt,params);
//执行sql语句
result=pstmt.executeUpdate();
closeAll(null,conn,pstmt);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public List<Map<String,String>> findAll(String sql,Object...params) {
List<Map<String,String>> list=new ArrayList<Map<String,String>>();
try {
//首先获取连接
Connection conn=getConnection();
ResultSet resultset=null;
//预处理语句对象
PreparedStatement pstmt=conn.prepareStatement(sql);
//参数呢,会不会有占位符?
//因为不单单是增删改会员参数 我们查询也会有参数所以我们也封装一下
doParams(pstmt,params);
resultset=pstmt.executeQuery();
//如何得到Map的键-》这个sql语句的字段
//首先要通过结果集 得到元数据
ResultSetMetaData rsmd=resultset.getMetaData();
String[] columnNames=new String[rsmd.getColumnCount()];
for (int i = 0; i < columnNames.length; i++) {
//注意我们这里得到的键全都是大写 因此我们改为我们习惯的小写
columnNames[i]=rsmd.getColumnName(i+1).toLowerCase();
}
while(resultset.next()) {
Map<String,String> map=new HashMap<String,String>();
//根据列名来取值
for(String cn:columnNames) {
String value=resultset.getString(cn);
map.put(cn, value);
}
//当一条取完放到list里面去
list.add(map);
}
closeAll(resultset,conn,pstmt);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
private void closeAll(ResultSet rs, Connection conn, PreparedStatement pstmt) {
// TODO Auto-generated method stub
try {
if(rs!=null) {
rs.close();
}
if(conn!=null) {
conn.close();
}
if(pstmt!=null) {
pstmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void doParams(PreparedStatement pstmt, Object...params) {
//先判断 用户没有传参数过来 那我们就不用注入参数
if(params!=null&¶ms.length>0) {
//有参数 我们才注入参数 Object... 量词参数,本质是一个数组
for (int i = 0; i < params.length; i++) {
//万物皆对象
try {
pstmt.setObject(i+1, params[i]);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Test.java
package com.nll.dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Map; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub //测试jdbc的封装 //因为我们不是静态方法 所以先示例化 DBHelper db=new DBHelper(); // //写sql语句不带参数 // String sql1="update autoincre_demo set id=id+1"; // int result1=db.doUpdate(sql1); // if(result1>0) { // System.out.println("修改成功"); // }else { // System.out.println("修改失败"); // } // //写sql语句 (带参数的) // String sql="update autoincre_demo set NAME=?"; // //执行 // int result=db.doUpdate(sql,"海口"); // if(result>0) { // System.out.println("修改成功"); // }else { // System.out.println("修改失败"); // } //查询操作 String sql2="select * from autoincre_demo"; List<Map<String,String>> list=db.findAll(sql2); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).get("name")); } } }