是用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. PHP 正则表达式 修饰符

    下面列出了当前可用的 PCRE 修饰符.括号中提到的名字是 PCRE 内部这些修饰符的名称. 模式修饰符中的空格,换行符会被忽略,其他字符会导致错误. i (PCRE_CASELESS) 如果设置了这 ...

  2. ajax跨域解决方案2

    配置文件添加: <system.webServer>       <httpProtocol>        <customHeaders>          &l ...

  3. word20161223

    UAM, user authentication module / 用户身份验证模块 UBR, unspecified bit rate / 未指定的传输率 UCS, Unicode Characte ...

  4. python正则表达式re

    Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...

  5. Python实现简单的Web完整版(一)

    在拖了一周之后,今天终于在一个小时之内将一个迷你的Web写出来了,最近改其它项目的bug头好大,但是好喜欢这样的状态. 黑色的12月,所有的任务都聚集在了12月,然后期末考试也顾不上好好复习了,但是但 ...

  6. Invoke的使用情景

    直接看代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat ...

  7. (转)Redis 的 5 个常见使用场景

    在这篇文章中,我们将阐述 Redis 最常用的使用场景,以及那些影响我们选择的不同特性. 1.会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cac ...

  8. 【笔记】js清空cookie

    $(function(){ function foreach(){  var strCookie=document.cookie;  var arrCookie=strCookie.split(&qu ...

  9. iOS 数据存储规则

    概观 iCloud的备份包括,它可以自动每天通过Wi-Fi备份用户的iOS设备.在您的应用程序的主目录都被备份,唯一的例外是应用程序本身捆绑,缓存目录和temp目录.购买的音乐,应用程序,电子书,相机 ...

  10. PHP发送短信功能

    发送短信的功能主要在于获得短信接口后,在函数中模仿用户行为,例如浏览器跳转输出短信接口的链接. 需要运用的函数为 curl_init(); curl_setopt(); curl_exec(); cu ...