开源组件:(4)用元数据和BeanUtils写一个简单的ORM映射BaseDAO.java
admin
2023-06-09 15:02:03
0次

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


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 List query(String sql,Class clazz, Object... paramValues)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try
		{
			// 返回的集合
			List list = new LinkedList();
			
			// 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 获取列的个数
			int columnCount = rsmd.getColumnCount();
			
			// 6. 遍历rs
			while(rs.next())
			{
				// 要封装的对象
				T t = clazz.newInstance();
				// 7. 遍历每一行的每一列, 封装数据
				for(int i=0;i

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 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 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 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);
	}
}


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...