基于 spring jdbc 的上層封裝
來自: 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>