数据库JDBC包装实现
定义增删改查的接口
package cn.com.aistudynet.base;import java.util.List;public interface BaseService<T> {/*** 新增记录* @param t*/void add(T t);/*** 以获取记录数* @param t* @return*/Integer getCount(T t);/*** 获取列表* @return*/List<T> getDataList();/*** 更新记录* @param t*/boolean update(T t); //这里修改过了原本是T update(T t); 实现为通过id替换数据库的值/*** 插入记录* @param t* @return*/boolean insert(T t); //这里修改稿过了原本是T insert(T t); 实现为插入数据返回是否成功}
定义配置文件接口
package cn.com.aistudynet.base;/*** 该接口表示数据库配置信息*/
public interface Config {/*** 数据库加载驱动*/String drive = "com.mysql.cj.jdbc.Driver";/***数据库电脑所在的ip地址*/String ip="localhost";/*** 数据库在该电脑上所占用的端口信息*/String port="3306";/*** 进入的数据库*/String database = "test";/*** 数据库需要配置的编码格式*/String code="?characterEncoding=utf8&serverTimezone=Asia/Shanghai";/*** 登录数据库的用户*/String user="root";/*** 登录数据库的密码*/String password="98526";
}
实现抽象类:
package cn.com.aistudynet.base;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONTokener;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.sql.*;
import java.util.*;/*** 数据库链接类调用该类需要自行判断从传入对象的值不能为空且传入的值不能与主键id互相冲突* 本类提供了getColumn()方法判断在数据库的表多少列* @param <T>*/
public abstract class DbMangerBase<T> implements BaseService<T> {//数据库链接private static String url = "jdbc:mysql://" + Config.ip + ":" + Config.port + "/" + Config.database + Config.code;//获取数据库private static Connection connection = null;//加载数据库驱动static {try {Class.forName(Config.drive);connection = DriverManager.getConnection(url, Config.user, Config.password);} catch (ClassNotFoundException x) {System.err.println("数据库驱动加载错误...");} catch (SQLException v) {System.err.println("数据库链接失败...");}}//该方法用来获取一个类的实例的方法private T getInstance() {try {ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0];return type.getDeclaredConstructor().newInstance();} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {e.printStackTrace();}return null;}@Override //增加对象到数据库 大约78秒public void add(T t) {if (null == t) {return;}T temp = getInstance();temp = t;//将实例映射到了map上//Map<String, Object> map = BeanUtil.beanToMap(temp);Map<String, Object> map = BeanUtil.beanToMap(temp, false, false);if (map.size() == 0) {System.err.println("对象不能为空...");return;}//INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)StringJoiner key = new StringJoiner(","); //后面的参数表示每添加一次则加一个逗号最后一个不加逗号StringJoiner value = new StringJoiner(",");Boolean flag = Boolean.FALSE;for (Map.Entry<String, Object> k : map.entrySet()) {if (null == k.getValue() || Objects.equals(k.getValue(), "")) {continue;}flag = Boolean.TRUE;key.add(k.getKey());if (k.getValue() instanceof String) {value.add("\'" + k.getValue() + "\'");} else {value.add("" + k.getValue());}}if (!flag) {System.out.println("对象为空");return;}StringBuilder sql = new StringBuilder("INSERT INTO " + t.getClass().getSimpleName());sql.append("(").append(key).append(")");sql.append(" VALUES (").append(value).append(")");try {System.out.println(sql);PreparedStatement preparedStatement = connection.prepareStatement(String.valueOf(sql));int i = preparedStatement.executeUpdate();if (i <= 0) {System.err.println("增加失败...");}preparedStatement.close();} catch (SQLException e) {e.printStackTrace();System.err.println("增加sql语句出现问题...");}}@Override //返回拥有与这个对象信息相同的列的数量public Integer getCount(T t) { //基本稳定125毫秒T temp = getInstance();temp = t;String simpleName = temp.getClass().getSimpleName();//获取名字StringJoiner stringJoiner = new StringJoiner(" and "); //拼接条件Map<String, Object> map = BeanUtil.beanToMap(temp, false, false);for (Map.Entry<String, Object> k : map.entrySet()) {if (k.getValue() instanceof String) {stringJoiner.add(k.getKey() + "= '" + k.getValue() + "'");} else {stringJoiner.add(k.getKey() + "=" + k.getValue());}}int count = 0;try {String sql = "select count(1) as count from " + simpleName + " where " + stringJoiner;PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();if (resultSet.next()) {count = resultSet.getInt("count");} else {System.err.println("数据库查询错误...");}preparedStatement.close();resultSet.close();} catch (SQLException e) {System.err.println("数据库查询错误....");}return count;}@Override //获取数据public List<T> getDataList() { //125~171毫秒左右T temp = getInstance();//这里不需要这么写!!!!!!!!
// Map<String, Object> map = BeanUtil.beanToMap(temp, false, false);
// //装入字段名
// ArrayList<Object> list = new ArrayList<>();
// for (Map.Entry<String, Object> k : map.entrySet()) {
// list.add(k.getKey());
// }ArrayList<T> list = new ArrayList<>();String simpleName = temp.getClass().getSimpleName();String sql = "select * from " + simpleName;try {PreparedStatement yby = connection.prepareStatement(sql);ResultSet resultSet = yby.executeQuery();//这里获取数据表中的数据HashMap data = null;//解析结果集while (resultSet.next()) {ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();data = new HashMap<>();for (int i = 1; i <= columnCount; i++) {String columnName = metaData.getColumnName(i);data.put(columnName, resultSet.getObject(columnName));}T instance = getInstance();//将查询的数据转成对象数据T t = BeanUtil.fillBeanWithMap(data, instance, true, false);list.add(t);}yby.close();resultSet.close();} catch (SQLException e) {System.err.println("获取数据列表失败...");}return list;}@Override //修改 如果没有这个id则会报错public boolean update(T t) { //94~141毫秒左右Map<String, Object> map = BeanUtil.beanToMap(t, false, false);StringJoiner stringJoiner = new StringJoiner(",");int temp=0;String temp1=null;for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {if (stringObjectEntry.getValue()==null){System.err.println("值不能为空...");return false;}temp++;if (temp==1){temp1=stringObjectEntry.getKey()+"="+stringObjectEntry.getValue();}if (stringObjectEntry.getValue() instanceof String){stringJoiner.add(stringObjectEntry.getKey()+"= '"+stringObjectEntry.getValue()+"'");}else {stringJoiner.add(stringObjectEntry.getKey()+"="+stringObjectEntry.getValue());}}String simpleName = t.getClass().getSimpleName();String sql="update "+simpleName+" set "+stringJoiner+" WHERE "+temp1;try {PreparedStatement preparedStatement = connection.prepareStatement(sql);int i = preparedStatement.executeUpdate();if (i<=0){System.err.println("替换执行失败...");return false;}preparedStatement.close();} catch (SQLException e) {System.err.println("替换执行出错...");return false;}return true;}@Override //插入数据 该方法执行大约78毫秒左右public boolean insert(T t) {Map<String, Object> map = BeanUtil.beanToMap(t, false, false);StringJoiner stringJoiner = new StringJoiner(",");//INSERT INTO `student`(`name`,`password`) VALUES ('小步','123456');for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {if (stringObjectEntry.getValue() instanceof String){stringJoiner.add("'"+stringObjectEntry.getValue()+"'");}else {stringJoiner.add(stringObjectEntry.getValue() + "");}}String simpleName = t.getClass().getSimpleName();String sql="insert into `"+simpleName+"` values ("+stringJoiner+")";try {PreparedStatement preparedStatement = connection.prepareStatement(sql);int i = preparedStatement.executeUpdate();if (i<=0){System.err.println("插入数据库失败....");return false;}} catch (SQLException e) {System.err.println("插入数据库失败...");return false;}return true;}/*** 返回传入的对象在数据库对应的表有多少行* @param oop* @return*/public Integer getColumn(T t){ //该方法约65毫秒上下String simpleName = t.getClass().getSimpleName();String sql="SELECT COUNT(1) AS `count` FROM "+simpleName;System.out.println(sql);try {PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();if (resultSet.next()){int count = resultSet.getInt("count");return count;}System.err.println("sql查询行数失败...");} catch (SQLException e) {System.err.println("sql查询行数失败...");}return null;}//关闭资源public void close() {try {connection.close();} catch (SQLException e) {System.err.println("资源关闭失败...");}}
}
数据库JDBC包装实现相关推荐
- php数据库可转java数据库,php转java 系列2 Spring boo 链接数据库jdbc
php转java 系列2 Spring boo 链接数据库jdbc JDBC 首先创建一个新项目,在创建项目时要注意导入依赖, 在项目创建成功后就会看到在 pom.xml 文件中找到,但是如果在创建项 ...
- 数据库+jdbc实现学生教师管理
数据库+JDBC实现学生教师管理系统 这次主要是假期自学了数据库,自己做了一个简单的项目来加深自己的理解,本次程序没有加Swing窗体,后续会更新新的加swing窗体的程序, 主要功能: 1,学生老师 ...
- Java - 数据库JDBC编程
本节目标 数据库驱动 JDBC的概念及作用 掌握JDBC的工作原理 掌握JDBC中几个常用接口和类 掌握基于数据库的应用程序开发流程 1.数据库编程的必备条件 编程语言,如Java,C.C++.Pyt ...
- 数据库---JDBC编程
目录 JDBC编程语言 mysql提供了一组API来让用户实现客户端 API(mysql提供的一些方法) 不同的关系数据库提供不同的API,而API也没有一个统一标准,所以API接口会有所不同 jav ...
- java连接mysql数据库jdbc
jdbc.driver = com.mysql.jdbc.Driverjdbc.url = jdbc:mysql://localhost:3306/数据库名jdbc.username = rootjd ...
- 数据库---JDBC
1.1 JDBC概述 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同 ...
- java操作数据库 jdbc
JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果. Statement(存在sql注入风险) Class.forName("com.mys ...
- jdbc连接oracle查询数据库,JDBC连接Oracle数据库,并操作数据库,查询表
JDBC连接Oracle数据库 protected void doPost(HttpServletRequest request, HttpServletResponse response) thro ...
- Java与数据库 —— JDBC标准
JDBC由来与描述 没有JDBC前 开发者想操作数据库,必须需要了解每个数据库对应的数据库驱动程序API,由于每个数据库驱动程序的API都不同,所以当需要迁移数据库时,根本不平滑,需要大量修改与重写 ...
最新文章
- 安装docker和docker-compose
- Hackbar PJ
- linux redis 普通用户,非root用户安装redis
- 用 Python 分析上网记录,发现了很多不可思议的事
- bagging算法_Bagging与随机森林算法及其变种
- 汉字编码计算机,计算机汉字编码,computerbased Chinese codings,音标,读音,翻译,英文例句,英语词典...
- iOS 15 真机调试包 DeviceSupport
- 初学者习字如何选择练字用的辅助格子纸?
- 镇魔曲网页版服务器选择,镇魔曲网页版职业选择解析 哪个职业好
- Nunit使用(一)
- bat实现ftp上传文件
- linux自动同步onedrive,如何在Linux中同步微软OneDrive
- 甄选北京十大律师事务所排名榜(资深团队、胜诉率高)
- addEventListener()使用方法
- 那个人总有一天会爱你
- 图像检索--Deep Supervised Hashing for Fast Image Retrieval
- 每周推荐短视频:为什么理论正确但得不到预期结果?
- Python+Vue计算机毕业设计车辆年检系统的设计与实现u7cih(源码+程序+LW+部署)
- mysql温度报警器源码_基于51单片机的温度报警器设计源码
- dwg文件怎么打开?怎么快速查看CAD图纸?