JDBC -(06)BaseDao工具类封装
基本上每一个数据表都应该有一个对应的DAO接口及其实现方法,发现对所有表的操作(增删改查)代码重复度很高,所以可以提取公共代码,给这些DAO的实现类可以抽取一个公共的实现类,我们称为BaseDao
插入操作:
修改操作:
删除操作:
查询操作:
1. BaseDao工具类封装
BaseDao.java
package com.julissa.api.utils;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 基于JDBC工具类JdbcUtilsV2基础上进行Dao层的封装
*
* 两个方法:
* 增删改的通用方法 调用方法 BaseDao.executeUpdate(sql,params,...)
* 查询的通用方法 调用方法 BaseDao.executeQuery(sql,params,...) 或者BaseDao.executeQuery(sql)
*
*/
public class BaseDao {
/**
* 增删改通用方法
* @param sql 带占位符的SQL语句
* @param params 占位符的值,传入占位符的值顺序与占位符位置顺序一致
* @return 返回结果影响行数的值
*/
public static int executeUpdate(String sql,Object... params) throws SQLException {
//获取数据库连接
Connection connection = JdbcUtilsV2.getConnection();
//创建prepareStatemet对象并传入sql语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给动态值设置值
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i+1,params[i]);
}
//执行sql语句,并获取返回结果
int row = preparedStatement.executeUpdate();
//关闭资源
preparedStatement.close();
//是否回收连接,考虑是不是事务
if(connection.getAutoCommit()){
//没有开始事务.正常回收连接
JdbcUtilsV2.recycleConnection();
}
//返回影响行数
return row;
}
/**
* 查询的通用方法
* @param sql 查询的SQL语句,可以是带占位符,也可以不带
* @param params 传入带占位符SQL语句时占位符的值,传入占位符的值顺序与占位符位置顺序一致
* @return 返回值类型是一个List<Map>类型的数据
* @throws SQLException
*/
public static List<Map> executeQuery(String sql, Object... params) throws SQLException {
//获取数据库连接
Connection connection = JdbcUtilsV2.getConnection();
//创建prepareStatemet对象并传入sql语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给动态值设置值
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i+1,params[i]);
}
//执行sql语句,并获取返回结果
ResultSet resultSet = preparedStatement.executeQuery();
//解析结果集,将结果集中的数据封装到一个List<Map>集合中
List<Map> list = new ArrayList<>();
//获取列的信息对象
//TODO:metaData装的当前结果集列的对象,(可以根据列的下表获取列的名称,获取列的数量)
ResultSetMetaData metaData = resultSet.getMetaData();
//获取列的数量
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
Map<String,Object> map = new HashMap<>();
//自动遍历列,从1开始
for (int i = 1; i <= columnCount; i++) {
//根据指定下标获取值
Object value = resultSet.getObject(i);
//获取指定列的名称
//getColumnLabel:会获取别名,如果没有再获取列名
String key = metaData.getColumnLabel(i);
map.put(key,value);
}
list.add(map);
}
//关闭资源
resultSet.close();
preparedStatement.close();
//是否回收连接,考虑是不是事务
if(connection.getAutoCommit()){
//没有开始事务.正常回收连接
JdbcUtilsV2.recycleConnection();
}
//返回
return list;
}
}
2. 测试
2.1 测试插入操作
@Test
public void testInsert() throws Exception {
/**
* 向t_user表插入一条数据
* account test4
* password test4
* nickname 测试人员4
*/
String account = "test4";
String password = "test4";
String nickname = "测试人员4";
//编写sql
String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
//调用BaseDao中的方法,返回影响行数
int row = BaseDao.executeUpdate(sql, account, password, nickname);
//判读是否插入成功 1成功
if(row != 1) {
System.out.println("插入数据失败");
}else {
System.out.println("插入数据成功");
}
}
执行结果:
2.2 测试修改操作
@Test
public void testUpdate() throws Exception {
/**
* 修改t_user表中test4用户的密码
* account test4
* password test123
**/
String account = "test4";
String password = "test123";
//编写sql
String sql = "update t_user set password=? where account=?";
int i = BaseDao.executeUpdate(sql, password, account);
//判读是否修改成功 1成功
if(i != 1) {
System.out.println("修改数据失败");
}else {
System.out.println("修改数据成功");
}
}
执行结果:
2.3 测试删除操作
@Test
public void testDelete() throws Exception {
/**
* 删除t_user表中id为3658的用户信息
* id 3658
*/
String id = "3658";
//编写sql
String sql = "delete from t_user where id=?";
int i = BaseDao.executeUpdate(sql, id);
//判读是否插入成功 1
if(i != 1) {
System.out.println("删除数据失败");
}else {
System.out.println("删除数据成功");
}
}
执行结果:
2.4 测试查询操作
查询所有用户信息
@Test
public void testSelect() throws Exception {
/**
*
* 查询t_user表中所有的信息
*/
//编写sql
String sql = "select id,account,password,nickname from t_user";
//调用BaseDao中的executeQuery,返回一个结果集
List<Map> list = BaseDao.executeQuery(sql);
//遍历集合
for (Map map:
list) {
System.out.println(map);
}
}
执行结果:
查询用户id为2的用户信息
@Test
public void testSelect2() throws Exception {
/**
*
* 查询t_user表中id为2的用户信息
*/
//编写sql
String sql = "select id,account,password,nickname from t_user where id = ?";
//调用BaseDao中的executeQuery,返回一个结果集
List<Map> list = BaseDao.executeQuery(sql,2);
//遍历集合
for (Map map:
list) {
System.out.println(map);
}
}
执行结果: