是用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的更多相关文章

  1. 同一个数据库实例,不同用户下多表创建视图,Hibernate完毕ORM映射,Spring整合,后台实现

    1.同一个数据库实例.同用户,多表创建视图 2.同一个数据库实例,不同用户下.多表创建视图 3.同一个数据库,不同数据库实例,多表创建视图 4.不同类型数据库,多表创建视图 1.同一个数据库实例.同用 ...

  2. beego框架学习--beego orm映射

    什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...

  3. ORM映射(对象关系映射)

    ORM映射(对象关系映射)分创建表和操作表两个部分创建单表创建关联表(foreignKey) 一对一 一对多(重点) 多对多(重点) 创建表后加str方法把打印的地址转换成对应字符表的操作(增删改查) ...

  4. 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  5. Hibernate使用注解进行ORM映射实例

    在上一篇博客中,我们通过xml配置文件进行实体类和表的映射,但是近两年来有更多的项目对一些比较稳定的实体类使用了注解进行ORM映射,这样使得编程更加简洁.简单.其实使用注解进行ORM映射和使用xml进 ...

  6. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  7. ORM映射和路由系统

    ORM映射: OBJECT ====> 对象 RELATION ===> 联系 MODEL ===> 数据模型 安装pyMysql 安装flask-sqlAchemy 导入: fro ...

  8. 转:C#制作ORM映射学习笔记三 ORM映射实现

    现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...

  9. 转:C#制作ORM映射学习笔记一 自定义Attribute类

    之前在做unity项目时发现只能用odbc连接数据库,感觉非常的麻烦,因为之前做web开发的时候用惯了ORM映射,所以我想在unity中也用一下ORM(虽然我知道出于性能的考虑这样做事不好的,不过自己 ...

随机推荐

  1. Boost正则表达式的编译与使用方法集

    下载boost 在boost官网上下载任何版本都可以www.boost.org . 将boost压缩包解压到D盘目录下 (我下载的是boost_1_54_0.zip),目录为D:\boost_1_54 ...

  2. Max double slice sum 的解法

    1. 上题目: Task description A non-empty zero-indexed array A consisting of N integers is given. A tripl ...

  3. 深入理解 JavaScript 变量的作用域和作用域链

    一个变量的作用域(scope)是程序源代码中定义这个变量的区域.简单的说,作用域就是变量与函数的可访问范围.全局变量拥有全局作用域,在JavaScript代码中的任何地方都有定义.局部变量是在函数体内 ...

  4. yii2 登录用户和未登录用户使用不同的 layout

    可以在配置文件中增加一个 “beforeRequest” 事件: 'on beforeRequest' => function () { Yii::$app->layout = Yii:: ...

  5. hosts 屏蔽百度

    127.0.0.1 localhost  cpro.baidu.com vie.baidu.com  cpro.baidu.com  ubmcmm.baidustatic.com  uumcmm.ba ...

  6. c#获取外网IP地址的方法

    1.如果你是通过路由上网的,可以通过访问ip138之类的地址来获取外网IP 2.如果是通过PPPOE拨号上网的,可以使用以下代码获取IP //获取宽带连接(PPPOE拨号)的IP地址,timeout超 ...

  7. amazeui折叠面板智能化展开

    2016年12月12日 21:05:18 星期一 场景: 我拿这个组件用作管理后台的侧边栏 效果: 根据当前访问的url不同, 展开不同的面板 amazeui折叠面板 js代码: <script ...

  8. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  9. Centos7 wifi

    centos7如果在安装系统选择安装软件的选项是gnome套件(要注意退出选择界面回到安装界面时软件选项显示的是gnome,仅仅选择了gnome的软件也不行),安装完成后就会有wifi的图标,下面的方 ...

  10. Mac OS X 上安装 ASP.NET 5

    在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本 ...