Orm-JDBC(对象关系映射的数据库查询)

大致说明

实现将数据库查询结果用对象封装,连接池采用的druid连接池
示例:

public static void main(String[] args) {CommonDao dao=new CommonDao();String sql="select * from tb_goods where id=?";TbGoods object = dao.findObject(sql, TbGoods.class,2);System.err.println(object);}二月 14, 2021 9:22:50 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
TbGoods{id='2', name='12', remark='112', createdTime=Sat Jan 16 14:05:33 CST 2021}
配置文件
#驱动加载
driverClassName=com.mysql.cj.jdbc.Driver
#注册驱动
url=jdbc:mysql://42.193.171.7:3306/dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf-8
#连接数据库的用户名
username=root
#连接数据库的密码
password=Gepoint
#属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wall
filters=stat
#初始化时池中建立的物理连接个数。
initialSize=2
#最大的可活跃的连接池数量
maxActive=300
#获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
maxWait=60000
#连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
#用来检测连接是否有效的sql,要求是一个查询语句。
validationQuery=SELECT 1
#建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。
testWhileIdle=true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为false
testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flase
testOnReturn=false
#是否缓存preparedStatement,也就是PSCache。
poolPreparedStatements=false
#池中能够缓冲的preparedStatements语句数量
maxPoolPreparedStatementPerConnectionSize=200
druid 连接工具类
package com.epoint.util;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;public class DruidUtils {//Druid德鲁伊,据说是魔兽世界中的一个角色,森林女神public static DruidDataSource dataSource;//数据库连接池//1.初始化Druid连接池static {//第二种方式:使用软编码通过配置文件初始化try {Properties properties = new Properties();//通过类加载器加载配置文件InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");properties.load(inputStream);//创建连接池dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//2.获取连接public static Connection getConnection() {try {return dataSource.getConnection();//从连接池中获取连接} catch (SQLException e) {e.printStackTrace();}return null;}public static DataSource getDataSource(){return dataSource;}//3.释放资源public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {//释放resultSettry {if (resultSet != null) {resultSet.close();}} catch (SQLException e) {e.printStackTrace();}//释放Statementtry {if (statement != null) {statement.close();}} catch (SQLException e) {e.printStackTrace();}//释放Connectiontry {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
CommonDao 持久化dao
package com.epoint.util;import java.lang.reflect.Method;
import java.sql.*;
import java.text.SimpleDateFormat;public class CommonDao
{private static Connection conn = null;static {conn=DruidUtils.getConnection();}/*** 获取实例化CommonDao*/public CommonDao getInstance() {CommonDao dao = new CommonDao();return dao;}/*** 查询一条数据* @param sql 需要查询的sql* @param cls 映射的对象* @param params sql中的参数* @param <T> 泛型* @return 返回传入对象类型*/public <T> T findObject(String sql, Class cls, Object... params) {Object obj =null;try {//3.通过数据库的连接操作数据库,实现增删改查PreparedStatement statement = conn.prepareStatement(sql);//获取需要传入参数的个数ParameterMetaData parameterMetaData = statement.getParameterMetaData();//如果需要传入的参数个人大于>0则需要设置参数if(parameterMetaData.getParameterCount()>0){for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) {statement.setString(1, params[i-1].toString());}}//4.获取结果集ResultSet resultSet =statement.executeQuery();//6.获取结果集元数据ResultSetMetaData metaData = resultSet.getMetaData();//7.获取字段的个数int columnCount = metaData.getColumnCount();//是否实例化的开关,保证对象只实例化一次boolean flag=true;//8.遍历  创建类对象(来接数据查询出来的数据)while (resultSet.next()) {if(flag){obj = cls.getConstructor(null).newInstance(null);flag=false;}for (int i = 1; i <= columnCount; i++) {//9.获取字段的名字String columnName = metaData.getColumnName(i);//id, name ,age//10.获取对应字段的数据Object value = resultSet.getObject(columnName);//11.给指定字段的数据在类对象中给赋值setValue(columnName, value, obj, cls);}}DruidUtils.closeAll(conn,statement,resultSet);}catch (Exception e){e.printStackTrace();}//返回查询到的对象return (T) obj;}private void setValue(String field, Object value, Object obj, Class cls) throws Exception {//获取对象中的方法数组Method[] method = cls.getMethods();//加上数据库字段加上setString fieldName = "set" + field;for (int n = 0; n < method.length; n++) {//如果匹配到对应的set方法则执行赋值操作if (method[n].getName().equalsIgnoreCase(fieldName)) {//获取方法参数数据类型String[] clsList = method[n].getParameterTypes()[0].getName().split("\\.");String type = clsList[clsList.length - 1];switch (type) {case "Integer":case "int":method[n].invoke(obj, Integer.parseInt(value.toString()));//给对应的方法参数赋值break;case "Double":case "double":method[n].invoke(obj, Double.parseDouble(value.toString()));break;case "Long":case "long":method[n].invoke(obj, Long.parseLong(value.toString()));break;case "Float":case "float":method[n].invoke(obj, Float.parseFloat(value.toString()));break;case "Date":method[n].invoke(obj, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value.toString()));break;case "String":method[n].invoke(obj, value.toString());break;}break;}}}
}
测试

  • 步骤一:创建查询对象
package com.epoint.entity;import java.util.Date;
public class TbGoods
{private String id;private String name;private String remark;private Date createdTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public Date getCreatedTime() {return createdTime;}public void setCreatedTime(Date createdTime) {this.createdTime = createdTime;}@Overridepublic String toString() {return "TbGoods{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", remark='" + remark + '\'' + ", createdTime=" + createdTime + '}';}
}
  • 步骤二 创建测试类,传入sql
package com.epoint.test;import com.epoint.entity.TbGoods;
import com.epoint.util.CommonDao;public class Test
{public static void main(String[] args) {CommonDao dao=new CommonDao();String sql="select * from tb_goods where id=?";TbGoods object = dao.findObject(sql, TbGoods.class,2,3);System.err.println(object);}
}

结果

二月 14, 2021 9:22:50 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
TbGoods{id='2', name='12', remark='112', createdTime=Sat Jan 16 14:05:33 CST 2021}进程已结束,退出代码0

程序还在不断编写中,希望有喜欢的朋友加入一起完成
加粗样式

Orm-JDBC(对象关系映射的数据库查询)相关推荐

  1. C++ 对象关系映射(ORM)介绍

    用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis),TopLink,JDO,JPA-- ...

  2. java对象关系映射ROM

    一.对象关系映射ORM概述 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术:简单的说,ORM是通过使 ...

  3. 学习笔记之什么是持久化和对象关系映射ORM技术

    ----------------本文转自:http://www.cppblog.com/javenstudio/articles/541.html--------------------- 何谓&qu ...

  4. Java对象关系映射(ORM)

    一.什么是对象关系映射 简单来说,对象关系映射即是将Java中的对象一一对应映射到MySQL(本文基于MySQL)的Table(表)中,通过对对象各个属性赋值来更新数据库. 官方的说,对象关系映射(O ...

  5. 对象关系映射(ORM)介绍理解

    问题背景 假设,让你设计一个框架,把jdbc封装一下?? JDBC操作步骤: 获取数据库连接Connection 创建操作命令对象Statement 执行sql语句(sql中,如果有占位符,在执行sq ...

  6. Symfony2Book04:Doctrine03-对象关系映射(ORM)

    Doctrine是一个基于PHP的对象关系映射(ORM),它构建在强大的数据库抽象层(DBAL)之上,透明地为PHP对象提供持久化. 你可以从官方文档中读到更多关于Doctrine ORM 的内容. ...

  7. netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)

    netsuite 数据集成 对象关系映射(ORM)技术使使用关系数据源更加容易,并且可以将逻辑业务模型与物理存储模型联系在一起. 遵循本教程,将NetSuite数据的连接集成到基于Java的ORM框架 ...

  8. Java中带有NetSuite数据实体的对象关系映射(ORM)

    对象关系映射(ORM)技术使使用关系数据源更容易,并且可以将逻辑业务模型与物理存储模型联系在一起. 遵循本教程,将与NetSuite数据的连接集成到基于Java的ORM框架Hibernate中. 您可 ...

  9. 鸿蒙对象关系映射数据库

    对象关系映射数据库 对象关系映射数据库简介 对象关系映射数据库存储开发步骤 1.添加配置 2.数据库的创建 3.数据表(实体对象类)的创建 4.使用对象数据操作接口OrmContext创建数据库 5. ...

最新文章

  1. ALSA声卡笔记3--ASoC驱动重要结构体关系图
  2. thinkPHP开发基础知识 包括变量神马的
  3. Exchannge 2013数据库副本频繁自动切换
  4. 在WordPress中添加简书风格的连载目录和文章导航
  5. 缓存与数据库的一致性:先操作缓存还是先操作数据库?
  6. 合肥特殊教育中专学校计算机,安徽省特殊教育中专学校
  7. 最新实战讲解.htaccess文件rewrite规则
  8. 如何让 Mac 朗读提醒信息中的文本?
  9. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)...
  10. java实训文献_java实训论文参考文献写作指导
  11. [C#/DevExpress]VS2010使用CefSharp调用Chrome内核打开网页
  12. CMD下将ts视频合并和存储为MP4文件
  13. 学校计算机功能室使用登记表,学校各功能室使用情况登记表
  14. Parallels Desktop 网络初始化失败
  15. CUDA11.4、CUDNN、Pytorch安装
  16. 菜鸟学Python之求水仙花数
  17. 基于视觉导航的自主机器人简介(一)
  18. 【GIT】源仓库新建分支如何同步到fork的自有仓库
  19. 中国银行成都网点地址,电话,成都银行分布,位置(总是找不到银行的支行名字,火大!干脆来个全收录)
  20. leetcode系列-637.二叉树的层平均值

热门文章

  1. 关于后端设置cookie无效的解决办法
  2. 连续图片在前端播放为视频思路
  3. 苏州 众智云集 项目
  4. java顺风车匹配_嘀嗒顺风车以“信息匹配六步走”的模式保障“真顺风”
  5. 四年烧掉近28亿,快狗打车再次冲击“同城货运第一股“
  6. node.js调用Delphi写的Dll
  7. 【STM32H7】第22章 ThreadX GUIX窗口图标滑动操作实现方法
  8. linux软件手机下载,linux软件下载
  9. 文件服务器数据归档,数字化转型之数据清理与归档
  10. 手把手教你用JQ调用ajax(附免费永久后台URL)