`
liuxing521a
  • 浏览: 431 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

简单的对象数据库操作

阅读更多

不足地方希望大神指点,欢迎讨论

 

首先定义可操作类接口,所有想进行数据库操作的都实现这个接口;

接口定义很简单, 

getId()  其实就是获取对象的主键,在这可能定义不准确

modify 列用了java8的函数结构定义可修改属性;其作用就是可以单独同步修改属性,本文中没有用到,暂时放这吧,以后有空在上传怎么用这个函数;

代码如下

package mypack;


public interface HashID {

public Object getId();

/**
* 修改标记
* @param name 修改的属性名
*/
default void modify(String name) {
ORMUtils.modifys.add(name);
}

}

 

// 主键注解,在主键增加@Primarykey 标识为主键;详细用法建议java core中注解;

package mypack;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Primarykey {


}

 

 

对象的数据库操作:

本列子全部用定义的类名,字段名作为数据库表名以及字段名;其实还可以用xml配置(如hibernate的配置),json, 注解等多种设置进行 数据库字段名和类名称,字段名进行映射。废话不多说,直接上代码

package mypack;


import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;


public class ORMUtils {


static Set<String> modifys = new HashSet<>();

public static Connection getConn() throws Exception {
String driver = "com.mysql.jdbc.Driver";//mysql驱动,不解释
String url = "jdbc:mysql://127.0.0.1:3306/test";//mysql连接url,不解释
String user = "root";//mysql用户
String password = "123456";//mysql密码
Class.forName(driver); //加载驱动
return DriverManager.getConnection(url, user, password);//获取连接
}

public static void doInsert(HashID data) throws Exception {
List<Field> fieldList = new LinkedList<>();
getAllFeild(fieldList, data.getClass());

StringBuffer keys = new StringBuffer();
StringBuffer values = new StringBuffer();
for (Field field : fieldList) {
if (keys.length() > 0) {
keys.append(",");
values.append(",");
}
//字段名用定义属性名处理,可以用hibernate类是的xml配置,注解等其他方式处理
keys.append("`").append(field.getName()).append("`");
values.append("?");
}

//生成插入sql,不做关联处理(左联,右联,内联等)
StringBuffer sql = new StringBuffer();
sql.append("INSERT INTO `");
//此处为表名,我以类名为表名;可以用hibernate类似的xml配置,注解等多种方式
sql.append(data.getClass().getSimpleName());
sql.append("` ( ").append(keys).append(") VALUES (").append(values.toString()).append(");");

try (Connection conn = getConn();PreparedStatement statement = conn.prepareStatement(sql.toString())) {
int index = 1;
for (Field field : fieldList) {
setStatement(statement, index, data, field);
index ++;
}

statement.executeUpdate();
}

}

//  此处不处理,详细见根据主键检索doSelect(Class<T> clazz, Object Id)
//public <T extends HashID> T doSelect(Class<T> clazz, String sql) {
//List<Field> fieldList = new LinkedList<>();
//
//return null;
//}
//
// 检索,返回单个对象;返回多个有空增加
public static <T extends HashID> T doSelect(Class<T> clazz, Object Id) throws Exception {
List<Field> fieldList = new LinkedList<>();
getAllFeild(fieldList, clazz);

// 此处查找主键
Field key = null;
for (Field field : fieldList) {
if (field.isAnnotationPresent(Primarykey.class)) {
key = field;
break;
}
}

// 主键不存在,不能处理;自己写sql查询
if (key == null) {
throw new RuntimeException("unkown select key:" + Id);
}

// 查询sql,根据 主键检索,此处用定义属性名。可以用配置,或者注解等其他方式
String sql = "SELECT * FROM `" + clazz.getSimpleName() + "` where `" + key.getName() + "` = " + Id +";";


try (Connection conn = getConn();
PreparedStatement statement = conn.prepareStatement(sql);
ResultSet result = statement.executeQuery()) {
if (result.next()) {
// 注意:此类一定要有public 的无参数构造方法,当然可以自行处理有参数构造方法
T data = clazz.newInstance();

for (Field field : fieldList) {
//属性赋值
setValue(result, data, field);
}
return data;
} else {
return null;
}
}
}

public static void doUpdate(HashID data) throws Exception {
List<Field> fieldList = new LinkedList<>();
getAllFeild(fieldList, data.getClass());

Field key = null;
StringBuffer keys = new StringBuffer();
for (Field field : fieldList) {
if (field.isAnnotationPresent(Primarykey.class)) {
key = field;
}

if (keys.length() > 0) {
keys.append(",");
}
//字段名用定义属性名处理,可以用hibernate类是的xml配置,注解等其他方式处理
keys.append("`").append(field.getName()).append("` = ?");
}

StringBuffer sql = new StringBuffer();
sql.append("UPDATE `").append(data.getClass().getSimpleName());
sql.append("` SET ").append(keys.toString());
sql.append(" WHERE `").append(key.getName()).append("` = ").append(data.getId()).append(";");

try (Connection conn = getConn();
PreparedStatement statement = conn.prepareStatement(sql.toString())) {
int index = 1;
for (Field field : fieldList) {
setStatement(statement, index, data, field);
index ++;
}
statement.executeUpdate();
}
}

public static void doDelete(HashID data) throws Exception {
doDelete(data.getClass(), data.getId());
}

public static void doDelete(Class<?> clazz, Object Id) throws Exception {
List<Field> fieldList = new LinkedList<>();
getAllFeild(fieldList, clazz);

Field key = null;
for (Field field : fieldList) {
if (field.isAnnotationPresent(Primarykey.class)) {
key = field;
break;
}
}

String sql = "DELETE FROM `" + clazz.getSimpleName() + "` WHERE `"  + key.getName() + "` = " + Id + ";";
System.out.println(sql);
try (Connection conn = getConn();
PreparedStatement statement = conn.prepareStatement(sql)) {
statement.executeUpdate();
}
}

private static void setStatement(PreparedStatement statement, int index, HashID data, Field field) throws Exception {
boolean isAccess = field.isAccessible();
try {
//关闭安全检查,否者读取不到私有的属性
field.setAccessible(true);
if (field.getType() == byte.class || field.getType() == Byte.class ) {
statement.setByte(index, field.getByte(data));
} else if (field.getType() == boolean.class || field.getType() == Boolean.class ) {
statement.setBoolean(index, field.getBoolean(data));
} else if (field.getType() == short.class || field.getType() == Short.class ) {
statement.setShort(index, field.getShort(data));
} else if (field.getType() == char.class || field.getType() == Character.class ) {
statement.setString(index, String.valueOf(field.getChar(data)));
} else if (field.getType() == int.class || field.getType() == Integer.class ) {
statement.setInt(index, field.getInt(data));
} else if (field.getType() == float.class || field.getType() == Float.class ) {
statement.setFloat(index, field.getFloat(data));
} else if (field.getType() == long.class || field.getType() == Long.class ) {
statement.setLong(index, field.getLong(data));
} else if (field.getType() == double.class || field.getType() == Double.class ) {
statement.setDouble(index, field.getDouble(data));
} else if (field.getType() == String.class) {
statement.setString(index, field.get(data).toString());
} else if (field.getType() == Timestamp.class){
statement.setObject(index, field.get(data));
} else {
//本列只支持以上类型,如果需要新类型自行增加处理;泛型处理也可以支持,由于空闲时间有限,泛型类型较为复杂,此处不做处理,以后有机会再发泛型处理
throw new RuntimeException("uns provided type:" + field.getType());
}
} finally {
field.setAccessible(isAccess);
}
}

private static void setValue(ResultSet result, HashID data, Field field) throws Exception {
boolean isAccess = field.isAccessible();
try {
//关闭安全检查,否者读取不到私有的属性
field.setAccessible(true);
if (field.getType() == byte.class || field.getType() == Byte.class ) {
field.setByte(data, result.getByte(field.getName()));
} else if (field.getType() == boolean.class || field.getType() == Boolean.class ) {
field.setBoolean(data, result.getBoolean(field.getName()));
} else if (field.getType() == short.class || field.getType() == Short.class ) {
field.setShort(data, result.getShort(field.getName()));
} else if (field.getType() == char.class || field.getType() == Character.class ) {
field.set(data, result.getString(field.getName()).charAt(0));
} else if (field.getType() == int.class || field.getType() == Integer.class ) {
field.setInt(data, result.getInt(field.getName()));
} else if (field.getType() == float.class || field.getType() == Float.class ) {
field.setFloat(data, result.getFloat(field.getName()));
} else if (field.getType() == long.class || field.getType() == Long.class ) {
field.setLong(data, result.getLong(field.getName()));
} else if (field.getType() == double.class || field.getType() == Double.class ) {
field.setDouble(data, result.getDouble(field.getName()));
} else if (field.getType() == String.class) {
field.set(data, result.getString(field.getName()));
} else if (field.getType() == Timestamp.class){
field.set(data, result.getTimestamp(field.getName()));
} else {
//本列只支持以上类型,如果需要新类型自行增加处理;泛型处理也可以支持,由于空闲时间有限,泛型类型较为复杂,此处不做处理,以后有机会再发泛型处理
throw new RuntimeException("uns provided type:" + field.getType());
}
} finally {
field.setAccessible(isAccess);
}
}

// 获取所有定义属性,此处不做特殊处理;如果需要的自行处理,比如static final 等定义
// 还可以用注解方式决定是否处理该属性
private static void getAllFeild(List<Field> fieldList, Class<?> clazz) {
if (clazz == Object.class) {
return;
} else {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
fieldList.add(field);
}

getAllFeild(fieldList, clazz.getSuperclass());
}
}

}

//本示列用的mysql数据库,驱动自行下载

// 建表语句

CREATE TABLE `userinfo` (
  `Id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(24) DEFAULT '',
  `sex` tinyint(1) DEFAULT '0',
  `age` smallint(6) DEFAULT '0',
  `money` float(6,2) DEFAULT '0.00',
  `bornTime` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

测试列子

package mypack;


import java.sql.Timestamp;


public class UserInfo implements HashID {
@Primarykey
private int Id;
private String name;
private byte sex;
private short age;
private float money;
private Timestamp bornTime;

@Override
public Object getId() {
return Id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public byte getSex() {
return sex;
}


public void setSex(byte sex) {
this.sex = sex;
}


public short getAge() {
return age;
}


public void setAge(short age) {
this.age = age;
}


public float getMoney() {
return money;
}


public void setMoney(float money) {
this.money = money;
}


public Timestamp getBornTime() {
return bornTime;
}


public void setBornTime(Timestamp bornTime) {
this.bornTime = bornTime;
}


public void setId(int id) {
Id = id;
}

@Override
public String toString() {
return String.format("Id=%s, name=%s, age=%s, borntime=%s", Id, name, age, bornTime);
}

public static void main(String[] args) throws Exception {
//插入测试
//UserInfo info = new UserInfo();
//info.setId(1024);
//info.setName("刘振");
//info.setAge((short)80);
//info.setSex((byte)1);
//info.setMoney(50.5f);
//info.setBornTime(new Timestamp(System.currentTimeMillis()));
//ORMUtils.doInsert(info);

//检索测试
UserInfo info = ORMUtils.doSelect(UserInfo.class, 1024);
System.out.println(info);

// 修改测试
//info.setName("刘宇轩");
//info.setAge((short)1);
//info.setBornTime(new Timestamp(System.currentTimeMillis()));
//ORMUtils.doUpdate(info);
//System.out.println(info);

//删除测试
ORMUtils.doDelete(info);
}


}

分享到:
评论

相关推荐

    面向对象数据库系统讲义

    面向对象数据库系统(Object-Oriented Database System,简称OODBMS)是一种存储和管理对象的数据管理系统,对象包含了数据和操作数据的方法。相比关系型数据库,面向对象数据库更能体现数据的自然结构,支持继承、...

    一个php面向对象数据库操作类库.zip

    一个php面向对象数据库操作类库,注意使用时最后不要忘记关闭数据路连接$SqlDB-&gt;Close();当然这句可以不要,php会自动注销!但是这样能够养成一个好的习惯,最好还是加上!

    面向对象数据库系统及其应用PDF教程

    面向对象数据库系统允许存储和操作具有类、对象、继承、封装和多态性等特性的数据,为处理复杂的、非结构化或半结构化的数据提供了强大工具。 在"面向对象数据库系统及其应用"PDF教程中,可能会涵盖以下几个核心...

    对象数据库-第一次设计

    事务确保了数据库操作的一致性和可靠性,即使在系统故障或并发操作下也能保证数据的完整性。 7. **数据库管理系统**:市场上有许多对象数据库管理系统,如Objectivity/DB、GemStone、MongoDB(尽管MongoDB是文档...

    IOS对象操作数据库YUDBFramework.zip

    YUDBFramework 是功能强大、操作简单、轻量级、对象一键操作数据库。 感谢 FMDB DBOBject 使用 runtime fmdb 封装 1.自动建表 2.自动检查增删表字段 3.自定义数据库名,文件路径 4.支持一对一对象...

    对象数据库系统与关系数据库间特性解析

    面向对象数据库系统(OODBS)和关系数据库系统(RDBMS)是两种主要的数据库管理系统,它们在设计理念和数据表示上存在显著差异。OODBS结合了数据库管理和面向对象编程的特性,使得数据和程序设计更加紧密集成。面向对象...

    面向对象的mysql数据库操作php类.zip

    php面象对象数据库操作类,构造一个数据库操作类,封装所有数据库操作,可以扩展便于后台管理程序的使用,取回数据库记录数,返回数据库表字段数和表字段名称集,最后不要忘记关闭数据路连接。

    移动对象数据库Moving object Databases

    对移动数据库有一简单介绍: 主要关心如何连续的维护移动对象的当前位置信息以及近期的位置信息。 视觉考虑将移动对象的整个移动历史都存储在数据库中,并且可以执行针对过去或者未来的任何时间查询。 那么就要扩展...

    对象数据库db4o对象数据库db4o

    db40的设计目标是让数据库操作变得简单,使得开发者可以更专注于业务逻辑,而非数据管理。 ### 主要特性 1. **透明持久化**:db4o能够自动处理对象的持久化,只需简单地打开数据库,将对象存入,关闭数据库,对象...

    简单数据库操作示例

    在本示例中,我们将探讨“简单数据库操作示例”,它利用了OleDb技术,这是一种通用接口,允许应用程序访问多种不同类型的数据库。通过这个小示例,你可以了解到如何与数据库进行交互,包括数据的增、删、改、查等...

    php面象对象数据库操作类.zip

    php面象对象数据库操作类,构造一个数据库操作类,封装所有数据库操作,可以扩展便于后台管理程序的使用,取回数据库记录数,返回数据库表字段数和表字段名称集,最后不要忘记关闭数据路连接。

    数据库操作简易工具

    数据库操作简易工具是一种高效便捷的解决方案,专为简化SQLSERVER和MYSQL等常见数据库的管理和查询工作而设计。这种工具的出现使得用户无需安装数据库服务器的完整编辑器套件,即可进行基本到高级的各种数据库操作,...

    易语言数据库操作演示源码

    在易语言中,数据库操作是常见的功能之一,它允许开发者与各种数据库系统进行交互,如MySQL、SQL Server、Oracle等。本压缩包提供的是易语言数据库操作的演示源码,通过分析和学习这些源码,我们可以深入了解易语言...

    黑月ADODB数据库操作类1.33版易语言模块源码

    了解并熟练掌握这个易语言模块,将极大提升开发者在数据库操作方面的效率,无论是进行简单的数据存取还是复杂的业务逻辑处理,都能游刃有余。同时,由于其对Excel的支持,也可以方便地处理大量表格数据,对于数据...

    黑月ADODB数据库操作类1.32版易语言模块源码

    在这个源码中,开发者利用易语言构建了一个数据库操作类,该类主要基于ADODB.Connection对象,这是ADODB接口的核心组件,用于建立与数据库的连接。 1. ADODB.Connection对象: ADODB.Connection对象是所有数据库...

    易语言数据库操作实例

    在"易语言数据库操作实例"这个主题中,我们将深入探讨如何使用易语言进行数据库的交互与管理。 首先,数据库操作是任何应用程序中的核心部分,无论是在产品管理、数据分析还是日常事务处理中,都需要频繁地存取、...

    基于对象数据库的扩展Java集合框架.pdf

    本文提出的基于对象数据库的Java集合框架的扩展可以解决传统的数据持久化方法中存在的易用性和效率问题,并且提供了一个统一的接口来访问和操作对象数据库。这将有助于提高数据持久化的效率和易用性,并且为大型的...

Global site tag (gtag.js) - Google Analytics