封装对数据库的操作

基础实现请参考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!跑起来看看~~~~~~~~~~~~
在这里插入图片描述
在这里插入图片描述
大功告成!!!!!!!!!!!!!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值