目录
一、我们先看昨天写代码的问题
出现了大量的重复代码 而且还没办法调用
二 、封装
2.1 抽出重复代码 第1、2、5步重复,把这些封装起来
把这些封装成两个方法一个获取连接、一个关闭连接
2.2 抽出公共属性
//连接字符串
private final static String URL = "jdbc:mysql://localhost:3306/dept";
private final static String USER = "root";
private final static String PASSWORD = "123456";
2.3 加载驱动放入static块中,提高性能
//在类加载时就执行且只会执行一次
static {
//1. 加载驱动
//方法的参数是驱动jar包中一个驱动类的全名
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
2.4 获取连接
/**
* 获取连接
* @return conn 连接对象,如果有错误返回null
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USER, PASSWORD);
//没有异常返回连接对象
return conn;
} catch (SQLException exception) {
exception.printStackTrace();
}
//出异常后,还是null
return conn;
}
2.5 释放资源
/**
* 释放资源
* @param rs 结果集
* @param st Statement对象
* @param conn 连接对象
*/
public static void closeAll(ResultSet rs, Statement st,Connection conn){
try {
if(rs != null){
rs.close();
}
if(st != null){
st.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException exception) {
exception.printStackTrace();
}
}
三、通用的更新方法(增删改)方法
3.1 可变参数
//可变参数
public static int sum(int ... a){
//现在这个a是一个数组类型
int sum = 0;
for (int i = 0; i < a.length; i++) {
int e = a[i];
sum += e;
}
return sum;
}
3.2 增删改的方法
/**
* 通用的更新方法
* @param sql 带占位符的SQL语句
* @param objects 占位符的参数
* @return 受影响的行数
*/
public static int update(String sql,Object ... objects){
ResultSet rs = null;
PreparedStatement pst = null;
Connection conn = null;
int rows = 0;
try{
conn = getConnection();
pst = conn.prepareStatement(sql);
//给占位符赋值
if(objects != null && objects.length > 0){
for (int i = 0; i < objects.length; i++) {
Object obj = objects[i];
//i最小0,而占位符最小索引是1
pst.setObject(i+1, obj);
}
}
//执行
rows = pst.executeUpdate();
} catch (Exception e){
e.printStackTrace();
} finally {
closeAll(rs, pst, conn);
}
return rows;
}
四、通过查询 查询唯一一行的记录
/**
* 查询单列的方法
* @param sql
* @param objects
* @return
*/
public static ArrayList<Object> queryForOne(String sql, Object ... objects) {
ResultSet rs=null;
PreparedStatement ps=null;
Connection conn=null;
ArrayList<Object> list = new ArrayList<>();
try {
conn=getConnection();
ps = conn.prepareStatement(sql);
//给占位符赋值
if (objects!=null && objects.length>0){
for (int i = 0; i < objects.length; i++) {
Object obj=objects[i];
//i最小是0 而parameterIndex最小是1
ps.setObject(i+1,obj);
}
}
//执行
rs= ps.executeQuery();
if (rs.next()){
//一行,取列值,取多少列
ResultSetMetaData metaData = rs.getMetaData();
//结果集中列的数量
int columnCount = metaData.getColumnCount();
for (int i = 0; i < columnCount; i++) {
list.add(rs.getObject(i+1));
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(rs,ps,conn);
}
return list;
}
五、通过查询 查询多行记录
/**
* 查询多行的方法
* @param sql
* @param objects
* @return
*/
public static List<ArrayList<Object>> queryForList(String sql, Object ... objects) {
ResultSet rs=null;
PreparedStatement ps=null;
Connection conn=null;
List<ArrayList<Object>> lists = new ArrayList<>();
try {
conn=getConnection();
ps = conn.prepareStatement(sql);
//给占位符赋值
if (objects!=null && objects.length>0){
for (int i = 0; i < objects.length; i++) {
Object obj=objects[i];
//i最小是0 而parameterIndex最小是1
ps.setObject(i+1,obj);
}
}
//执行
rs= ps.executeQuery();
//结果集中有列数,列名
ResultSetMetaData metaData = rs.getMetaData();
//结果集中列的数量
int columnCount = metaData.getColumnCount();
while (rs.next()){
//一行,取列值,取多少列
//每一行创建新的List
ArrayList<Object> list = new ArrayList<>();
for (int i = 0; i < columnCount; i++) {
list.add(rs.getObject(i+1));
}
//把这一行的List值放到大的lists中
lists.add(list);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(rs,ps,conn);
}
return lists;
}
六、通过查询的唯一一行记录返回Map
public static Map<String,Object> queryOneForMap(String sql,Object ... objects){
ResultSet rs = null;
PreparedStatement pst = null;
Connection conn = null;
Map<String,Object> map = new HashMap<>();
try{
conn = getConnection();
pst = conn.prepareStatement(sql);
//给占位符赋值
if(objects != null && objects.length > 0) {
for (int i = 0; i < objects.length; i++) {
Object obj = objects[i];
//i最小0,而parameterIndex最小是1
pst.setObject(i+1, obj);
}
}
//执行
rs = pst.executeQuery();
if(rs.next()){
//一行,取列值。有哪些列,列名是什么?
//描述结果集:结果集中有列数,列名
ResultSetMetaData metaData = rs.getMetaData();
//结果集中的列的数量
int columnCount = metaData.getColumnCount();
for (int i = 0; i < columnCount; i++) {
//获取列名
String columnName = metaData.getColumnName(i + 1);
//map的key是列名,value是列值
map.put(columnName, rs.getObject(columnName));
}
}
} catch (Exception e){
e.printStackTrace();
} finally {
closeAll(rs, pst, conn);
}
return map;
}
七、通用的查询多行记录返回Map List
public static List<Map<String,Object>> queryForMapList(String sql,Object ... objects){
ResultSet rs = null;
PreparedStatement pst = null;
Connection conn = null;
List<Map<String,Object>> mapList = new ArrayList<>();
try{
conn = getConnection();
pst = conn.prepareStatement(sql);
//给占位符赋值
if(objects != null && objects.length > 0) {
for (int i = 0; i < objects.length; i++) {
Object obj = objects[i];
//i最小0,而parameterIndex最小是1
pst.setObject(i+1, obj);
}
}
//执行
rs = pst.executeQuery();
//一行,取列值。有哪些列,列名是什么?
//描述结果集:结果集中有列数,列名
ResultSetMetaData metaData = rs.getMetaData();
//结果集中的列的数量
int columnCount = metaData.getColumnCount();
while(rs.next()){
//为了保存一行
Map<String,Object> rowMap = new HashMap<>();
//遍历所有列
for (int i = 0; i < columnCount; i++) {
//取得一个列名
String columnName = metaData.getColumnName(i + 1);
rowMap.put(columnName, rs.getObject(columnName));
}
mapList.add(rowMap);
}
} catch (Exception e){
e.printStackTrace();
} finally {
closeAll(rs, pst, conn);
}
return mapList;
}