admin管理员组文章数量:1794759
Orm
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
版权声明:本文标题:Orm 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1705945294a511730.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论