版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40998254/article/details/84591592
在上一篇用IDEA进行Java后台开发(三)中通过C3P0和dbUtils已经实现了mySql的连接和简单的数据查询,本篇主要学习一下DBUtils的QueryRunner实现数据库增删改查。
首先感谢一下https://blog.csdn.net/a911711054/article/details/77719685这篇博客的作者,写的真的很详细,万分感谢!
下面以上一篇的user表为操作表,写了一个数据库操作类UserBeanDao,如下:
package com.xiaoxiao9575.servletdemo.dao.impl;
import com.xiaoxiao9575.servletdemo.dao.UserBeanDao;
import com.xiaoxiao9575.servletdemo.entities.UserBean;
import com.xiaoxiao9575.servletdemo.utils.JDBCUtils;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
public class UserBeanDaoImpl implements UserBeanDao {
private static Connection con;
private static UserBeanDaoImpl instance;
public static UserBeanDaoImpl getInstance() throws SQLException {
if(instance == null){
instance = new UserBeanDaoImpl();
}
if (con == null){
con = JDBCUtils.getConnection();
}
return instance;
}
/**
* 删除
* 删除user表中的指定对象
*/
public boolean delete(String userName)throws SQLException {
//创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
//写删除的SQL语句
String sql = "DELETE FROM user WHERE usrId=?";
//调用QueryRunner方法update
int row = qr.update(con, sql, userName);
DbUtils.closeQuietly(con);
//row>0代表成功
return row>0;
}
/**
* 修改
* 定义方法,使用QueryRunner类的方法update将数据表的数据修改
*/
public boolean update(UserBean userBean)throws SQLException{
//创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
//写修改数据的SQL语句
String sql = "UPDATE user SET userName=?,userPhone=?,userPwd=? WHERE userId=?";
//定义Object数组,存储?中的参数
Object[] params = {userBean.getUserName(),userBean.getUserPhone(),userBean.getUserPwd(),userBean.getUserId()};
//调用QueryRunner方法update
int row = qr.update(con, sql, params);
System.out.println(row);
DbUtils.closeQuietly(con);
//row>0代表成功
return row>0;
}
/**
* 添加
* 定义方法,使用QueryRunner类的方法update向数据表中,添加数据
*/
public boolean insert(UserBean userBean)throws SQLException{
//创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
String sql = "INSERT INTO user (userName,userPhone,userPwd)VALUES(?,?,?)";
//将三个?占位符的实际参数,写在数组中
Object[] params = {userBean.getUserName(),userBean.getUserPhone(),userBean.getUserPwd()};
//调用QueryRunner类的方法update执行SQL语句
int row = qr.update(con, sql, params);
System.out.println(row);
DbUtils.closeQuietly(con);
//row>0代表成功
return row>0;
}
/**
* 查询,BeanHandler
* 将结果集的第一行数据,封装为JavaBean对象
* 注意:被封装成数据到JavaBean对象,Sort类必须有空参构造
* @throws SQLException
* */
public UserBean getSingleBean() throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用方法,传递结果集实现BeanHandler
//BeanHandler(Class<T> type)
UserBean userBean = qr.query(con, sql,new BeanHandler<>(UserBean.class));
return userBean;
}
@Override
public UserBean getUserBeanFromUserName(String userName) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user where userName=?";
//调用方法,传递结果集实现BeanHandler
//BeanHandler(Class<T> type)
UserBean userBean = qr.query(con, sql,new BeanHandler<>(UserBean.class), userName);
return userBean;
}
/**
* 查询,BeanListHandler
* 将数据结果集的每一行数据,封装为JavaBean对象
* 多个JavaBean对象封装到List集合中
* @throws SQLException
* */
public List<UserBean> getBeanList() throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用方法传递结果集的实现类BeanListHandler
//BeanListHandler(Class<T> type)
List<UserBean> list = qr.query(con, sql, new BeanListHandler<>(UserBean.class));
return list;
}
/**
* 查询,ScalarHandler
* 对于查询后,只有一个结果
* @throws SQLException
* */
public long getBeansCount() throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT COUNT(*) FROM user";
//调用方法query,传递结果集处理类ScalarHandler
long count = qr.query(con,sql,new ScalarHandler<Long>());
return count;
}
/**
* 查询,ArrayHandler
* 将结果第一行存储到对象数组中Object[]
* @throws SQLException
* */
public Object[] getObjectArray() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用query执行查询,传递连接对象,SQL语句,结果集处理方式的实现类
//返回对象数组
Object[] result = qr.query(con, sql,new ArrayHandler());
return result;
}
/**
* 查询,ArrayListHandler
* 将结果集的每一行,封装到对象数组中,出现很多对象数组
* 对象数组存储到List集合
* @throws SQLException
* */
public List<Object[]> arrayListHandler() throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用query方法,结果集处理的参数上,传递实现类ArrayListHandler
//方法返回值 每行是一个数组
List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
return result;
}
/**
* 查询,ColumnListHandler
* 结果集,指定列的数据,存储到List集合中
* List<Object> 每个列数据类型不同
* @throws SQLException
* */
public List<Object> columnListHandler(String columnName) throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用方法query,传递结果集实现类ColumnListHandler
//实现类构造方法,使用字符串的列名
List<Object> list = qr.query(con, sql, new ColumnListHandler<>(columnName));
return list;
}
/**
* 查询,MapHandler
* 将结果集第一行数据,封装到Map集合中
* Map<键,值> 键:列名 值:这列数据
* @throws SQLException
* */
public Map<String, Object> mapHandler() throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用方法query,传递结果集实现类MapHandler
//返回值:Map集合,Map接口实现类 泛型
Map<String,Object> map = qr.query(con, sql,new MapHandler());
return map;
}
/**
* 查询,MapListHandler
* 将结果集每一行存储到Map集合,键:列名 值:数据
* Map集合过多,存储到List集合
* @throws SQLException
* */
public List<Map<String, Object>> mapListHandler() throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user";
//调用方法query,传递结果集实现类MapListHander
//返回值List集合,存储的是Map集合
List<Map<String, Object>> list = qr.query(con, sql,new MapListHandler());
return list;
}
}
由于代码中注释写的很详细了,所以这里对代码不说过多的废话了。可以看出dbUtils对数据库操作都需要用一个Handler对象,上述代码只是举个例子,所以所用到的Handler都是dbUtils的jar包中有的,实际开发中可能还需要自定义,举个简单例子:
package com.xiaoxiao9575.servletdemo.handler;
import com.xiaoxiao9575.servletdemo.entities.UserBean;
import org.apache.commons.dbutils.ResultSetHandler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserHandler implements ResultSetHandler<List<UserBean>> {
@Override
public List<UserBean> handle(ResultSet rs) throws SQLException {
//封装数据,数据从Resultset中获取
ArrayList<UserBean> list = new ArrayList<UserBean>();
while(rs.next()){
UserBean user = new UserBean();
user.setUserId(rs.getInt("userId"));
user.setUserName(rs.getString("userName"));
user.setUserPhone(rs.getString("userPhone"));
user.setUserPwd(rs.getString("userPwd"));
list.add(user);
}
return list;
}
}
通过上面的Handler就可以直接拿到所需对象的集合了。
最后补充一个以前没有用到的知识点:
interface可以继承interface,并且可以继承多个interface,以前一直以为extends只能继承一个父类,看来是我太无知了,别问我我的java是不是体育老师教得。举个例子:
public interface UserBeanDao extends BaseDao1<UserBean> , BaseDao2<UserBean>, BaseDao3<UserBean>{}
上述代码是正确的!不过如果不是接口而是类的话就不能多继承了,下面的代码就是错的
public class SonClass extends FatherClass1, FatherClass2 {}//常识,错的,不要这样写,一个孩子只能有一个亲爹