JDBC增删改查方法的优化

1:DaoUtils类中方法优化

      在DAO中,Utils工具类实现对数据表的增删改查操作,然而在编写的过程中,出现了大量的冗余代码,因此可以将方法封装到DaoUtils中以便循环利用

/**
	     * 公共处理增,删,改的方法
	     * @param sql sql语句执行的代码
	     * @param args 参数列表
	     * @return 返回受影响的行数
	     */
	    public int commonsUpdate(String sql,Object... args){
	        Connection connection=null;
	        PreparedStatement preparedStatement=null;
	        connection= DbUtils.getConnection();
	        try {
	            preparedStatement=connection.prepareStatement(sql);
	            //非常重要的一步
	            for (int i=0;i<args.length;i++){
	                preparedStatement.setObject(i+1,args[i]);//i+1表示占位符的位置
	            }
	            int result = preparedStatement.executeUpdate();
	            return result;
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	           DbUtils.closeAll(null,preparedStatement,null);
	        }
	        return 0;
    }
	/**
	     * 公共的查询方法
	     * @param sql sql执行语句
	     * @param args 参数列表
	     * @return 返回集合
	     */
	    public List<T> commonsQuery(String sql, RowMapper<T> rowMapper, Object... args  ){
	
	        Connection  connection=null;
	        PreparedStatement preparedStatement=null;
	        ResultSet resultSet=null;
	        List<T> list=new ArrayList<>();
	        try {
	            connection=DbUtils.getConnection();
	            preparedStatement=connection.prepareStatement(sql);
	            if (args!=null){
	                for (int i=0;i< args.length;i++){
	                    preparedStatement.setObject(i+1,args[i]);
	                }
	            }
	            resultSet=preparedStatement.executeQuery();
	            //读取数据封装
	            while (resultSet.next()){
	                //如何根据查询结果完成ORM,如何进行对象的创建及赋值
	                T t=rowMapper.getRow(resultSet);//回调  调用者自己去封装对象
	                list.add(t);
	            }
	            return list;
	        } catch (SQLException e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

 

2.Druid连接池

  在程序初始化时,预选创建指定数量的数据库连接到对象存储到池中,当需要连接数据库的时候, 从池中取出连接,再使用后,会返回池中,可以循环利用

 

	public class DbUtils {
	    //声明连接池对象
	    private static DruidDataSource ds;
	
	    static {
	        //实例化配置对象
	        Properties properties=new Properties();
	        InputStream inputStream = DbUtils.class.getResourceAsStream("/database.properties");
	        try {
	            properties.load(inputStream);
	            //创建连接池
	            ds= (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);
	        } catch (IOException e) {
	            e.printStackTrace();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	
	    }
	
	    //获得连接对象
	    public static Connection getConnection(){
	        try {
	            return ds.getConnection(); //通过线程池获得对象
	        } catch (SQLException e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

 

3.Apached的DbUtils的使用

Commons DbUtils是Apache组织提供的一个对jdbc进行简单封装的开源工具类库,能够简化JDBC中的方法操作

3.1DbUtils介绍

DbUtils类中方法可以对数据表进行增删改查操作,让其中的方法更加方便

1.对于增删改的操作,只需要输入执行语句即可

2.对于查询的操作,可以将获得数据装换为集合输出

3.2DBUtils主要类的介绍

  • ResultSetHandler接口:转换类型接口
    • BeanHandler类:实现类,把一条数据转换为对象
    • BeanListHandler类:实现类,把多条数据转换为集合
    • ScalarHandler类:实现类,获取一行一列的数据
  • QueryRunner:执行sql语句的类
    • Update()方法 实现增删改
    • qurey()方法 实现查询方法

连接池工具类:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DbUtils {
    //声明连接池对象
    private static DruidDataSource ds;

    static {
        //实例化配置对象
        Properties properties=new Properties();
        InputStream inputStream = DbUtils.class.getResourceAsStream("/database.properties");
        try {
            properties.load(inputStream);
            //创建连接池
            ds= (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //获得连接对象
    public static Connection getConnection(){
        try {
            return ds.getConnection(); //通过线程池获得对象
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //返回一个数据源
    public static DataSource getDataSource(){
        return ds;
    }
}

 PersonDaoImpl数据访问对象:

import com.finals.dao.PersonDao;
import com.finals.entity.Person;
import com.finals.utils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.SQLException;
import java.util.List;

public class PersonDaoImpl implements PersonDao {

    private QueryRunner queryRunner=new QueryRunner(DbUtils.getDataSource());

    @Override
    public int insert(Person person) {
        String sql="insert into person (name,age,bornDate,email,address) values (?,?,?,?,?)";
        Object[] params={person.getName(),person.getAge(),person.getBornDate(),person.getEmail(),person.getAddress()};
        try {
            int result = queryRunner.update(sql,params);
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public int update(Person person) {
        String sql="update person set name=?,age=?,bornDate=?,email=?,address=?";
        Object[] params={person.getName(),person.getAge(),person.getBornDate(),person.getEmail(),person.getAddress()};
        try {
            int result = queryRunner.update(sql,params);
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public int delete(int id) {
        String sql="delete from person where id=?";
        try {
            int result = queryRunner.update(sql,id);
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public Person select(int id) {
        String sql="select * from person where id=?";
        try {
            //BeanHandler类可以将一条记录转换为对象
            Person person= queryRunner.query(sql, new BeanHandler<Person>(Person.class),id);//反射
            return person;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public List<Person> selectAll() {
        String sql="select * from person";
        try {
            //封装类,调用时需要传入泛型
            //BeanListHandler类可以将多条记录转换为list集合
            return queryRunner.query(sql,new BeanListHandler<Person>(Person.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值