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(虽然我知道出于性能的考虑这样做事不好的,不过自己 ...
随机推荐
- Python绘图
1.二维绘图 a. 一维数据集 用 Numpy ndarray 作为数据传入 ply 1. import numpy as np import matplotlib as mpl import mat ...
- 在布局中使用android.support.v4.app.Fragment的注意事项
1.Activity必须继承android.support.v4.app.FragmentActivity 2.fragment标签的name属性必须是完全限定包名,如下: <LinearLay ...
- iOS 强制退出程序APP代码
1.先po代码 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:self.exitapplication message:@" ...
- crontab详解
搜索 纠正错误 添加实例 crontab 提交和管理用户的需要周期性执行的任务 补充说明 crontab命令 被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成 ...
- 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整
学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...
- CAIN怎么嗅探路由密码
Cain & Abel 是由Oxid.it开发的一个针对Microsoft操作系统的免费口令恢复工具.号称穷人使用的L0phtcrack.它的功能十分强大,可以网络嗅探,网络欺骗,破解加密口令 ...
- 纯CSS弹出菜单(不支持IE6.0以下)
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 移动端H5页面高清多屏适配方案
背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...
- nova instance出错:"message": "Proxy error: 502 Read from server failed
执行 $ nova resize instance1 时候出错: {, "details": " File \"/opt/stack/nova/nova/com ...
- Thread Safety线程安全
Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分 如果disabled就选择nts(php_stomp-1.0.9-5.5-nts-vc11-x86.zi ...