orm映射 封装baseDao
是用orm映射封装自己封装dao层
思路:通过映射获得实体类的属性拼接sql语句
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import club.itstu.MyUtil.DbUtil;
import club.itstu.MyUtil.StringUtil; /**
* orm基础封装类
* BaseDao.java
* @author Mr储
* 2016-10-20 下午9:59:30
*/ public class BaseDao<T> {
private Class cls = null; //所操作是同类对应的Calss
private String tableName = null; //数据库的表名
private T t = (T) this; //当前对象
public DbUtil db = DbUtil.getInstance();//获取数据库的连接 public BaseDao(String tableName,Class cls){
super();
this.tableName = tableName;
this.cls = cls;
}
/**
* 保存对象(向数据库中增加数据)
*/
public boolean save(){
//通过映射获取实体类中的属性
Field[] fields = cls.getDeclaredFields();//获取类所有属性
//将要拼接的sql拆开
StringBuffer sqlbf1 = new StringBuffer("insert into "+tableName+" (");//存列名
StringBuilder sqlbf2 = new StringBuilder(" values (");
for(Field f:fields){
f.setAccessible(true);//私有属性设为可读
sqlbf1.append(f.getName()+",");
try {
if(f.get(t)==null||StringUtil.isEmpty(f.get(t)+"")){
sqlbf2.append("null,");
}else{
sqlbf2.append("'"+f.get(t)+"',");
} } catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
} String sql1 = sqlbf1.substring(0,sqlbf1.length()-1)+")";
String sql2 = sqlbf2.substring(0,sqlbf2.length()-1)+")";
db.insert(sql1+sql2);//执行sql
return true; } /**
* 查询单个对象(一条记录)
*
*/ public T find(){
//通过映射获得所有属性
Field[] fields = cls.getDeclaredFields();
//1=1 方便sql的拼接
StringBuffer sqlsb = new StringBuffer("select * from "+tableName+" where 1=1");
List<Object> params = new ArrayList<Object>();//存取属的值
List<String> fieldNmaeList = new ArrayList<String>();//存取属性名
//判读所有属性值是否为空
boolean paramsFlag = true;
for(Field f : fields){
f.setAccessible(true);//将属性设为可读的
fieldNmaeList.add(f.getName());//将属性名全部添加到容器中
try {
//判断该属性的值是否为空 +""将任何类型转换为字符串
if(f.get(t)!=null&&StringUtil.isNotEmpty(f.get(t)+"")){
sqlsb.append(" and "+f.getName()+"=? ");//在sql上添加查询条件
params.add(f.get(t));//将该值添加到容器中
paramsFlag = false;//将属性值改为不全部为空
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
if(paramsFlag){//属性值权为空 返回空的对象
return t;
}else{
//部位空时从数据库中取出满足改条件的记录
List<Map<String,Object>> rstList = db.query(sqlsb.toString(),params);
if(!rstList.isEmpty()){
Map<String,Object> m = rstList.get(0);//取出该条数据
//遍历将该数据 并通过属性名将该记录刚给属性赋值
for(String fieldName : fieldNmaeList){
Object value = m.get(fieldName);
//通过映射给对象赋值
setValue(fieldName,value);
}
}
}
//返回该对象
return t;
} /**
* 查询多个对象
*/
public List<T> findAll(){
List<T> resTList = new ArrayList<T>();//用来存储多个结果集
Field[] fields = cls.getDeclaredFields();//获取类所有属性
StringBuffer sfSql = new StringBuffer("select * from "+tableName+" where 1=1");
List<Object> params = new ArrayList<Object>();//存属性值
List<String> fieldNameList = new ArrayList<String>();//存属性名
for(Field f:fields){
f.setAccessible(true);//私有属性设为可读
fieldNameList.add(f.getName());
try {
if(f.get(t)!=null){
sfSql.append(" and " +f.getName()+"=? ");
params.add(f.get(t));
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
List<Map<String,Object>> resList = db.query(sfSql.toString(), params);
try {
if(!resList.isEmpty()){
//遍历多个结果集存入T类型的对象中
for(Map<String,Object> map:resList){
T tt = (T) cls.newInstance();
for(String fieldName:fieldNameList){
Object value = map.get(fieldName);
setValue(fieldName,value,tt);
}
resTList.add(tt);
} }
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return resTList;
}
/**
* 实体对象属性赋值
* @param name 属性名
* @param value 属性值
*/
private void setValue(String name,Object value){
String setName = name.substring(0,1).toUpperCase()+name.substring(1);//将属性名的首字母大写
String type = null;
if(value!=null){
type = value.getClass().getName();
if(type.equalsIgnoreCase("java.sql.Timestamp")||type.equalsIgnoreCase("java.sql.Date")){
// type = "java.util.Date";
type= "java.lang.String";
value = value+"";
}
} try {
if(value!=null){
Method method = cls.getDeclaredMethod("set"+setName, Class.forName(type));
method.invoke(t, value);
} } catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 实体对象属性赋值
* @param name 属性名
* @param value 属性值
* @param obj 要赋值的对象
*/
private void setValue(String name,Object value,T obj){
String setName = name.substring(0,1).toUpperCase()+name.substring(1);//将属性名的首字母大写
String type = null;
if(value!=null){
type = value.getClass().getName();
if(type.equalsIgnoreCase("java.sql.Timestamp")||type.equalsIgnoreCase("java.sql.Date")){
//type = "java.util.Date";
value = value+"";
type = "java.lang.String";
}
} try {
if(type!=null){
Method method = cls.getDeclaredMethod("set"+setName, Class.forName(type));
method.invoke(obj, value);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据id 删除对象
*/
public boolean deleteById(){
Method method =null;
Integer id = null;
try {
method = cls.getDeclaredMethod("getId");
id = (Integer)method.invoke(t);
if(id==null){
throw new Exception("主键为空");
}else{
db.delete("delete from "+tableName+" where id=?",id);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 根据id更新
*/
public boolean updateById(){
//获取所有属性
Field[] fields = cls.getDeclaredFields();
//sql语句
StringBuffer sqlsb = new StringBuffer("update "+tableName+" set "); Integer id = null; for(Field f : fields){
f.setAccessible(true);//将属性设为可读的
try {
//是“id”这个属性进入判断
if("id".equalsIgnoreCase(f.getName())){
//获得的对象为空更新失败
if(f.get(t)==null){
throw new Exception("主键id为空跟新失败");
}else{
//将该值赋给id
id = (Integer)f.get(t);
}
}else if(f.get(t)!=null){//对象不为空进入拼接sql语句
sqlsb.append(f.getName()+"='"+f.get(t)+"',");
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
String sql = sqlsb.toString();
if(sql.endsWith(",")){//该字符串逗号结束 说明属性有值 去除逗号 拼接sql
sql = sql.substring(0,sql.length()-1)+" where id="+id;
}else{
try {
throw new Exception("属性值为空,跟新失败");
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
db.update(sql);//执行
return true;
}
}
orm映射 封装baseDao的更多相关文章
- 同一个数据库实例,不同用户下多表创建视图,Hibernate完毕ORM映射,Spring整合,后台实现
1.同一个数据库实例.同用户,多表创建视图 2.同一个数据库实例,不同用户下.多表创建视图 3.同一个数据库,不同数据库实例,多表创建视图 4.不同类型数据库,多表创建视图 1.同一个数据库实例.同用 ...
- beego框架学习--beego orm映射
什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...
- ORM映射(对象关系映射)
ORM映射(对象关系映射)分创建表和操作表两个部分创建单表创建关联表(foreignKey) 一对一 一对多(重点) 多对多(重点) 创建表后加str方法把打印的地址转换成对应字符表的操作(增删改查) ...
- 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...
- Hibernate使用注解进行ORM映射实例
在上一篇博客中,我们通过xml配置文件进行实体类和表的映射,但是近两年来有更多的项目对一些比较稳定的实体类使用了注解进行ORM映射,这样使得编程更加简洁.简单.其实使用注解进行ORM映射和使用xml进 ...
- 第十九章 Django的ORM映射机制
第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...
- ORM映射和路由系统
ORM映射: OBJECT ====> 对象 RELATION ===> 联系 MODEL ===> 数据模型 安装pyMysql 安装flask-sqlAchemy 导入: fro ...
- 转:C#制作ORM映射学习笔记三 ORM映射实现
现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...
- 转:C#制作ORM映射学习笔记一 自定义Attribute类
之前在做unity项目时发现只能用odbc连接数据库,感觉非常的麻烦,因为之前做web开发的时候用惯了ORM映射,所以我想在unity中也用一下ORM(虽然我知道出于性能的考虑这样做事不好的,不过自己 ...
随机推荐
- Timequest收集命令
表 1. 收集命令 命令 说明 all_clocks 返回设计中所有时钟的收集. all_inputs 返回设计中输入端口的收集. all_outputs 返回设计中所有寄存器的收集. get_cel ...
- 第三篇 基于.net搭建热插拔式web框架(重造Controller)
由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...
- js储存参数的数组arguments
js函数中有个储存参数的数组arguments ,所有函数获得的参数会被编译器挨个保存到这个数组中.于是我们的js版支持参数默认值的函数可以通过另外一种变通的方法实现 function simue ( ...
- This is US 我们的生活
温情暖心剧 看点在于真实,能让人找到不少共鸣像极了平淡而操蛋的生活,不断交织着苦涩和甘甜,柴米油盐.酸甜苦辣.嬉笑打闹.悲欢离合.温情又不尽如人意 this is us,our life 生活有如柠檬 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- (转)CString截取字符串全攻略
附:去掉空格方法 CString str("e w r we 中华ADF 华AG中"); newstr=str.Replace(" ", "&quo ...
- 2016 Google code jam 答案
二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...
- Anti XSS 防跨站脚本攻击库
https://wpl.codeplex.com/ Before understanding Anti-Cross Site Scripting Library (AntiXSS), let us u ...
- Coding List
决定还是用回.net吧,一个人瞎搞比较快,在这里把进展做个简单的记录.
- Web服务器与数据库服务器分离 导入 Excel数据至数据库
一般情况一般项目WEB服务器与数据库均部署在一台服务器,文件上传,数据导入在一台服务器完成.web服务器与数据库服务器分离,文件上传与数据导入将分布在两台服务器或多台服务器之间.本案例为两台服务器,具 ...