91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何手寫mybatis框架

發布時間:2021-07-20 17:47:16 來源:億速云 閱讀:134 作者:chen 欄目:大數據

這篇文章主要介紹“如何手寫mybatis框架”,在日常操作中,相信很多人在如何手寫mybatis框架問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何手寫mybatis框架”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

手寫mybatis框架

simple-ibatis

前言:

很久沒有更新mybatis的源碼解析了,因為最近在將自己所理解的mybatis思想轉為實踐。 在學習mybatis的源碼過程中,根據mybatis的思想自己構建了一個ORM框架 。整個代碼都是自己手動構造,沒有一句代碼是Copy,肯定不如谷歌大神那樣的代碼,但已基本實現了SQL語句的實現和對象關系映射功能。若對源碼感興趣,可加入我一起寫這個項目。后文會附帶地址,若覺得不錯,希望手動star下哦! 項目地址:simple-ibatis

項目簡介:

simple-batis是自己編寫的一個簡單ORM框架。在學習mybatis源碼時,有感而發。耗時3周左右,基本滿足了一些常用的Sql操作本項目所涉及的代碼都是個人所寫,沒有一句copy,肯定不是很完善,大家理解下,后續有時間會一直更新。如果你對源碼感興趣,也可以加入一起,將自己的理解轉為代碼真的會加深印象。 代碼運行默認在java8上,因為用到了參數反射,所以在idea中記得開啟parameters;

開啟步驟如下 1.File->Settings->Build,Execution,Deployment->Compiler->Java Compiler 2.在 Additional command line parameters: 后面填上 -parameters 如何手寫mybatis框架

代碼簡介:

注釋 com.simple.ibatis.annotation

@Dao 標注在mapper類上。標志著該類是一個mapper類,在解析時會進行解析。

@Dao
public interface App1 {
}

@Select 標注在mapper類中的方法上。標志著該方法是一個Select方法,并在Select方法內部寫具體的sql語句。對于有參數注入的情況,參數使用{}進行代替。

@Select("SELECT name from sys_user where name = {user.name} and id = {id}")
List<String> test1(User user, int id);

@Param 標注在mapper類中的方法參數上。對參數名進行一次重命名。若不使用此注釋,會默認按照參數名當做注入的元素。

@Select("SELECT name from sys_user where id = {userId}")
List<String> test2(@Param("userId") int id);

@Update 標注在mapper類中的方法上。標志著該方法是一個Update方法。

@Update("update sys_user set name = {user.name} where id = {user.id}")
void update3(User user);

@Insert 標注在mapper類中的方法上。標注著該方法是一個Insert方法

@Insert("insert into sys_user(id,name) values ({user.id},{user.name})")
int insert4(@Param("user") User user);

@Delete 標注在mapper類中的方法上。標注著該方法是一個Delete方法

@Delete("delete from sys_user where id = {user.id}")
int delete5(@Param("user") User user);

數據庫注冊 com.simple.ibatis.driver

DriverRegister 提供數據庫注冊功能。未避免重復注冊,內部使用了一個緩存。

數據源 com.simple.ibatis.datasource

NormalDataSource 普通數據源,沒有池化的功能,提供獲取數據庫連接的功能。 PoolDataSource 池化數據源,存放著活躍連接列表和空閑連接列表。并對獲取連接和釋放連接做了一系列操作。 PoolConnection 連接的包裝類,除了存放真實連接外,還存放此連接被獲取時間,用于判斷連接是否超時。

核心類 com.simple.ibatis.core

Config 全局核心類,存放數據源,mapper包地址,mapper類解析文件 MapperCore mapper類解析文件 SqlSource 具體的sql語句封裝

代理類 com.simple.ibatis.mapping

MapperProxy mapper接口代理類。使用動態代理技術

執行器類 com.simple.ibatis.execute

Executor 執行器接口 SimpleExecutor 具體執行器,執行具體的sql方法。生成結果 ExecutorFactory 生成Executor的工廠類

反射類 com.simple.ibatis.reflect

ClassWrapper 類加強器,封裝了Object的get和set方法。 ObjectWrapper 對象包裝類。調用ObjectWrapper.setVal和getVal就可以設置和獲得屬性。不需要顯示的調用對象的getxxx和setxxx方法。 ObjectWrapperFactory 對象包裝類生成器

處理器類 com.simple.ibatis.statement

PreparedStatementHandle PreparedStatement生成器。將java屬性轉為jdbc屬性并注入。 ResultSetHandle 對查詢結構ResultSet進行解析,轉換為Java類型

工具類 com.simple.ibatis.util

PackageUti 解析包的工具類 TypeUtil 類型判斷的工具類

操作示例:

1. 構建pojo文件(并在數據庫中建立該表)

public class User {
private int id;

private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

2. 構建mapper文件

package com.simple.ibatis.mapper;

@Dao
public interface App1 {

@Select("SELECT * from sys_user")
List<User> select2();

@Select("SELECT name from sys_user where name = {user.name} and id = {id}")
List<String> select3(User user, @Param("id") int id);

@Update("update sys_user set name = {user.name} where id = {user.id}")
void update4(User user);

@Insert("insert into sys_user(id,name) values ({user.id},{user.name}) ")
int insert5(@Param("user") User user);
}

3. 構建數據源和執行器工廠類:

PoolDataSource poolDataSource = new PoolDataSource("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/auth","root","root");
/**輸入mapper文件所在包及數據源*/
ExecutorFactory executorFactory = new ExecutorFactory("com/simple/ibatis/mapper",poolDataSource);

4. 操作:

 /**拿到具體的mapper代理類*/
        SimpleExecutor executor = executorFactory.getExecutor();
        App1 app1 = executor.getMapper(App1.class);

        /**構建查詢條件*/
        User user = new User();
        user.setName("xiabing");
        user.setId(1);
        /**調用插入方法*/
        int count = app1.insert5(user);

        /**調用更新方法*/
        user.setName("root");
        app1.update4(user);

        /**查詢用戶名,返回字符*/
        List<String> users = app1. select3(user,3);
        System.out.println(users.get(0));

       /**查詢用戶,返回對象*/
       List<User> userLists = app1.select2();
       System.out.println(userLists.get(0).getName());

如何手寫mybatis框架

5. 框架待完善:

  1. 目前該框架僅支持注解注入SQL語句,不支持XML注入SQL語句

  2. 目前對象屬性不支持集合類,對象中也不支持嵌套非基本數據類型

  3. 框架中沒有加入緩存

  4. 解析mapper文件僅支持一個包下的mapper文件

到此,關于“如何手寫mybatis框架”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元谋县| 五台县| 普宁市| 潮州市| 景东| 滦平县| 新巴尔虎右旗| 安陆市| 永春县| 闽清县| 苏尼特左旗| 清新县| 宝山区| 博客| 九龙坡区| 龙川县| 广灵县| 盐源县| 社旗县| 峡江县| 镇原县| 泽普县| 西青区| 屏东县| 探索| 金沙县| 翁牛特旗| 邢台市| 若尔盖县| 永兴县| 福州市| 涟水县| 嘉义县| 措美县| 随州市| 天气| 海口市| 陵川县| 资兴市| 高雄市| 镇平县|