.NET C#到Java没那么难,DB篇

.NET C#到Java没那么难,DB篇

.NET C#到Java没那么难,DB篇

前言

.NET C#到Java没那么难,都是面向对象的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都是copy,简直so easy,而且用myeclipse可以省一些配制

Java与.NET的区别不在它们的本身,最大的区别在于他们背后的力量,相信大家都能感觉得到,我就不多说。

系列目录

一、.NET C#Java没那么难,开发环境篇

二、.NET C#到Java没那么难,Servlet篇

三、.NET C#到Java没那么难,MVC篇

四、.NET C#Java没那么难,DB篇

五、.NET C#Java没那么难,Nosql篇

六、.NET C#Java没那么难,微服务篇

七、.NET C#Java没那么难,大数据篇

.NET C#到Java没那么难,DB篇

目录

1.ADO.NET 和 JDBC

2.DBHelper 和 DBUtils

3.EF 和 Hibernate

4.Dapper 和 Mybatis

1.ADO.NET 和 JDBC

(1).ADO.NET和JDBC数据库对象

(2)ADO.NET连接字符串 和 JDBC数据库驱动和Url

1.ADO.NET各种数据库连接字符串

2.JDBC数据库驱动和Url

<table border="1" cellspacing="0" cellpadding="2"><tbody><tr><td><p><strong>数据库</strong></p></td><td><p><strong>驱动类名</strong></p></td><td><p><strong>URL</strong><strong>格式</strong></p></td></tr><tr><td><p>Oracle</p></td><td><p>oracle.jdbc.driver.OracleDriver</p></td><td><p>jdbc:oracle:thin:@hostip:1521:dbname</p></td></tr><tr><td><p>Sybase</p></td><td><p>com.sybase.jdbc2.jdbc.SybDriver</p></td><td><p>jdbc:sybase:Tds:hostip:4100/dbname</p></td></tr><tr><td><p>Mysql</p></td><td><p>com.mysql.jdbc.Driver</p></td><td><p>jdbc:mysql://hostip:3306/dbname?useUnicode=true&amp;amp;characterEncoding=GBK</p></td></tr><tr><td><p>SQLServer 2000</p></td><td><p>com.microsoft.jdbc.sqlserver.SQLServerDriver</p></td><td><p>jdbc:microsoft:sqlserver://hostip:1433;DatabaseName=dbname</p></td></tr><tr><td><p>SQLServer 2005</p></td><td><p>com.microsoft.sqlserver.jdbc.SQLServerDriver</p></td><td><p>jdbc:sqlserver://hostip:1433;DatabaseName=dbname</p></td></tr><tr><td><p>SQLServer 7.0</p></td><td><p>net.sourceforge.jtds.jdbc.Driver</p></td><td><p>jdbc:jtds:sqlserver://hostip:1433/dbname</p></td></tr><tr><td><p>DB2</p></td><td><p>com.ibm.db2.jcc.DB2Driver</p></td><td><p>jdbc:db2://hostip:50000/dbname</p></td></tr><tr><td><p>Informix</p></td><td><p>com.informix.jdbc.IfxDriver</p></td><td><p>jdbc:informix-sqli://hostip:port/dbname:informixserver=&lt;dbservername&gt;</p></td></tr></tbody></table>

(3).总结

1.ADO.NET最大的优点是对断开连接访问数据库方式的强有力支持。相比起来,JDBC也引入类似的功能,RowSet,但是比起ADO.NET来,还是不够。

2.ADO.NET不包括分布式事务的接口,ADO.NET的分布式事务是通过MS DTC统一管理的。JDBC本身就提供了对分布式事务支持的接口,不同的JDBC Driver实现了这一个接口,就支持分布式事务了。

3.ADO.NET中,不同的ADO .NET Provider的参数格式不一样的。OleDb和Odbc都是使用匿名参数,SqlClient使用“@”开头的命名参数,OracleCLient使用“:”开头的命名参数

4.JDBC中,参数计数是从1开始的,最初使用者容易犯错。ADO.NET没有此问题

5.ADO.NET是从ODBC,JDBC,OLEDB 发展过来,而JDBC是ODBC的JAVA版本

6.ADO.NET封装程度比较高,用起来很方便

代码对比

2.DBHelper 和 DBUtils

DBHelper有动软的SQLHelper,DbProviderFactory封装的DBHelper,微软EnterpriseLibary封装的DBHelper
主要是封装的ADO.NET的代码,简化dal层的操作
支持多种数据库,需要自己反射把DataTable转换成Model

Dbutils由Apache公司开发
主要是封装了JDBC的代码,简化dao层的操作,有对象映射的功能。
支持多种数据库,可以直接把数据转换成Model

源码预览

1 1 public Boolean Register(TUser user) throws SQLException{ 2 Connection conn =JDBCUtil.getConnection(); 2 3 QueryRunner qr = new QueryRunner(); 4 String sql="insert into t\_user(username,password,sex,birthdate,address) values(?,?,?,?,?)"; 3 5 4 6 try { 7 int i = qr.update(conn, sql,user.getUsername(),user.getPassword(),user.getSex(),user.getBirthdate(),user.getAddress()); 8 return i==1 ? true:false; 5 9 } catch (SQLException e) { 10 // TODO Auto-generated catch block 611 e.printStackTrace(); 12 } 13 finally{ 14 DbUtils.close(conn); 15 } 16 return false; 17 } 18 719 public List<TUser> findAll() throws SQLException{ 20 Connection conn =JDBCUtil.getConnection(); 21 QueryRunner qr = new QueryRunner(); 22 String sql = "select \* from T\_User"; 23 List<TUser> users = new ArrayList<TUser>(); 24 try { 25 users = qr.query(conn,sql, new BeanListHandler<TUser>(TUser.class)); 26 } catch (SQLException e) { 27 // TODO Auto-generated catch block 828 e.printStackTrace(); 29 } 30 finally{ 31 DbUtils.close(conn); 32 } 33 return users; 34 }

View Code

源码下载

3.EF 和 Hibernate

(1).对象关系配制

EF支持Fluent API和Attribute方式

Hibernate支持XML和注解的方式 

(2).Linq 和 HQL,Criteria  面向对象的查询方法

Linq相比于HQL更强大,支持编译时排错,有智能提示;Criteria相当于Where,Select 等各种方法

(3).原生SQL支持

**EF:**context.Database.SqlQuery() 

**Hibernate:**getSession().createSQLQuery()

(4).缓存

一级缓存:EF和Hibernate都默认支持一级缓存

二级缓存:Hibernate支持二级缓存,一般使用Nosql来代替二级缓存

(5).更新部分字段

EF:

先让EF跟踪实体,然后修改实体即可

EntityEntry<News> entry = cnotext.Entry<News>(news);  

entry.State = EntityState.Unchanged;  

entry.Property(t => t.xxxx).IsModified = true; //设置要更新的属性

context.SaveChanges(); 

Hibernate:

1.使用HQL语句,因为实体字段没有状态

2.修改hbm的class 的dynamic-update="true",在dao先find出来,再修改保存,影响性能

更新部分字段的方法

(6).主从级联保存

EF和Hibernate都支持主从级联保存

(7).批量更新和删除

ORM框架在批量数据处理的时候是有弱势。

ORM是针对某一对象(单个对象)简单的查改删增,不是批量修改、删除,适合用ORM;而对于批量修改、删除,不适合用ORM

**EF:**可以使用SQL实现批量更新和删除,context.Database.ExecuteSqlCommand()

**Hibernate:**可以使用HQL实现批量更新和删除,getSession().createQuery(hql).executeUpdate()

(8).附上封装好的Hibernate BaseDao

1package com.rabbit.dao.impl; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.hibernate.Hibernate; import org.hibernate.LockMode; import org.hibernate.SQLQuery; import org.hibernate.transform.Transformers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.rabbit.dao.BaseDao; import com.rabbit.dto.Pager; import com.rabbit.dto.QueryParam; public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { private Logger log = LoggerFactory 2 .getLogger(this.getClass()); // 实体类类型(由构造方法自动赋值) 3 private Class<T> entityClass; //实体类名(由构造方法自动赋值) 4 private String entityName; // 构造方法,根据实例类自动获取实体类类型 5 public BaseDaoImpl() { this.entityClass = null; 6 Class c \= getClass(); 7 Type t \= c.getGenericSuperclass(); if (t instanceof ParameterizedType) { 8 Type\[\] p \= ((ParameterizedType) t).getActualTypeArguments(); this.entityClass = (Class<T>) p\[0\]; this.entityName = entityClass.getSimpleName(); 9 } 10 } protected void initDao() { // do nothing 11 } /\* \* 新增数据 \*/ 12 /\* (non-Javadoc) 13 \* @see com.rabbit.dao.impl.BaseDao#save(T) \*/ @Override public Integer save(T transientInstance) { 14 log.debug("saving TCategory instance"); 15 Integer key \= null; try { 16 key \= (Integer)getHibernateTemplate().save(transientInstance); 17 log.debug("save successful"); 18 } catch (RuntimeException re) { 19 log.error("save failed", re); throw re; 20 } return key; 21 } /\* \* 更新数据 \*/ 22 /\* (non-Javadoc) 23 \* @see com.rabbit.dao.impl.BaseDao#update(T) \*/ @Override public void update(T transientInstance) { 24 log.debug("updating TCategory instance"); try { 25 getHibernateTemplate().update(transientInstance); 26 log.debug("update successful"); 27 } catch (RuntimeException re) { 28 log.error("update failed", re); throw re; 29 } 30 } /\* \* 删除数据 \*/ 31 /\* (non-Javadoc) 32 \* @see com.rabbit.dao.impl.BaseDao#delete(T) \*/ @Override public void delete(T persistentInstance) { 33 log.debug("deleting TCategory instance"); try { 34 getHibernateTemplate().delete(persistentInstance); 35 log.debug("delete successful"); 36 } catch (RuntimeException re) { 37 log.error("delete failed", re); throw re; 38 } 39 } /\* \* 根据id删除数据 \*/ 40 /\* (non-Javadoc) 41 \* @see com.rabbit.dao.impl.BaseDao#deleteById(java.lang.Integer) \*/ @Override public void deleteById(Integer id) { 42 log.debug("deleting TCategory instance"); try { 43 T instance \= (T) findById(id); 44 getHibernateTemplate().delete(instance); 45 log.debug("delete successful"); 46 } catch (RuntimeException re) { 47 log.error("delete failed", re); throw re; 48 } 49 } /\* \* 合并数据,必须有id,会先select查出数据 \*/ 50 /\* (non-Javadoc) 51 \* @see com.rabbit.dao.impl.BaseDao#merge(T) \*/ @Override public T merge(T detachedInstance) { 52 log.debug("merging TCategory instance"); try { 53 T result \= (T) getHibernateTemplate().merge( 54 detachedInstance); 55 log.debug("merge successful"); return result; 56 } catch (RuntimeException re) { 57 log.error("merge failed", re); throw re; 58 } 59 } /\* \* 更新数据,有id就更新数据,没有就新增 \*/ 60 /\* (non-Javadoc) 61 \* @see com.rabbit.dao.impl.BaseDao#saveOrUpdate(T) \*/ @Override public void saveOrUpdate(T instance) { 62 log.debug("attaching dirty TCategory instance"); try { 63 getHibernateTemplate().saveOrUpdate(instance); 64 log.debug("attach successful"); 65 } catch (RuntimeException re) { 66 log.error("attach failed", re); throw re; 67 } 68 } /\* \* 根据id查询数据 \*/ 69 /\* (non-Javadoc) 70 \* @see com.rabbit.dao.impl.BaseDao#findById(java.lang.Integer) \*/ @Override public T findById(Integer id) { 71 log.debug("getting TCategory instance with id: " + id); try { 72 T instance \= (T) getHibernateTemplate().get(entityClass, id); return instance; 73 } catch (RuntimeException re) { 74 log.error("get failed", re); throw re; 75 } 76 } /\* \* 根据Model查询数据 \*/ 77 /\* (non-Javadoc) 78 \* @see com.rabbit.dao.impl.BaseDao#findByExample(T) \*/ @Override public List findByExample(T instance) { 79 log.debug("finding TCategory instance by example"); try { 80 List results \= getHibernateTemplate().findByExample(instance); 81 log.debug("find by example successful, result size: " 82 + results.size()); return results; 83 } catch (RuntimeException re) { 84 log.error("find by example failed", re); throw re; 85 } 86 } /\* \* 根据属性查询 \*/ 87 /\* (non-Javadoc) 88 \* @see com.rabbit.dao.impl.BaseDao#findByProperty(java.lang.String, java.lang.Object) \*/ @Override public List findByProperty(String propertyName, Object value) { 89 log.debug("finding TCategory instance with property: " + propertyName \+ ", value: " + value); try { 90 String queryString \= "from "+ entityName +" as model where model." 91 + propertyName + "= ?"; return getHibernateTemplate().find(queryString, value); 92 } catch (RuntimeException re) { 93 log.error("find by property name failed", re); throw re; 94 } 95 } /\* \* 根据HQL where查询 \*/ 96 /\* (non-Javadoc) 97 \* @see com.rabbit.dao.impl.BaseDao#findByHQL(java.lang.String, java.lang.Object) \*/ @Override public List findByHQL(String where,Object... para){ 98 log.debug("finding all TUser instances"); try { 99 String queryString \= "from "+ entityClass.getSimpleName() +" "+ where; return getHibernateTemplate().find(queryString,para); 100 } catch (RuntimeException re) { 101 log.error("find all failed", re); throw re; 102 } 103 } /\* \* 根据SQL查询分页 \*/ 104 /\* (non-Javadoc) 105 \* @see com.rabbit.dao.BaseDao#findBySQL(java.lang.Class, java.lang.String, QueryParam) \*/ @Override public <DTO> Pager<DTO> findBySQL(Class<DTO> type,String sql,QueryParam param) { 106 log.debug("finding all TUser instances"); try { //外层包装sql 107 String outerSql = "Select %s from (%s) pager"; 108 String countSql \= String.format(outerSql, "Count(1) cnt",sql); 109 SQLQuery countQuery \= getSession().createSQLQuery(countSql); 110 Object\[\] para \= param.getPara(); //填充参数 111 preparePara(countQuery,para); 112 countQuery.addScalar("cnt",Hibernate.INTEGER); 113 Integer count \= (Integer)countQuery.uniqueResult(); 114 115 Pager<DTO> pager = new Pager<DTO>(); 116 pager.InitPager(param.getPageIndex(), param.getPageSize(), count); 117 List<DTO> items = new ArrayList<DTO>(); if(param.getPageIndex()<=pager.getTotalPage()){ //设置排序 118 if(param.getOrderBy()!=null){ 119 sql\=sql+" order by " + param.getOrderBy(); 120 } 121 SQLQuery query \= getSession().createSQLQuery(String.format(outerSql, "\*",sql)); //填充参数 122 preparePara(query,para); //转换成dto 123 query.setResultTransformer(Transformers.aliasToBean(type)); //设置分页 124 query.setFirstResult(param.getPageOffset()); 125 query.setMaxResults(param.getPageSize()); 126 items \= query.list(); 127 } 128 129 pager.setItems(items); return pager; 130 131 } catch (RuntimeException re) { 132 log.error("find all failed", re); throw re; 133 } 134 } /\* \* 准备Query参数 \*/ 135 private void preparePara(SQLQuery query,Object\[\] para){ if(para!=null){ for(int i=0;i<para.length;i++){ 136 query.setParameter(i, para\[i\]); 137 } 138 } 139 } /\* \* 准备Query参数 \*/ 140 private void preparePara(SQLQuery query,Map<String,Object> para){ if(para!=null && !para.isEmpty()){ for(String key : para.keySet()){ 141 Object obj \= para.get(key); if (obj instanceof Collection<?>) 142 query.setParameterList(key, (Collection<?>) obj); else if (obj instanceof Object\[\]) 143 query.setParameterList(key, (Object\[\]) obj); else query.setParameter(key, obj); 144 } 145 } 146 } /\* \* 查询所有数据 \*/ 147 /\* (non-Javadoc) 148 \* @see com.rabbit.dao.impl.BaseDao#findAll() \*/ @Override public List findAll() { 149 log.debug("finding all TCategory instances"); try { 150 String queryString \= "from "+entityClass.getSimpleName(); return getHibernateTemplate().find(queryString); 151 } catch (RuntimeException re) { 152 log.error("find all failed", re); throw re; 153 } 154 } 155 156}

BaoDao

(9).源码下载

4.扩展阅读

Hibernate的10个常见面试问题及答案

update 和 merge、saveOrUpdate的区别

Dapper和Mybatis的比较放在下一篇吧,也许直接到微服务篇了

时间仓促,很多东西没有写到,欢迎大家指点

未完,待续,欢迎评论拍砖

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )