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;
}
}