文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

开源组件:(4)用元数据和BeanUtils写一个简单的ORM映射BaseDAO.java

2024-04-02 19:55

关注

1、JDBC元数据

在jdbc中可以使用: 数据库元数据、参数元数据、结果集元数据


(1)数据库元数据

通过Connection对象的getMetaData() 方法可以得到DatabaseMetaData对象。DatabaseMetaData对象包含了数据库的元信息。


DatabaseMetaData java.sql.Connection.getMetaData() 

Retrieves a DatabaseMetaData object that contains metadata about the database. The metadata includes information about the database's tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on.



java.sql.DatabaseMetaData

(1)这个接口由驱动程序厂商实现,通过这个接口可以得到数据库的capabilities

This interface is implemented by driver vendors to let users know the capabilities of a Database 

(2)不同的DBMS提供不同的特性,实现特性的方式也不同,数据类型也不同

Different relational DBMSs often support different features, implement features in different ways, and use different data types.


getURL():返回一个String类对象,代表数据库的URL。

getUserName():返回连接当前数据库管理系统的用户名。

getDatabaseProductName():返回数据库的产品名称。

getDatabaseProductVersion():返回数据库的版本号。

getDriverName():返回驱动驱动程序的名称。

getDriverVersion():返回驱动程序的版本号。

isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。



(2)参数元数据

java.sql.ParameterMetaData

An object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object.


通过ParameterMetaData对象的getParameterCount()方法可以获得PreparedStatement对象中的参数个数。

int java.sql.ParameterMetaData.getParameterCount() 

Retrieves the number of parameters in the PreparedStatement object.



(3)结果集元数据

通过ResultSet对象的getMetaData()方法得到ResultSetMetaData对象。

ResultSetMetaData java.sql.ResultSet.getMetaData()

Retrieves the number, types and properties of this ResultSet object's columns.



java.sql.ResultSetMetaData

An object that can be used to get information about the types and properties of the columns in a ResultSet object. 



1.1、数据库元数据

package com.rk.metadata;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import com.rk.utils.JDBCUtil;

//1. 数据库元数据
public class Demo01
{
	public static void main(String[] args) throws SQLException
	{
		// 获取连接
		Connection conn = JDBCUtil.getConnection();
		// 获取数据库元数据
		DatabaseMetaData metaData = conn.getMetaData();// alt + shift + L  快速获取方法返回值
		
		System.out.println("DatabaseProductName:" + metaData.getDatabaseProductName());//返回数据库的产品名称。
		System.out.println("DatabaseProductVersion:" + metaData.getDatabaseProductVersion());//返回数据库的版本号
		System.out.println("DriverName:" + metaData.getDriverName());//返回驱动驱动程序的名称
		System.out.println("getDriverVersion:" + metaData.getDriverVersion());//返回驱动程序的版本号
		System.out.println("URL:" + metaData.getURL());//返回一个String类对象,代表数据库的URL
		System.out.println("UserName:" + metaData.getUserName());//返回连接当前数据库管理系统的用户名
		System.out.println("ReadOnly:" + metaData.isReadOnly());//返回一个boolean值,指示数据库是否只允许读操作
		
		JDBCUtil.closeQuietly(conn);
	}
}


1.2、参数元数据

package com.rk.metadata;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.rk.utils.JDBCUtil;

//2. 参数元数据
public class Demo02
{
	public static void main(String[] args) throws SQLException
	{
		// 获取连接
		Connection conn = JDBCUtil.getConnection();
		// SQL
		String sql = "SELECT * FROM T_Dogs WHERE Name=? and Age>?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		// 参数元数据
		ParameterMetaData parameterMetaData = pstmt.getParameterMetaData();
		// 获取参数的个数
		int count = parameterMetaData.getParameterCount();
		System.out.println("count:" + count);
		
		JDBCUtil.closeQuietly(pstmt);
		JDBCUtil.closeQuietly(conn);
	}
}


1.3、结果集元数据

package com.rk.metadata;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.rk.utils.JDBCUtil;

//3. 结果集元数据
public class Demo03
{
	public static void main(String[] args) throws SQLException
	{
		// 获取连接
		Connection conn = JDBCUtil.getConnection();
		String sql = "SELECT * FROM T_Dogs";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		
		// 得到结果集元数据(目标:通过结果集元数据,得到列的名称)
		ResultSetMetaData rs_metaData = rs.getMetaData();
		
		// 迭代每一行结果
		while(rs.next())
		{
			// 1. 获取列的个数
			int count = rs_metaData.getColumnCount();
			
			// 2. 遍历,获取每一列的列的名称
			for(int i=0;i<count;i++)
			{
				// 得到列的名称
				String columnName = rs_metaData.getColumnName(i+1);
				//得到列的类型
				String columnClassName = rs_metaData.getColumnClassName(i+1);
				// 获取每一行的每一列的值
				Object columnValue = rs.getObject(columnName);
				// 测试
				System.out.print(columnName+"("+columnClassName+")="+columnValue+"\t");
			}
			System.out.println();
		}
		
		JDBCUtil.closeQuietly(rs);
		JDBCUtil.closeQuietly(pstmt);
		JDBCUtil.closeQuietly(conn);
	}
}


2、BaseDAO.java

BaseDAO.java

package com.rk.dao;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;

import com.rk.utils.JDBCUtil;

public class BaseDAO
{
	
	public void update(String sql,Object... paramValues)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		try
		{
			// 获取连接
			conn = JDBCUtil.getConnection();
			// 创建执行命令的stmt对象
			pstmt = conn.prepareStatement(sql);
			// 参数元数据: 得到占位符参数的个数
			ParameterMetaData metaData = pstmt.getParameterMetaData();
			int count = metaData.getParameterCount();
			
			// 设置占位符参数的值
			if(paramValues != null && paramValues.length>0)
			{
				// 循环给参数赋值
				for(int i=0;i<count;i++)
				{
					pstmt.setObject((i+1), paramValues[i]);
				}
			}
			// 执行更新
			pstmt.executeUpdate();
		}
		catch (SQLException e)
		{
			throw new RuntimeException(e);
		}
		finally
		{
			JDBCUtil.closeQuietly(pstmt);
			JDBCUtil.closeQuietly(conn);
		}
	}
	
	
	public <T> List<T> query(String sql,Class<T> clazz, Object... paramValues)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try
		{
			// 返回的集合
			List<T> list = new LinkedList<T>();
			
			// 1. 获取连接
			conn = JDBCUtil.getConnection();
			// 2. 创建stmt对象
			pstmt = conn.prepareStatement(sql);
			// 3. 获取占位符参数的个数, 并设置每个参数的值
			ParameterMetaData pmd = pstmt.getParameterMetaData();
			int parameterCount = pmd.getParameterCount();
			if(paramValues != null && paramValues.length>0)
			{
				for(int i=0;i<parameterCount;i++)
				{
					pstmt.setObject((i+1), paramValues[i]);
				}
			}
			// 4. 执行查询
			rs = pstmt.executeQuery();
			// 5. 获取结果集元数据
			ResultSetMetaData rsmd = rs.getMetaData();
			// ---> 获取列的个数
			int columnCount = rsmd.getColumnCount();
			
			// 6. 遍历rs
			while(rs.next())
			{
				// 要封装的对象
				T t = clazz.newInstance();
				// 7. 遍历每一行的每一列, 封装数据
				for(int i=0;i<columnCount;i++)
				{
					// 获取每一列的列名称
					String columnName = rsmd.getColumnName(i+1);
					String name = columnName.substring(0, 1).toLowerCase() + columnName.substring(1);
					// 获取每一列的列名称, 对应的值
					Object columnValue = rs.getObject(columnName);
					// 封装: 设置到t对象的属性中  【BeanUtils组件】
					BeanUtils.copyProperty(t, name, columnValue);
				}
				// 把封装完毕的对象,添加到list集合中
				list.add(t);
			}
			return list;
		}
		catch (Exception e)
		{
			throw new RuntimeException(e);
		}
		finally
		{
			JDBCUtil.closeQuietly(rs);
			JDBCUtil.closeQuietly(pstmt);
			JDBCUtil.closeQuietly(conn);
		}
	}
}

DogDAO.java

package com.rk.dao;

import java.util.List;

import com.rk.entity.DogInfo;

public class DogDAO extends BaseDAO
{
	public void save(DogInfo dog)
	{
		String sql = "INSERT INTO T_Dogs(Name,Age,BirthDay) VALUES(?,?,?)";
		super.update(sql,dog.getName(),dog.getAge(),dog.getBirthDay());
	}
	
	public List<DogInfo> findAll()
	{
		String sql = "SELECT * FROM T_Dogs";
		return super.query(sql, DogInfo.class);
	}
	
	public DogInfo findById(int id)
	{
		String sql = "SELECT * FROM T_Dogs WHERE Id=? ";
		List<DogInfo> list = super.query(sql, DogInfo.class, id);
		return (list != null && list.size()>0)?list.get(0):null;
	}
	
	public void update(DogInfo dog)
	{
		String sql = "UPDATE T_Dogs SET Name=?,Age=?,BirthDay=? WHERE Id=?";
		super.update(sql, dog.getName(),dog.getAge(),dog.getBirthDay(),dog.getId());
	}
	
	public void delete(int id)
	{
		String sql = "DELETE FROM T_Dogs WHERE Id=?";
		super.update(sql, id);
	}
}

Demo04.java

package com.rk.metadata;

import java.util.Date;
import java.util.List;

import com.rk.dao.DogDAO;
import com.rk.entity.DogInfo;

public class Demo04
{
	public static void main(String[] args)
	{
		//保存
//		DogInfo d = new DogInfo();
//		d.setName("汪汪");
//		d.setAge(2);
//		d.setBirthDay(new Date());
//		
//		DogDAO dao = new DogDAO();
//		dao.save(d);
		
		
		//查找所有
//		DogDAO dao = new DogDAO();
//		List<DogInfo> list = dao.findAll();
//		for(DogInfo dog : list)
//		{
//			System.out.println(dog);
//		}
		
		//查找特定id记录
//		DogDAO dao = new DogDAO();
//		DogInfo d = dao.findById(1);
//		System.out.println(d);
		
		//更新
//		DogInfo d = new DogInfo();
//		d.setId(1);
//		d.setName("旺财");
//		d.setAge(3);
//		d.setBirthDay(new Date());
//		DogDAO dao = new DogDAO();
//		dao.update(d);
		
		//删除
		DogDAO dao = new DogDAO();
		dao.delete(1);
	}
}


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯