SQL中事务有几种?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中事务有几种?相关的知识,希望对你有一定的参考价值。

有三种。第一种是显式声名的事务,这种事务要以begin
transaction为事务的起始标志。第二种是自动提交事务,这是sql
server的缺省设置。每一个t-sql语句在执行完成后会被自动提交。第三种是隐含事务,在这种方式下,sql
server会在当前事务被提交或回滚后自动启动一个新的事务,这个新事务直到用户执行commit或rollback为止,这时系统又会启动一个新事务。这样就形成了一个连续的事务链。
参考技术A 分为:
自动提交事务,显式事务,隐性事务
事务
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除。
自动提交事务
每条单独的语句都是一个事务。
显式事务
每个事务均以
BEGIN
TRANSACTION
语句显式开始,以
COMMIT

ROLLBACK
语句显式结束。
隐性事务
在前一个事务完成时新事务隐式启动,但每个事务仍以
COMMIT

ROLLBACK
语句显式完成。

Hibernate有几种查询方法

转录:
从点到面,讲讲hibernate查询的6种方法。分别是HQL查询
,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询。
如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是
从一个点,让我们掌握6中方法,则提供了更多选择。每一种方法都有其适用的情况与前提。
HQL查询
HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点。示例代码:

static void query(String name)
Session s=null;
try
s=HibernateUtil.getSession();

//from后面是对象,不是表名
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
Query query=s.createQuery(hql);
query.setString("name", name);

List<Admin> list=query.list();

for(Admin admin:list)
System.out.println(admin.getAname());

finally
if(s!=null)
s.close();



适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。
对象化查询Criteria方法:

static void cri(String name,String password)
Session s=null;
try
s=HibernateUtil.getSession();

Criteria c=s.createCriteria(Admin.class);
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));

List<Admin> list=c.list();
for(Admin admin:list)
System.out.println(admin.getAname());

finally
if(s!=null)
s.close();



适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。
动态分离查询DetachedCriteria

static List dc(DetachedCriteria dc)

Session s = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(s);
List rs = c.list();
s.close();
return rs;


DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
if (id != 0)
dc.add(Restrictions.eq("id", id));
Date age = new Date();
if (age != null)
dc.add(Restrictions.le("birthday", age));
List users = dc(dc);
System.out.println("离线查询返回结果:" + users);

适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限。
例子查询

static List example(User user)
Session s = HibernateUtil.getSession();
List<User> users = s.createCriteria(User.class).add(
Example.create(user)).list();
// List<User>
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
// .createCriteria("child").add((Example.create(user))).list();
return users;


适用情况:面向对象操作。 缺点:适用面较HQL有限,不推荐。

sql查询

static List sql()

Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from user").addEntity(User.class);
List<User> rs = q.list();
s.close();
return rs;


适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台,不易维护,不面向对象。
命名查询

static List namedQuery(int id)
Session s = HibernateUtil.getSession();
Query q = s.getNamedQuery("getUserById");
q.setInteger("id", id);
return q.list();


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.sy.vo.User" table="user" catalog="news">

</class>
<!-- 命名查询:定义查询条件 -->
<query name="getUserById">
<![CDATA[from User where id=:id]]>
</query>
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
<sql-query name="getUserById2">
<![CDATA[select * from User where ]]>
</sql-query> -->
</hibernate-mapping>

适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象。基于hql和sql,有一定缺陷。
参考技术A Hibernate有4种查询方法。
HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query lanague
EJBQL(JPQL 1.0) 是EJB提供的查询语言
QBC(query by cretira)通过Cretira接口进行查询
QBE(query by Example) 通过Example编程接口进行查询
从功能强弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example) 1: QBE (Query By Example) QBC查询方式。
QBC(Query By Criteria)查询方式是 Hibernate 提供的“ 更加面向对象”的一种检索方式。 QBC 在条件查询上比 HQL 查询更为灵活,而且支持运行时动态天生查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤:
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria 对象
(2)使用工具类 Restrictions 的相关方法为 Criteria 对象设置查询对象
(3)使用 Criteria 对象的 list() 方法执行查询,返回查询结果QBE查询QBE查询就是检索与指定样本对象具有相同属性值的对象。因此QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,固然 QBE 没有 QBC 功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example 为 Criteria 对象指定样本对象作为查询条件Java代码:
1 Session session = HibernateSessionFactory.getSessionFactory().openSe ssion();
2 Transaction ts = session.beginTransaction();
3 Customer c = new Customer();
4 c.setCname("Hibernate");
5 Criteria criteria = session.createCriteria(Customer. class );
6 Criteria.add(Example.create(c));
7 Iterator it = criteria.list().iterator();
8 ts.commit();
9 HibernateSessionFactory.closeSession();
参考技术B 我只说 我常用的几种 Hibernate hql查询方法

Hibernate 在Spring管理下 可以用类继承了(extends) HibernateDaoSupport
然后 下面是一个我熟悉的写法:
public List<Prov> find(final String hql, final int currentPage, final int pageSize,
final String[] params)

return this.getHibernateTemplate().executeFind(new HibernateCallback()


@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException

Query query = session.createQuery(hql);
for(int i =0 ;i<params.length;i++)

query.setString(i, params[i]);

query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
query.setMaxResults(pageSize);

return query.list();

);


调用和传递参数

String hql ="from Prov p where p.prov_id like ? and p.prov_name like ?";
String[] params ="%"+prov.getProv_id()+"%","%"+prov.getProv_name()+"%";
return super.find(hql,currentPage,pageSize,params);
分页查询 得到 各种条件下的省市

List<LinkUser> list = (List<LinkUser>) getHibernateTemplate().find(
"from LinkUser lu where lu.userNo = '" + no + "'");
等等。

如果只用 Hibernate 简单的 直接写

protected List<T> find(String hql, String... params)


Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)

query.setString(i, params[i]);

return query.list();

或protected List<T> page(String hql,int currentPage,int pageSize, String... params)


Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)

query.setString(i, params[i]);

query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
return query.list();

除了以上还有criteria查询,本人没用过,网上还有许多,你自己可以搜搜,学习学习
参考技术C

HIbernate主要常用有三种查询方式HQL、QBC、SQL:

1).HQL(Hibernate Query Language):hibernate数据查询语言;

2).QBC(Query By Criteria):规则查询

3).SQL:原生的SQL语句(较为复杂的情况下使用)

想要详细了解的可以看一下下面的几篇文章:

    QBC数据查询

    HQL单表查询

    HQL多表查询

    希望对你有所帮助~

参考技术D 是想查询什么呢?

以上是关于SQL中事务有几种?的主要内容,如果未能解决你的问题,请参考以下文章

Spring 有几种事务隔离级别?

spring的事务管理有几种方式实现,如何实现

Spring的事务管理有几种方式?Spring常用的实物隔离级别是哪几种?

Spring有几种事务管理,Spring事务管理接口是啥

spring管理java类有几种方式

spring的事务管理有几种方式实现,如何实现