版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39531549/article/details/82796016
一、增删改通用方法提取
1、通用的crud方法的提取
(1)使用传统方式实现crud操作,实现之后比较如何进行提取
(2)通用的增加修改和删除方法的提取(****)
* 在这些操作里面,不同的部分有两部分
- 第一部分是 ,sql语句不同
- 第二部分是,设置的参数个数或者参数的值不同
- 其他的部分都相同的
* 如何进行提取?
- 首先让sql语句通过参数传递进来
- 其次让参数通过可变参数进行设置(可变参数理解为一个数组)
-- 如果通过可变参数,把值设置进去?
-- 第一步:获取参数的数量 使用参数元数据里面方法进行获取
-- 第二步:设置值,使用方法是setObject设置,setObject(i,数组的下标得到可变参数里面的值)
-代码演示
public class TestAUD {
public static void main(String[] args) {
String sql="insert into user values(?,?,?)";
myTestAUD(sql, 1,"小苍",8787);
String sql1 = "update user set salary=? where id=?";
myTestAUD(sql1, 9898,2);
String sql2 = "delete from user where id=?";
myTestAUD(sql2, 3);
}
//通用的增加修改删除的方法
//首先传递两个参数,一个是可变参数
//关于可变参数:只能写在参数列表最后,且只能有一个可变参数,只能在参数列表中,不能单独定义
//可变参数相当于数组,通过数组下标获取值
public static void myTestAUD(String sql ,Object...o){
Connection conn = null;
PreparedStatement pst = null;
try{
//通过连接池建立连接
conn = JDBCUtils.getConnection();
//预编译
pst = conn.prepareStatement(sql);
//获取参数个数,得到参数元数据,循环,向里面设置值
for(int i=1;i<=pst.getParameterMetaData().getParameterCount();i++){
pst.setObject(i, o[i-1]);
}
int executeUpdate = pst.executeUpdate();
if(executeUpdate>0){
System.out.println("执行成功");
}else{
System.out.println("执行失败");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
JDBCUtils.releaseResource(conn, pst);
}
}
}
二、查询方法的提取(******)
(3)通用的查询的方法的提取
*因为通用方法里面的三处不同点,其中处理结果集的地方不同和返回类型,所以定义泛型接口,实现泛型接口里面的处理结果集的方法即可实现通用的查询方法。
-总结:当发现通用性代码时,里面有部分功能时不通用的,这个时候就定义接口,传到方法中,让调用者自己按照自己需要的去处理这个功能。接口方法让调用者重写功能
-处理结果集的接口
public interface ResultSetHandler<T> {
T handler(ResultSet rs) throws Exception;
}
-代码演示
/***
* 实现通用的查询方法的提取,
*
* 查询语句有三处不同的地方。
* -sql语句
* -参数个数
* -数据封装的过程
* @author XiaYuJia
*
*/
public class TestSelect {
public static <T> void main(String[] args) {
/*//调用查询方法,把数据封装到list里面
List<User> listuser = query("select * from user", new ResultSetHandler<List<User>>() {
List<User> list = new ArrayList<User>();
public List<User> handler(ResultSet rs) throws Exception {
//封装数据
while(rs.next()){
//把记录放到对象里面
User user = new User();
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
user.setSalary(rs.getInt(3));
list.add(user);
}
return list;
}
});
//遍历list
for (User user : listuser) {
System.out.println(user.getId()+" "+user.getName()+" "+user.getSalary());
}*/
//调用查询方法,把数据封装到user里面
User user = query("select * from user where id=?",new ResultSetHandler<User>() {
public User handler(ResultSet rs) throws Exception {
while(rs.next()){
//创建User
User user = new User();
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
user.setSalary(rs.getInt(3));
return user;
}
return null;
}
},2);
System.out.println(user.getId()+" "+user.getName()+" "+user.getSalary());
}
//返回是一个任意类型
//使用泛型表示<T>
public static <T>T query(String sql ,ResultSetHandler<T> rst,Object...o){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try{
//得到连接池连接
conn = JDBCUtils.getConnection();
//预编译
pst = conn.prepareStatement(sql);
//循环设置值
for(int i=1;i<=pst.getParameterMetaData().getParameterCount();i++){
pst.setObject(i, o[i-1]);
}
//执行sql
rs = pst.executeQuery();
T trs = rst.handler(rs);
return trs;
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
JDBCUtils.releaseResource(conn, pst,rs);
}
return null;
}
}
三、DBUtils小框架的使用(类库)
2、DBUtils框架的使用
*DBUtils是Apache组织提供一个开源JDBC工具类库
-DBUtils 使用很简单,在很多公司里面不想使用hibernate,因为使用hibernate如果使用不好,会产生性能问题,很多公司而是使用DBUtils框架完成jdbc的操作。
*使用到的类:
-DBUtils:
-方法
--close(Connection conn)
-loadDriver(String driverClassName)
-roolback()
-QueryRunner:
-方法:
构造函数常用两个:
--QueryRunner();
*如果使用没有参数的构造方法,需要使用下面的方法
- update(Connection conn, String sql, Object... params)
- query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
--QueryRunner(DataSource ds);
*如果使用有参数的构造方法 ,使用里面参数是DataSource的构造方法
- update(String sql, Object... params) :完成增加修改和删除的操作
- query(String sql, ResultSetHandler<T> rsh, Object... params):完成查询的操作
*代码演示
-dbutils实现增删改(*******)
/**
* 使用dbutils框架实现增加、删除和修改操作
* @author XiaYuJia
*
*/
public class TestDButils {
public static void main(String[] args) {
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//使用update方法实现操作,注意:QueryRunner构造函数传入了DataSource对象
try {
//不需要释放资源了,类库里面已经实现释放资源了
qr.update("insert into user values(?,?,?)",666,"孙悟空",20000);
//删除操作
qr.update("update user set id=? where name=?",7,"孙悟空");
//修改操作
qr.update("delete from user where id=?",666);
//删除操作
} catch (SQLException e) {
e.printStackTrace();
}
}
}
-dbutils实现查询操作(**********)
/**
* 使用dbutils实现查询的操作,使用到接口的实现类
* -ArrayHandler
*
* @author XiaYuJia
*
*/
public class TestDBUtils2 {
public static void main(String[] args) throws Exception {
// 创建QueryRunner 对象
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//ArrayHandler:把数据封装到一个数组里面========================================
ArrayHandler ah = new ArrayHandler();
String sql = "select * from user where id=?";
Object[] query = runner.query(sql, ah ,1);
System.out.println(Arrays.toString(query));
//ArrayListHander:把数据存到数组然后把数组放到list里面================================
String sql1 = "select * from user";
ArrayListHandler alh = new ArrayListHandler();
List<Object[]> query2 = runner.query(sql1, alh);
for (Object[] objects : query2) {
System.out.println(Arrays.toString(objects));
}
//BenaHandler:把数据封装到对象里面(****)=========================================
BeanHandler bh = new BeanHandler<User>(User.class);
User user = runner.query(sql, bh ,6);
System.out.println(user.getId()+" "+user.getName()+" "+user.getSalary());
//BeanListHandler:把数据放到对象里面,把对象放到list里面(******)=====================
BeanListHandler blh = new BeanListHandler<User>(User.class);
List<User> list = runner.query(sql1, blh);
for (User user2 : list) {
System.out.println(user2.getId()+" "+user2.getName()+" "+user2.getSalary());
}
}
}
/**
* 把数据封装到ResultSetHandler实现类里面演示
* @author XiaYuJia
*
*/
public class TestDBUtils3 {
public static void main(String[] args) throws Exception {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//MapHandler:把数据封装到map里面=================================
MapHandler mh = new MapHandler();
String sql = "select * from user where id=?";
Map<String, Object> map = qr.query(sql, mh,1);
System.out.println(map);
//MapListHandler:把数组存到map里面,把map存到list里面===============
String sql1 ="select * from user";
MapListHandler mlh = new MapListHandler();
List<Map<String, Object>> query = qr.query(sql1, mlh);
for (Map<String, Object> map2 : query) {
System.out.println(map2);
}
//ColumnListHandler:把查询到某一列的值放到list里面==================
String sql2 = "select name from user";
ColumnListHandler clh = new ColumnListHandler();
List<Object> query2 = qr.query(sql2, clh);
for (Object object : query2) {
System.out.println(object);
}
//keyedHandler :把数据存到map里面。把封装之后map作为值存到另一个map中
KeyedHandler kh = new KeyedHandler("name");//把name作为键
//KeyedHandler kh = new KeyedHandler();
Map<Object, Map<String, Object>> map1 = qr.query(sql1, kh);
System.out.println(map1);
//ScalarHandlrt :进行单值查询
String sql3 ="select count(*) from user";
ScalarHandler sh = new ScalarHandler();
Long query3 = (Long) qr.query(sql3, sh);
System.out.println(query3);
}
}
* 掌握的实现类:BeanHandler BeanListHandler MapListHandler