您的位置:首页 > 数据库

封装对数据库的操作

2020-01-15 11:46 1471 查看

基础实现请参考:https://blog.csdn.net/weixin_42230348/article/details/103044584

ps: 封装也称为重构,即将数据库公共操作封装起来(加载、配置、连接、增删改查等),当要实现某个实体对数据库相关操作时,只需实例封装类,即可获得相关操作,一劳永逸。OK!开始敲代码实现~~~

1、封装类BaseDao的具体实现

package com.wmc.jdbcProject.baseDao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import com.wmc.jdbcProject.util.DbUtil;
import com.wmc.jdbcProject.util.StringUtil;
/**
* 定义这个类的目的是可以根据不同的实体类实现数据库的相关操作,即每个实体都有连接数据库、关闭数据库的功能
* @author Administrator
*
* @param <T>
*/
public class BaseDao<T> {
private DbUtil dbUtil = new DbUtil() ;
public Connection connection = dbUtil.getConnection();
private final static int CURD_ADD = 0 ;

//好了,接下来要封装数据库add操作,希望自己能弄明白,分界线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* 实现添加实体添加操作
* @param t
* @return
*/
public boolean add(T t) {

String sql = buildSql(t, CURD_ADD) ;
try {
PreparedStatement prepareStatement = connection.prepareStatement(sql) ;
prepareStatement = setPreparedStatement(t,prepareStatement,CURD_ADD) ;
return prepareStatement.executeUpdate() > 0 ;
} catch (Exception e) {
e.printStackTrace();
}
return false ;

}

/**
* 设置占位符数据
* @param prepareStatement
* @return
*/
private PreparedStatement setPreparedStatement(T t,PreparedStatement prepareStatement,int curdType) {
// TODO Auto-generated method stub
Field[] declaredFields = t.getClass().getDeclaredFields() ;
try {
switch (curdType) {
case CURD_ADD:{
for(int i = 1; i<declaredFields.length; i++) {
declaredFields[i].setAccessible(true);//获得字段的访问权限
prepareStatement.setObject(i, declaredFields[i].get(t));//declaredFields[i]已获得i标识的字段,通过get方法得到相应的值
}
}
break;
}
} catch (Exception e) {
// TODO: handle exception
}
return prepareStatement;
}

/**
* 构建sql语句,其中user是变量,(id,name,password,birthday)也是变量,(null,?,?,?)也是变量,都需要封装,
* 每一个封装提供一个单独的方法进行操作
* @param curdType
* @return
*/
public String buildSql(T t , int curdType) {
String sql = "" ;
switch (curdType) {
case CURD_ADD:{
//拼接sql
sql = "insert into  "+getTableName(t)+ " ("+getAddTableFields(t)+") values("+getAddTableValues(t)+")" ;
}
break;
}
System.out.println(sql);
return sql ;

}

/**
* 添加操作占位符
* @param t
* @return
*/
private String getAddTableValues(T t) {
// TODO Auto-generated method stub
List<String> fields = getTableFields(t) ;
String[] values = new String[fields.size() ];
Arrays.fill (values, "?") ;
values[0] = "null";
return StringUtil.join(Arrays.asList(values), ",");
}

/**
* 获取添加操作的实体字段
* @param t
* @return
*/
private String getAddTableFields(T t) {
// TODO Auto-generated method stub
List<String> fields = getTableFields(t) ;
return fields.stream().collect(Collectors.joining(","));//这是java8中提供的方法
//return StringUtil.join(fields, ",")//其他java版本可用自定义封装的StringUtil的join()方法
}

/**
* 获取数据库表的所有字段
* @param t
* @return
*/
private List<String> getTableFields(T t) {
// TODO Auto-generated method stub
List<String> ret = new ArrayList<String>() ;
Field[] declaredFields = t.getClass().getDeclaredFields();

for(Field field : declaredFields) {
ret.add(field.getName()) ;
}

return ret;
}

/**
* //获取数据库表名
* 这里要注意,数据库的表名是下划线,而java中是驼峰,所以需要转换(创建一个操作这种字符串的工具类)
* @param t
* @return
*/
private String getTableName(T t) {
return StringUtil.convertToUnderline(t.getClass().getSimpleName());//获取数据库表名
}

/**
* 关闭数据库
*/
public void closeConnection() {
dbUtil.closeConnection();
}

}

2、工具类

(1)DbUtil类:连接数据库

package com.wmc.jdbcProject.util;
/**
* 数据库连接的实现
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbUtil {
/**
* 数据库连接的资源url、用户名、密码、驱动
*/
private String url = "jdbc:mysql://localhost:3306/db_jdbc_operator?useUnicode=true&characterEncoding=utf8";
private String dbUser = "root" ;
private String dbPassword = "wmc123" ;
private String dbDriver = "org.gjt.mm.mysql.Driver" ;
private Connection connection = null ;

//数据库的连接实现
public Connection getConnection() {
try {
Class.forName(dbDriver) ;//反射机制获得数据库实例
connection = DriverManager.getConnection(url,dbUser,dbPassword) ;//通过驱动管理获得连接数据库的方法
System.out.println("数据库连接成功!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection ;
}

//关闭数据库
public void closeConnection() {
if(connection !=null) {
try {
connection.close();
System.out.println("数据库连接关闭");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
DbUtil dbUtil = new DbUtil() ;
dbUtil.getConnection();
}

}

(2)StringUtil类:字符串公共操作

package com.wmc.jdbcProject.util;

import java.util.List;

/**
* 字符串公共操作类
* @author Administrator
*
*/
public class StringUtil {
//判断字符串是否为空
public static boolean isEmpty(String str) {
if(str == null || "".equals(str)) return true ;
return false ;
}

//下划线&驼峰命名
public static String convertToUnderline(String str) {
if(isEmpty(str)) return null ;
String ret = "" ;
for(int i=0; i <str.length(); i++) {
char charAt = str.charAt(i) ;
if(Character.isUpperCase(charAt)) {
if(i == 0) {
ret += String.valueOf(charAt).toLowerCase() ;
continue ;
}
else {
ret += "_"+String.valueOf(charAt).toLowerCase() ;
continue ;
}

}
ret += charAt ;
}
return ret ;
}

/**
* 按照指定的字符将数据分割成字符串
* @param list
* @param slipt
* @return
*/
public static String join(List<String> list,String split){
String ret = "";
for(Object object : list){
ret += object + split;
}
ret = ret.substring(0,ret.lastIndexOf(split));
return ret;
}
}

PS: 代码中设计到的其他实体类请参考,很详细!https://blog.csdn.net/weixin_42230348/article/details/103044584

OK!跑起来看看~~~~~~~~~~~~


大功告成!!!!!!!!!!!!!!!!!

  • 点赞
  • 收藏
  • 分享
  • 文章举报
奔跑中的小猿 发布了34 篇原创文章 · 获赞 0 · 访问量 231 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: