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(虽然我知道出于性能的考虑这样做事不好的,不过自己 ...
随机推荐
- C#如何获取本机网络IP地址
在开发过程中我们经常会碰到需要IP地址,用来记录用户上次登录的时间地址,或者sokect网络编程等等,下面介绍两种方式: 1. public static string GetIP() { retur ...
- nio
1.I/O 输入输出流 (1) 指的是计算机与外界,或者程序与计算机之间数据交换的接口. (2) 在java编程中,使用 流(Stream) 的方式完成I/O , 所有的I/O都被视为单个字节的移动. ...
- SQL分页获取数据
SQL Server分页 select * from (') t Oracle分页 SELECT * FROM (' ORDER BY MaterialNM) t
- python+paramiko库+svn写的自动化部署脚本
第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...
- ubuntu专用
独立显卡处理驱动处理问题: http://blog.csdn.net/liufunan/article/details/52090382 git的教程: http://www.bootcss.com/ ...
- HTML5-本地存储与cookies
一.H5的几种存储形式 1.本地存储(localstorage和sessionstorage) 存储形式:key-->value 过期策略:localstorage永久存储,不过期,除非手动删除 ...
- Spring MVC返回Map格式JSON数据
问题描述: ajax中走error : function(e) {} 问题背景: 在测试controller层时,试过了ResponseEntity<ResponseModel>这种类型返 ...
- gnu coreutils-8.25 for win32 static - Beta
gnu.win32-coreutils-8.25.7z 2.7 Mb bc-1.06.tar.gz coreutils-8.25.tar.xz diffutils-3.5.tar.xz gawk-4. ...
- Android 通用流行框架
原文出处: http://android.jobbole.com/83028/ 1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 名称 描述 Andro ...
- Linux 搭建Java web服务器
未经允许,不得转载 1.jdk的下载与配置 1.1下载 sudo wget http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45- ...