1. 程式人生 > >純手寫ORM框架

純手寫ORM框架

1.首先定義一個實體類Book

public class Book {
	private Integer bookId;
	private String bookName;
	private String bookAuthor;
	private BigDecimal bookPrice;
	private Date bookDate;
//省略set/get方法
}

2.寫一個數據庫通用工具類:

public class DBUtil {
/**
 * 資料庫操作工具類
 */
	private static String DRIVER_CLASS="com.mysql.jdbc.Driver";
	private static String URL="jdbc:mysql:///bbs";
	private static String USER="root";
	private static String PASSWORD="123456";
	//封裝載入驅動
		static {
			try {
				Class.forName(DRIVER_CLASS);
			}catch(ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		//封裝連線資料庫
		public static Connection getConnection() {
			try {
				return DriverManager.getConnection(URL, USER, PASSWORD);
			}catch(SQLException e) {
				e.printStackTrace();
			}
			return null;
		}
		//定義通用的增刪改的方法
		//parameters佔位符sql語句對應的值組成的陣列
		public static int executeUpdate(String sql,Object...parameters) {
			int row=0;
			Connection conn=getConnection();
			PreparedStatement pst=null;
			try {
				pst=conn.prepareStatement(sql);
				//判斷有沒有引數需要設定
				if(parameters.length>0) {
					for(int i=0;i<parameters.length;i++) {
						//引數型別如何判斷呢。所有類都是object子類
						pst.setObject(i+1, parameters[i]);
					}
				}
				//執行sql語句
				row=pst.executeUpdate();
			}catch(Exception e) {
				e.printStackTrace();
			}finally {
				try {
					if(pst!=null) {
					pst.close();
					}
				}catch(SQLException e) {
					e.printStackTrace();
				}
				try {
					if(conn!=null) {
					conn.close();
					}
				}catch(SQLException e) {
					e.printStackTrace();
				}
			}
			return row;
		}
    }

3.現在我們寫一個測試方法

@Test
	public void testInsert() {
		String insertSQL="insert into book(bookAuthor,bookName,bookPrice,bookDate)values(?,?,?,?)";
		Object[] parameters= {
				"小李",
				"新的圖書",
				new BigDecimal(45.6),
				new Date()
		};
		int row=DBUtil.executeUpdate(insertSQL, parameters);
		System.out.println(row>0?"成功":"失敗");
	}

4.現在我們是可以測試成功的,可以看出來我們需要實現的其實就是sql語句和引數,下面我們手動實現底層程式碼

public class BeanUtil {
//通用持久化物件的方法實現
	public<T> int persist(T entity) throws MyORMException{
		StringBuilder sqlBuilder=new StringBuilder("INSERT INTO ");
		//儲存引數的集合列表
		List<Object>parameters=new ArrayList<Object>();
		//獲取當前操作類的名稱
		Class<?> cl=entity.getClass();
		String name=cl.getSimpleName();
		sqlBuilder.append(name).append("(");
		//獲取當前操作類中定義的屬性
		Field[] fields=cl.getDeclaredFields();
		if(fields!=null&&fields.length>0) {
			for(int i=0;i<fields.length;i++) {
			Field field=fields[i];
			//獲取欄位對應值
			field.setAccessible(true);
			Object value = null;
			try {
				value = field.get(entity);
			} catch (Exception e) {
				throw new MyORMException("獲取"+field.getName()+"欄位值的時候出現異常"+e.getMessage());
				
			}
			//判斷值是否為空
			if(value!=null) {
				sqlBuilder.append(field.getName()).append(",");
				parameters.add(value);
			}
			}
			//刪除最後一個逗號
			sqlBuilder.deleteCharAt(sqlBuilder.length()-1);
		}
		sqlBuilder.append(")").append("values (");
		//組裝引數列表
		for(int i=0;i<parameters.size();i++) {
			sqlBuilder.append("?,");
		}
		//刪除最後一個逗號
		sqlBuilder.deleteCharAt(sqlBuilder.length()-1).append(")");
		System.out.println(sqlBuilder);		
		return DBUtil.executeUpdate(sqlBuilder.toString(), parameters.toArray(new Object[parameters.size()]));
	}

}

5.測試方法,現在使用者只需要傳入物件不需要寫sql語句就可以實現儲存了

@Test
	public void testSave() {
		BookDAOImpl dao=new BookDAOImpl();
		Book book=new Book();
		book.setBookAuthor("張三");
		book.setBookDate(new Date());
		book.setBookName("我的圖書");
		book.setBookPrice(new BigDecimal(34.5));
		int row=dao.saveBook(book);
		System.out.println(row>0?"成功":"失敗");
	}

6.框架肯定少不了異常處理,自己寫一個全域性異常處理,裡面是重寫了父類的構造方法

public class MyORMException extends RuntimeException{

	public MyORMException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public MyORMException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
		super(arg0, arg1, arg2, arg3);
		// TODO Auto-generated constructor stub
	}

	public MyORMException(String arg0, Throwable arg1) {
		super(arg0, arg1);
		// TODO Auto-generated constructor stub
	}

	public MyORMException(String arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}

	public MyORMException(Throwable arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}
	 
}

相關推薦

ORM框架

1.首先定義一個實體類Book public class Book { private Integer bookId; private String bookName; private String bookAuthor; private BigDecimal bo

高手過招「效能優化/SpringMVC框架/MySql優化/微服務」

效能優化那些絕招,一般人我不告訴他 1,支付寶介面的介面如何正確呼叫; 2,從併發程式設計角度來提高系統性能; 3,系統響應的速度縮短N倍的祕密; 4,從Futuretask類原始碼分析到手寫; 5,快速提升Web專案吞吐量;   300行精華程式碼:純手寫SpringMVC框

基於Spring JDBCORM框架

ORM 物件關係對映(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料,將程式中的物件自動持久化到關係資料庫中。 基本框架

Mybatis框架

介面層-和資料庫互動的方式 MyBatis和資料庫的互動有兩種方式: 使用傳統的MyBatis提供的API; 使用Mapper介面; 使用Mapper介面 MyBatis 將配置檔案中的每一個<mapper> 節點抽象為一個 Mapper 介面: 這個

Mybatis框架視訊教程【免費觀看】

第一節(純手寫Mybatis註解版本框架-專案演示)第二節(純手寫Mybatis註解版本框架-mybatis基礎知識回顧與JDBCUtils工具類)第三節(純手寫Mybatis註解版本框架-環境搭建)第

SpringMVC框架,用註解實現springmvc過程

開發十年,就只剩下這套架構體系了! >>>   

SpringBoot框架之註解方式啟動SpringMVC容器

使用Java語言建立Tomcat容器,並且通過Tomcat執行Servlet,接下來,將會使用Java語言在SpringBoot建

重學 Java 設計模式:實戰中介者模式「按照Mybatis原理ORM框架,給JDBC方式操作資料庫增加中介者場景」

![](https://img-blog.csdnimg.cn/20200627092858193.jpg) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) - `原創系列專題文章` >沉澱、分享、成長,讓自己和他人都能有所收穫!

Spring Boot2.0之框架

框架部分重點在於實現原理,懂原理! 廢話不多說,動手幹起來! SpringMVC程式入口? 沒有配置檔案,Spring 容器是如何載入? 回顧我們之前搭建Spring Boot專案使用的pom 引入的依賴需要parent,其作用是支援依賴 快速整合框架 不需要寫版本號 還有就是web元件,自動引入s

SpringMVC到SpringBoot框架專案實戰

引言 Spring Boot其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。 通過這種方式,springboot是一個快速整合第三方框架的,簡化了xml的配置,專案中再也不包含web.xml檔案了

SpringBoot2.0框架視訊教程【免費分享】

 第一節-純手寫SpringBoot框架之專案演示 第二節-純手寫SpringBoot框架之原生環境搭建 第三節-純手寫SpringBoot框架之原理剖析 第四節-純手寫SpringBoot框架之建立內建Tomcat容器 第五節-純手寫SpringBoot框架之註解方式啟動S

簡易-五星評分-jQuery

開始 round size dcl cas blog ren func fin 超級簡單的評分功能,分為四個步驟輕松搞定: 第一步:   引入jquery文件;這裏我用百度CDN的jquery: <script src="http://apps.bdimg.com/

自己ORM框架 DBUtils

技術 外部 acl reat 開源 htm pac top enter ORM框架想必大家都比較熟知了,即對象關系映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不同類

vue10行代碼實現上拉翻頁加載更多數據,js實現下拉刷新上拉翻頁不引用任何第三方插件

each ray 如果 部分 list 插件 下拉 ast 頁面數據 vue10行代碼實現上拉翻頁加載更多數據,純手寫js實現下拉刷新上拉翻頁不引用任何第三方插件/庫 一提到移動端的下拉刷新上拉翻頁,你可能就會想到iScroll插件,沒錯iScroll是一個高性能,資源占用

css3loading效果

-s 1.3 utf AC keyframes title sca osi inf <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

ORM第一版

pop singleton .... exc sta 對象 說明 ise list ORM第一版: #Author = __rianley cheng__ #ORM 簡易版 from mysql_ import Mysql class Fileld:

轉載:SpringMVC框架

javaee 作用 小寫 繼承 inf group css finally 減少 帶你手寫一個SpringMVC框架(有助於理解springMVC) 鏈接:https://my.oschina.net/liughDevelop 作者:我叫劉半仙 Spring

大學生簡單網頁div+css網頁代碼制作html靜態頁面切圖排版

靜態頁面 靜態頁 watermark 簡單 ima 大學生 ges 51cto mar 了解下下+2425691680 大學生簡單網頁div+css網頁純手寫代碼制作html靜態頁面切圖排版

springboot專案(詳細)

導語:不會用eclipse建立springboot專案?也不會用IDEA建立springboot專案?沒關係,會建立資料夾和文字文件就行。 1、springboot專案目錄結構 springboot專案檔案目錄結構   &nb

linux入門考試題答案(個人)

考試資訊: IPADDR: 172.25.254.x(X 在這裡指您的工作站編號加100) NETMASK: 255.255.255.0 GATEWAY: 172.25.254.250 DNS: 172.25.254.250 yum源地址為:http://172.25.254.250/rhel7