SQL通用方法
- 一、常规方法增删改查
- 二、具体优化步骤
- 1.准备工作
- 2.getcon()方法,获取数据库连接对象
- 3.closeAll()方法,关闭所有资源
- 4.通用的增删改方法
- 5.通用的查询方法
- 6.动态查询语句
- 总结
一、常规方法增删改查
在常规方法中,我们在Java中对数据库中的表做增删改查操作的时候会发现,代码的答题都大致相同,应该可以将代码优化成一个通用的方法,首先我们要知道增删改要使用到Connection和PreparedStatement两个对象,而查找需要再加一个ResultSet对象,从这里出发我们开始写出一个通用的增删改方法,一个查询方法
二、具体优化步骤
1.准备工作
我们在优化前,需要将一个重复使用的数据写进属性文件中,以便多次使用,提高代码重用率
在src下新建一个包,叫做config,在config包中新建一个文件,jdbc.properties,
写上常规方法中需要用到的几个数据
2.getcon()方法,获取数据库连接对象
getCon方法,获取数据库连接对象,代码如下
//获得数据库连接对象
public Connection getcon() {
Properties pro = null;
FileReader fr = null;
Connection con = null;
try {
pro = new Properties(); //类加载器
//相对地址转换成绝对地址
String str = DBHelper.class.getClassLoader().getResource("config/jdbc.properties").getPath();
fr = new FileReader(str); //读取属性文件中的数据
pro.load(fr);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
Class.forName(pro.getProperty("mysql.classname"));
String username = pro.getProperty("mysql.username");
String password = pro.getProperty("mysql.password");
String url = pro.getProperty("mysql.url");
con = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con; //返回值为Connection类型,在通用方法中调用这个getcon方法,拿到数据库连接对象后继续操作
}
3.closeAll()方法,关闭所有资源
代码如下
public void closeAll(Connection con, PreparedStatement ps, ResultSet rs){
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
有了这个方法,在我们执行完通用方法之后就不再需要写很多行代码去关闭资源了
4.通用的增删改方法
//通用的增删改方法
public int update(String sql,Object...objects){
int i = 0;
Connection con = null;
PreparedStatement ps = null;
try {
con = getCon();//调用getcon,获得数据库连接对象
ps = con.prepareStatement(sql);//向传入的sql语句中的问号赋值
for (int j = 0; j < objects.length; j++) {
ps.setObject(j + 1, objects[j]);
}
i = ps.executeUpdate();//执行sql语句并获得结果
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(con,ps,null);
}
return i;//返回执行后的结果以供下一步差异化操作
}
5.通用的查询方法
public ArrayList query(String sql,Class cla,Object...objs){
ArrayList list = null;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = getcon();
ps = con.prepareStatement(sql);
for (int i = 0; i < objs.length; i++) {
ps.setObject(i + 1, objs[i]);//给sql语句中的问号赋值
}
rs = ps.executeQuery();//执行sql语句进行查找
while (rs.next()) {//遍历查找到符合条件的对象
Object o = cla.newInstance();//通过反射得到一个新的对象
Field[] declaredFields = cla.getDeclaredFields();//利用反射获取对象成员的所有属性放到数组中
for (Field f : declaredFields) {//利用强烈for循环遍历数组
f.setAccessible(true);//暴力破解权限
f.set(o, rs.getObject(f.getName()));//对新的对象的每一个属性赋值,赋的是查找到的对象的值
}
list.add(o);//将新的对象添加到集合中,开始对下一个符合条件的对象进行操作
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(con,ps,rs);
}
return list;//等对所有符合条件的对象都操作完,把这个集合返回出去,等待下一步使用
}
6.动态查询语句
我们要知道不同功能的操作的原因是sql语句不同,而查找的sql语句偏偏是一个不能修改的String类型的,我们很难附加一些缩小范围的查询条件,所以动态查询需要用到可变数组,以下代码是在数据层实现类中书写的
以DVD项目做例子,DVD有六个属性,分别是下面代码体现的这些,我们通过传参,传进来一个DVD对象,这个时候我们先写一个可变数组where后面 1 = 1是恒成立的意思,无论后面加不加,加什么都会执行,接下来我们对dvd的各个属性进行判断,如果不为空,那么就代表需要根据这条属性来判断,我们就在sql语句中加上该条件,接着我们在集合中添加这条属性。最后我们再调用通用的查询方法,进行一个动态查询,其实到这里还没结束,需要在控制层再写一次差异化,如果输入一个什么东西,或者下拉勾选需要查询的属性,比如下面第二段演示的代码:
public ArrayList<DVD1> selectDVDs(DVD1 dvd) {
StringBuilder sql = new StringBuilder("select * from dvd where 1 = 1");
ArrayList list = new ArrayList();
if (dvd.getId() != null){
sql.append("and id = ?");
list.add(dvd.getId());
}
if (dvd.getName() != null){
sql.append("and name = ?");
list.add(dvd.getName());
}
if (dvd.getState() != null){
sql.append("and state = ?");
list.add(dvd.getState());
}
if (dvd.getLendDate() != null){
sql.append("and lendDate = ?");
list.add(dvd.getLendDate());
}
if (dvd.getMoney() != null){
sql.append("and money = ?");
list.add(dvd.getMoney());
}
if (dvd.getCount() != null){
sql.append("and count = ?");
list.add(dvd.getCount());
}
return db.query(sql.toString(),DVD1.class,list.toArray());
}
public void see(){
DVD dvd=new DVD();
System.out.println("请输入查看DVD的编号:(输入N,不按照此条件查询)");
String id = input.next();
if (!"N".equals(id))dvd.setId(Integer.parseInt(id));
System.out.println("请输入查看DVD的名称:(输入N,不按照此条件查询)");
String name = input.next();
if (!"N".equals(name))dvd.setName(name);
System.out.println("请输入查看DVD的状态:(输入N,不按照此条件查询)");
String state = input.next();
if (!"N".equals(state))dvd.setState(state);
System.out.println("请输入查看DVD的日租金:(输入N,不按照此条件查询)");
String money = input.next();
if (!"N".equals(money))dvd.setMoney(Double.parseDouble(money));
System.out.println("请输入查看DVD的借出日期:(输入N,不按照此条件查询)");
String date = input.next();
if (!"N".equals(date))dvd.setLendDate(date);
System.out.println("请输入查看DVD的出借次数:(输入N,不按照此条件查询)");
String count = input.next();
if (!"N".equals(count))dvd.setCount(Integer.parseInt(count));
ArrayList<DVD> dvds = dvdService.findDVDs(dvd);
System.out.println("序号\t\t名字\t\t状态\t\t日租金\t\t借出日期\t\t出借次数");
for (DVD d : dvds) {
System.out.println(d.toString());
}
}
这样我们就实现了对某一张表进行一个动态查询的操作
总结
以上就是sql语句的通用方法,真~通用,感觉对你有益的话点个收藏吧,防止用的时候找不到!!!