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

Charles14 等级 585 0 0

.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

数据库

驱动类名

URL格式

Oracle

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@hostip:1521:dbname

Sybase

com.sybase.jdbc2.jdbc.SybDriver

jdbc:sybase:Tds:hostip:4100/dbname

Mysql

com.mysql.jdbc.Driver

jdbc:mysql://hostip:3306/dbname?useUnicode=true&characterEncoding=GBK

SQLServer 2000

com.microsoft.jdbc.sqlserver.SQLServerDriver

jdbc:microsoft:sqlserver://hostip:1433;DatabaseName=dbname

SQLServer 2005

com.microsoft.sqlserver.jdbc.SQLServerDriver

jdbc:sqlserver://hostip:1433;DatabaseName=dbname

SQLServer 7.0

net.sourceforge.jtds.jdbc.Driver

jdbc:jtds:sqlserver://hostip:1433/dbname

DB2

com.ibm.db2.jcc.DB2Driver

jdbc:db2://hostip:50000/dbname

Informix

com.informix.jdbc.IfxDriver

jdbc:informix-sqli://hostip:port/dbname:informixserver=<dbservername>

(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

源码预览

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

 1 public Boolean Register(TUser user) throws SQLException{ 2         Connection conn =JDBCUtil.getConnection();
 3         QueryRunner qr = new QueryRunner(); 4         String sql="insert into t\_user(username,password,sex,birthdate,address) values(?,?,?,?,?)";
 5         
 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;
 9         } catch (SQLException e) { 10             // TODO Auto-generated catch block
11 e.printStackTrace(); 12 } 13         finally{ 14 DbUtils.close(conn); 15 } 16         return false; 17 } 18 
19     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
28 e.printStackTrace(); 29 } 30         finally{ 31 DbUtils.close(conn); 32 } 33         return users; 34     }

View Code

源码下载

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

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 entry = cnotext.Entry(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

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

package 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
            .getLogger(this.getClass()); // 实体类类型(由构造方法自动赋值)
    private Class<T> entityClass; //实体类名(由构造方法自动赋值)
    private String entityName; // 构造方法,根据实例类自动获取实体类类型
    public BaseDaoImpl() { this.entityClass = null;
        Class c \= getClass();
        Type t \= c.getGenericSuperclass(); if (t instanceof ParameterizedType) {
            Type\[\] p \= ((ParameterizedType) t).getActualTypeArguments(); this.entityClass = (Class<T>) p\[0\]; this.entityName = entityClass.getSimpleName();
        }
    } protected void initDao() { // do nothing
 } /\* \* 新增数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#save(T) \*/ @Override public Integer save(T transientInstance) {
        log.debug("saving TCategory instance");
        Integer key \= null; try {
            key \= (Integer)getHibernateTemplate().save(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re); throw re;
        } return key;
    } /\* \* 更新数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#update(T) \*/ @Override public void update(T transientInstance) {
        log.debug("updating TCategory instance"); try {
            getHibernateTemplate().update(transientInstance);
            log.debug("update successful");
        } catch (RuntimeException re) {
            log.error("update failed", re); throw re;
        }        
    } /\* \* 删除数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#delete(T) \*/ @Override public void delete(T persistentInstance) {
        log.debug("deleting TCategory instance"); try {
            getHibernateTemplate().delete(persistentInstance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re); throw re;
        }
    } /\* \* 根据id删除数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#deleteById(java.lang.Integer) \*/ @Override public void deleteById(Integer id) {
        log.debug("deleting TCategory instance"); try {
            T instance \= (T) findById(id);
            getHibernateTemplate().delete(instance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re); throw re;
        }
    } /\* \* 合并数据,必须有id,会先select查出数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#merge(T) \*/ @Override public T merge(T detachedInstance) {
        log.debug("merging TCategory instance"); try {
            T result \= (T) getHibernateTemplate().merge(
                    detachedInstance);
            log.debug("merge successful"); return result;
        } catch (RuntimeException re) {
            log.error("merge failed", re); throw re;
        }
    } /\* \* 更新数据,有id就更新数据,没有就新增 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#saveOrUpdate(T) \*/ @Override public void saveOrUpdate(T instance) {
        log.debug("attaching dirty TCategory instance"); try {
            getHibernateTemplate().saveOrUpdate(instance);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re); throw re;
        }
    } /\* \* 根据id查询数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#findById(java.lang.Integer) \*/ @Override public T findById(Integer id) {
        log.debug("getting TCategory instance with id: " + id); try {
            T instance \= (T) getHibernateTemplate().get(entityClass, id); return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re); throw re;
        }
    } /\* \* 根据Model查询数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#findByExample(T) \*/ @Override public List findByExample(T instance) {
        log.debug("finding TCategory instance by example"); try {
            List results \= getHibernateTemplate().findByExample(instance);
            log.debug("find by example successful, result size: "
                    + results.size()); return results;
        } catch (RuntimeException re) {
            log.error("find by example failed", re); throw re;
        }
    } /\* \* 根据属性查询 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#findByProperty(java.lang.String, java.lang.Object) \*/ @Override public List findByProperty(String propertyName, Object value) {
        log.debug("finding TCategory instance with property: " + propertyName \+ ", value: " + value); try {
            String queryString \= "from "+ entityName +" as model where model."
                    + propertyName + "= ?"; return getHibernateTemplate().find(queryString, value);
        } catch (RuntimeException re) {
            log.error("find by property name failed", re); throw re;
        }
    } /\* \* 根据HQL where查询 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#findByHQL(java.lang.String, java.lang.Object) \*/ @Override public List findByHQL(String where,Object... para){
        log.debug("finding all TUser instances"); try {
            String queryString \= "from "+ entityClass.getSimpleName() +" "+ where; return getHibernateTemplate().find(queryString,para);
        } catch (RuntimeException re) {
            log.error("find all failed", re); throw re;
        }
    } /\* \* 根据SQL查询分页 \*/
    /\* (non-Javadoc)
     \* @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) {
        log.debug("finding all TUser instances"); try { //外层包装sql
            String outerSql = "Select %s from (%s) pager";
            String countSql \= String.format(outerSql, "Count(1) cnt",sql);
            SQLQuery countQuery \= getSession().createSQLQuery(countSql);
            Object\[\] para \= param.getPara(); //填充参数
 preparePara(countQuery,para);
            countQuery.addScalar("cnt",Hibernate.INTEGER);
            Integer count \= (Integer)countQuery.uniqueResult();

            Pager<DTO> pager = new Pager<DTO>();
            pager.InitPager(param.getPageIndex(), param.getPageSize(), count);
            List<DTO> items = new ArrayList<DTO>(); if(param.getPageIndex()<=pager.getTotalPage()){ //设置排序
                if(param.getOrderBy()!=null){
                    sql\=sql+" order by " + param.getOrderBy();
                }
                SQLQuery query \= getSession().createSQLQuery(String.format(outerSql, "\*",sql)); //填充参数
 preparePara(query,para); //转换成dto
 query.setResultTransformer(Transformers.aliasToBean(type)); //设置分页
 query.setFirstResult(param.getPageOffset());
                query.setMaxResults(param.getPageSize());
                items \= query.list();
            }

            pager.setItems(items); return pager;

        } catch (RuntimeException re) {
            log.error("find all failed", re); throw re;
        }
    } /\* \* 准备Query参数 \*/
    private void preparePara(SQLQuery query,Object\[\] para){ if(para!=null){ for(int i=0;i<para.length;i++){
                query.setParameter(i, para\[i\]);
            }
        }
    } /\* \* 准备Query参数 \*/
    private void  preparePara(SQLQuery query,Map<String,Object> para){ if(para!=null && !para.isEmpty()){ for(String key : para.keySet()){
                Object obj \= para.get(key); if (obj instanceof Collection<?>)
                    query.setParameterList(key, (Collection<?>) obj); else if (obj instanceof Object\[\])
                    query.setParameterList(key, (Object\[\]) obj); else query.setParameter(key, obj);        
            }
        }
    } /\* \* 查询所有数据 \*/
    /\* (non-Javadoc)
     \* @see com.rabbit.dao.impl.BaseDao#findAll() \*/ @Override public List findAll() {
        log.debug("finding all TCategory instances"); try {
            String queryString \= "from "+entityClass.getSimpleName(); return getHibernateTemplate().find(queryString);
        } catch (RuntimeException re) {
            log.error("find all failed", re); throw re;
        }
    }

}

BaoDao

(9).源码下载

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

4.扩展阅读

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

update 和 merge、saveOrUpdate的区别

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

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

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

收藏
评论区

相关推荐

一篇文章彻底搞懂Java的大Class到底是什么
作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。 因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 java的 Class不是太清楚,所以想写一篇关于Java Class 的文章,没有那么多专业名词,希望用通俗的语言能把Java的 Class 这个概念讲明
.NET C#到Java没那么难,DB篇
.NET C到Java没那么难,DB篇 .NET C到Java没那么难,DB篇 前言 .NET C到Java没那么难,都是面向对象的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到
.NET C#到Java没那么难,MVC篇
.NET C到Java没那么难,MVC篇 .NET C到Java没那么难,MVC篇 最典型的JAVA MVC就是JSP servlet javabean的模式。比较好的MVC,老牌的有Struts、
.NET C#到Java没那么难,Servlet篇
.NET C到Java没那么难,Servlet篇 .NET C到Java没那么难,Servlet篇 前言 .NET C到Java没那么难,都是面向对象的语言,而且语法还是相似的,先对比一下开发
从 PHP 转到 Java
前言 最近主要编程语言从 PHP 转到了 Java。这一个多月的经历对我很有意义,所以写文章记录一下。 编程语言各有侧重,它们之间的比较没什么意义,所以本文只写一下我对两种语言的看法,以及我转到另一种语言的经历,再分享一下最近学习 Java 的心得体会。 文章欢迎转载,请尊重作者劳动成果,带上原文链接:http://www.cnblogs
《java 核心技术》卷1 学习 概述 第一章Java程序设计概述
从浅面了解Java 1.Java 在语言得地位 现在有所下降 但仍是老大哥 所以值得学习 2.Java特性 1.简单性:从一方面来说 Java可以支持在小型机器上运行 必定不是很复杂得,所以上手不难 2.面向对象:Java有相比于其他的语言 更简单得接口
二 Java利用等待/通知机制实现一个线程池
接着上一篇博客的 一Java线程的等待/通知模型(http://www.cnblogs.com/start1225/p/5866575.html "一 java线程的等待/通知模型")  ,没有看过的建议先看一下。下面我们用等待通知机制来实现一个线程池. (https://www.helloworld.net/p/XJXfgbimvcjd) 本
Java的数值数据类型以及命名规范
一、Java中的数值数据类型 <table<tbody<tr<td width"75" valign"top" style"wordbreak: breakall;"<span style"backgroundcolor: rgb(255, 254, 213);"类型名<br</span</td<td width"299
Sentinel的注解支持 - @SentinelResource使用详解
Hello,大家好,我是麦洛,今天带大家来了解一下Sentinel中@SentinelResource的使用方法 ,这篇文章主要向大家介绍一下以下内容TOC 😀由于笔者水平有限,文章难免有不当之处,恳请读者不吝赐教并提出意见 目前公众号没有留言功能,如何找到我?🙈大家可以关注我的公众号:今日Java, 后台回复"加群"就可以获取到我的个
手把手教你使用Flask搭建ES搜索引擎(实战篇)
上一篇简单说了下 ES 在 Python 的增删改查,。 现在正式进入主题:开始使用 Flask 搭建 ES 搜索。 1 配置文件 Config.pycoding:utf8 import os DBUSERNAME  'root' DBPASSWORD  None  如果没有密码的话 DBHOST  '127.0.0.1' DB
JDK13的特性和JDK的历史你知道吗???喂饭式带你学好!!!
1.1 JDK 各版本主要特性回顾 JDK Version 1.019960123 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢。 JDK Version 1.119970219 JDBC(Java DataBase Connectivity); 支持内部类; RMI(Remote Me
这可能是目前最全的!java开发手册嵩山版
在这里分享一份 [mybatis从入门到精通] 的强力教程,定能够助你一臂之力。 Mybatis基本介绍1. ORM和MyBatis1. 对象/关系数据库映射(ORM)1. 基本映射方式1. 流行的ORM框架简介目前流行的编程语言,例如Java、 C等,都是面向对象的编程语言;而目前主流的数据库产品,例如Oracle、DB2等,依然是关系数据库。编程语言和底
一篇文带你了解JDK 13新特性,保姆级教程!!!
JDK 13新特性介绍 1.1 JDK 各版本主要特性回顾 JDK Version 1.019960123 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢。 JDK Version 1.119970219 JDBC(Java DataBase Connectivity); 支持内部类; R
要想编程效率高,熟悉t-io很必要,省去你的APP中自己开发网络通信的模块
1. 是基于java aio的网络编程框架,和netty属于同类,它的使命是:让天下没有难开发的网络程序。2. 基于tiocore来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、Socket将会变得空前的简单。3. tio家族除了tiocore外,还有tiowebsocketserver、tiohttpserver、ti
mybatis的mapper特殊字符转移以及动态SQL条件查询
前言我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于是就衍生出来ORM框架,如Mybatis,Hibernate,还有SpringBoot的,Spring Data JPA 条件查询我们知道在mybatis ma

热门文章

Dart中一个类实现多个接口以及Dart中的 Mixins

最新文章

Dart中一个类实现多个接口以及Dart中的 Mixins