Hibernate:
我用了Hibernate一年多,能夠說是飽經風雨,感覺極深,Hibernate看似一個很好的框架,我簡單說一下它的使用痛點,
一、做爲開發人員,咱們應該全新全意關注咱們的功能業務,不可以讓業務跟着技術走,應該讓技術跟着業務走
二、ORM mapping映射文件,對象關係(一對1、對多、多對一)配置、與java類強耦合,一點不靈活
三、有QBC,HQL,SQL三種查詢方式,常常式混合使用,有的代碼寫QBC、有的寫HQL、有的寫SQL,還有不少地方常常對象直接操做,
由於同一個功能你有多種方式去實現,這就會迫使你面臨選擇,到底用那種方式,你會去權衡,這種狀況是很是痛苦的。有義務稍有
變動,咔嚓!可能對象操做很差用了,你就改HQL,後面可能HQL都很差用,搞得很複雜,而後你又不想用SQL,有的也有可能用SQL,
整個項目java代碼混合好多sql、HQL、對象操做、sql配置文件、映射配置... 處處都是圍繞着這個框架轉...... 代碼多又難看
Mybatis:
一、就是個JDBC封裝,增強,只有sql,儘管寫sql,只要熟悉sql語句
二、ORM映射,也很簡單,resutMap 或者 autoMapping ,這種配置、跟個小孩說都懂
三、痛點來了:resutMap、if else 標籤、不少複用模式的sql,
那麼多resultMap 寫得累吧,雖然思路簡單,那麼多if else 寫得累吧,那麼多服用模式的sql。
有很大一部分配置都是吻合java實體類字段的 insert update delete select, 固然了,各類關聯查詢、更新、刪除仍是應該寫的。
四、解決mybatis這個痛點的方式來了,代碼生成器:Mybatis-Generator。代碼是生成了,也確實節省了不少工做,但是代碼量並無減小、
生成的代碼還那麼難看、還要去維護和修改代碼,因而,我寫了Mybatis-smart。
Mybatis-smart:
簡單使用說明:
smartMapper操做:
smartMapper.insert(user);
smartMapper.updateById(user);
smartMapper.deleteById(id,SysUser.class);
smartMapper.selectById(id,SysUser.class);
.... 更多操做java
簡單寫了個demo:
實體類:省略了簡單的基本的 CRUD mapper.xml配置sql
//@TableInfo(value = "sys_user",idFieldName="account")//對應主鍵的java字段是account(默認是id) //@TableInfo(value = "sys_user",idtactics=IdtacticsEnum.DEFINED)//主鍵生成策略:自定義,就是java設值;還有 IdtacticsEnum.DFT 內部默認序列生成器生成, IdtacticsEnum.SQL_INCR 數據庫自增 @TableInfo(value = "sys_user")//對應sys_user 表 public class SysUser { @ColumnInfo(value="user_account")//對應sql字段user_account,默認是駝峯規則對應:如user_id對應userId或者userid對應userid private String account; private String pwd; private String email; private String tel; @ColumnInfo(insertValType=ObjTypeEnum.ALL)//調用mybatis-smart smartMapper 的新增方法時、""、null、其餘值 都會insert進數據庫,默認""、null 不會insert進數據庫 private String nickname; private Date lastLoginTime; private String lastLoginIp; private Integer age; @ColumnInfo(isUpdate = false)//調用mybatis-smart smartMapper 的更新方法時,不更新該字段 protected Date createTime; @ColumnInfo(isInsert=false)//調用mybatis-smart smartMapper 的新增方法時,不新增該字段 protected Date updateTime; protected String selectParam;//表中沒有select_param,則調用mybatis-smart smartMapper 的CRUD都會忽略該字段 ...省略get set 方法 }
Mapper接口:繼承SmartMapper數據庫
public interface SysUserMapper extends SmartMapper<SysUser> { }
Service:
微信
@Service public class SysUserService { @Autowired private SysUserMapper sysUserMapper; public void inset(SysUser sysUser) { sysUserMapper.insert(sysUser); } /** * 插入支持Collection集合 */ public void insetList(Collection<SysUser> sysUserList) { sysUserMapper.insert(sysUserList); } public void selectByWhere() { WhereSql where = new WhereSql(); where.andEq("user_account", "laowang");// user_account = 'laowang' where.andLikeL("user_account", "lao");// user_account like '%laowang' where.andLikeR("user_account", "wang");// user_account like 'laowang%' // ...... List<SysUser> list = sysUserMapper.selectForWhere(SysUser.class, where); SysUser param = new SysUser(); param.setAge(23); where = new WhereSql(); where.andEq("user_account");// user_account = #{xxx.account} account字段值爲''或null ,沒有該條件 where.andIsNull("user_account");// user_account is null where.andEq("email");// email = #{xxx.email} email字段值爲''或null ,沒有該條件 where.andEq("age");// age = 23 // ..... list = sysUserMapper.selectByWhere(param, where); where.andEq("user_account", "塵無塵");// user_account = #{} } /* * ... 省略 更新 刪除 */ }
實在時間有限,今晚到此爲止,但願諒解,源碼及更多相關請關注我,接下來再發布,聯繫我 QQ:59425559八、微信:xiangb82195 mybatis