基于 spring jdbc 的上層封裝

DanHemmant 8年前發布 | 34K 次閱讀 數據庫 JDBC Spring JEE框架

來自: http://git.oschina.net/sxjun1904/MiniJdbc

MiniJdbc - 介紹&使用說明

sxjun @2016-01-15

一、MIniJdbc介紹

1、MiniJdbc只是針對spring jdbc的一些不方便的地方,做了一些封裝,大小寫不敏感,簡化了日常的開發工作。 基于spring jdbc的RowMapper自動實現對象映射,大部分功能已經由spring jdbc實現了。

2、BaseEntity的設計:集成了JFinal的Record的優點,對字段的大小寫不敏感。

3、RowMapper的改造:集成了SBORM的優點,對BaseEntityRowMapper做了些修改。

4、數據庫的支持:目前已經支持MySql、SqlServer、Oracle數據庫,屏蔽了數據庫的語法差異。

5.強弱類型完美結合:例如,在數據庫插入一個用戶:

//強類型編程
User user = new User();//新建User對象,表名和主鍵在實體注解中定義
user.setName("admin").setPassword("000000");//設置數據
dao.insert(user);//保存用戶

//弱類型編程 Record record = new Record("user","id");//新建記錄對象,構造函數傳表名和主鍵 record.set("name", "admin").set("password", "000000");//設置數據 dao.insert(record);//保存用戶</pre>

6.大小寫不敏感:弱類型編程中,對應表、字段的大小寫不敏感。

//設置name字段,可以小寫
record.set("name", "admin");
//也可以大寫
record.set("NAME", "admin");
//還可以隨意寫
record.set("NaMe", "admin");

二、MiniDao全部接口

接口中強類型和弱類型都使用統一的DAO接口; [Record.class(弱類型);BaseEntity.class(強類型基類)]

//插入數據
public <T extends Record> int insert(T record);
//刪除數據
public <T extends Record> int delete(T record);
//刪除數據
public int deleteById(Class<? extends BaseEntity> clazz, Object primaryKey);
//更新數據
public <T extends Record> int update(T record);
//執行sql語句
public int execute(String sql, Object... paras);
//根據ID查找單個實體
public <T extends BaseEntity> T findById(Class<? extends BaseEntity> clazz, Object primaryKey);
//查找單條記錄
public <T> T find(String sql, Class clazz, Object... args);
//查找一個list
public <T extends Record> List<T> findList(String sql, Class clazz, Object... args);
//分頁查找一個list
public <T extends Record> List<T> paginate(String sql,int pageNumber, int pageSize, Class clazz, Object... args);
//獲取分頁Record數據
public <T extends Record> PageResult<T> paginateResult(String sql, int pageNumber, int pageSize, Class clazz, Object... args);

三、使用說明

1、配置規范

配置文件 datasource配置包括3部分 :掃描包、數據源、動態數據源,和普通的spring配置一致;

(連接池使用看個人喜好):

<!-- 1.配置掃描包 -->
<context:component-scan base-package="com.mini"/>

<!-- 2.配置druid數據源 --> <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource" > <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.database}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> <property name="initialSize" value="3" /> <property name="minIdle" value="3" /> <property name="maxActive" value="20" /> <property name="maxWait" value="60000" /> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="filters" value="stat" /> </bean>

<!-- 3.配置動態數據源 --> <bean class="com.mini.core.dynamic.DynamicDataSource"> <property name="defaultTargetDataSource" ref="dataSource"></property> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="key1" value-ref="dataSource" /> </map> </property> </bean></pre>

動態數據源配置說明

defaultTargetDataSource :配置默認數據源;

targetDataSources :配置數據源,key為數據源名稱(任意值),value-ref指向數據源; entityPackage :配置實體所在的包,多個包用逗號分隔;

配置掃描說明

主要功能是初始化Entity的RowMapper,以及table、id等映射;

<!--掃描自動注入MiniDao-->
<context:component-scan base-package="com.mini"/>

如下配置如果配置了則會在初始化的時候將實體信息加載到內存,如果不配置則會動態加載到內存(為提高程序啟動的效率,建議開發階段不要配置)

<!--掃描實體需要配置-->
<bean id="databaseRouter" class="com.mini.core.DatabaseRouter">
    <property name="entityPackage" value="com.mini" />
</bean>

2、實體結構規范

如果沒有實體可以直接用record弱類型編程,如果需要強類型編程,實體結構必須要按如下規范編寫:

@Entity(table="users",id="id",strategy=StrategyType.UUID)// 綁定表名和主鍵
public class User extends BaseEntity implements Serializable {

public static final long serialVersionUID = 840187169979836738L;

public static final class Columns {
    public static final String id = "id";
    public static final String name = "name";
    public static final String password = "password";
    public static final String createTime = "createTime";
    public static final String type = "type";
}

public User setId (String id) {
    super.set(Columns.id, id);
    return this;
}
public String getId () {
    return super.get(Columns.id);
}
public User setName (String name) {
    super.set(Columns.name, name);
    return this;
}
public String getName () {
    return super.get(Columns.name);
}

// getter & setter ...

}</pre>

實體注解說明

Entity,配置對應的table和id值,以及策略,如果不配置需要在開發時手動設置;

table (String):設置數據庫表名(必填);

id (String[]):設置數據庫主鍵(必填);

strategy (StrategyType):主鍵的生成策略,目前支持如下策略;

StrategyType.NULL 默認需要手動設置主鍵值
StrategyType.AUTO 主鍵值自動增長
StrategyType.UUID 自動生成system.uuid作為主鍵

ignore_field (String[]):插入、修改都要排除的數據庫字段;

ignore_insert_field (String[]):插入時要排除的數據庫字段;

ignore_update_field (String[]):更新時要排除的數據庫字段;

not_null_field (String[]):不許為Null的字段.

四、例子(參考代碼中的example包,可以使用user.sql創建測試數據庫及表結構)

增刪改的代碼示例:

/**

  • 測試插入強類型實例User */ public static int testInsert() { User user = new User(); user.setCreateTime(new Date()) .setName("username") .setType(new Random().nextInt(5)); return dao.insert(user); }

/**

  • 測試插入強類型實例Record */ public static int testInsert2() { Record record = new Record("users","id"); record.set("id", new Random().nextInt(100)) .set("name", "username") .set("type", new Random().nextInt(5)).set("password", "000000"); return dao.insert(record); }

/**

  • 更新強類型實例
  • @return */ public static int testUpdate() { User user = new User(); user.setName("hello_update"); return dao.update(user); }

/**

  • 更新弱類型記錄
  • @return */ public static int testUpdateRecord() { Record record = new Record(); record.setTableName("users"); record.setPrimaryKeys("id"); record.set("id", "8").set("name", "record_update"); return dao.update(record); }

/**

  • 刪除強類型實體
  • @return */ public static int testDelete() { User user = new User(); user.setId("1"); return dao.delete(user); }

/**

  • 刪除弱類型記錄
  • @return */ public static int testDeleteRecord() { Record record = new Record(); record.setTableName("users"); record.setPrimaryKeys("id"); record.set("id", "8"); return dao.delete(record); }</pre>

    查詢分頁代碼示例:

    /**

  • 無參強類型分頁 / public static List<User> testGetPage() { String sql = "select from users where id < 8 order by id desc"; List<User> users = dao.paginate(sql, 2, 2, User.class); return users; }

/**

  • 有參強類型分頁 / public static List<User> testGetPage2() { String sql = "select from users where id < ? order by id desc"; List<User> users = dao.paginate(sql, 2, 2, User.class, 18); return users; }

/**

  • 無參弱類型分頁 */ public static List<Record> testGetPage3() { String sql = "select id,name from users where id < 8 order by id desc"; return dao.paginate(sql, 2, 2,Record.class); }

/**

  • 有參弱類型分頁 */ public static List<Record> testGetPage4() { String sql = "select id,name from users where id < ? order by id desc"; return dao.paginate(sql, 2, 2, Record.class, 88); }</pre>

    查詢的代碼示例:

    /**

  • 無參查詢字符串
  • @return */ public static String testQueryString() { return dao.find("select name from users where id=10",String.class); }

/**

  • 有參查詢字符串
  • @return */ public static String testQueryString2() { return dao.find("select name from users where id=?",String.class, 23); }

/**

  • 根據id獲取強類型實例User
  • @return */ public static User getObject1() { User user = dao.findById(User.class, 22); return user; }

/**

  • 無參獲取強類型實例User
  • @return / public static User getObject2() { User user = dao.find("select from users where id=4", User.class); return user; }

/**

  • 有參獲取強類型實例User
  • @return / public static User getObject3() { User user = dao.find("select from users where id=? and name=?", User.class, 2, "helelo"); return user; }

/**

  • 無參獲取弱類型記錄
  • @return */ public static Record getRecord() { Record record = dao.find("select name,type from users where id=3", Record.class); return record; }

/**

  • 有參獲取弱類型記錄
  • @return */ public static Record getRecord2() { Record record = dao.find("select name,type from users where id =?", Record.class, 3); return record; }

/**

  • 無參獲取強類型實例列表
  • @return / public static List<User> getList() { List<User> users = dao.findList("select from users where id<99", User.class); return users; }

/**

  • 有參獲取強類型實例列表
  • @return / public static List<User> getList2() { List<User> users = dao.findList("select from users where id <? and password like ?", User.class, 5, "%'"); return users; }

/**

  • 無參獲取弱類型記錄列表
  • @return */ public static List<Record> getRecordList() { List<Record> users = dao.findList("select name,type from users where id<777", Record.class); return users; }

/**

  • 有參獲取弱類型記錄列表
  • @return */ public static List<Record> getRecordList2() { List<Record> result = null; result = dao.findList("select name ,type from users where id <? and name like ?", Record.class, 57, "user"); return result; }</pre> </div>
 本文由用戶 DanHemmant 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!