`
hlbng
  • 浏览: 177436 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate完成常用的JDBC操作

阅读更多
package com.mengya.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;

import com.mengya.entity.Stu;
import com.mengya.util.SessionFactoryUitl;

/**
* Query query=this.GetSession().createQuery(hql); query.iterate()与query.list()
* 效率是说query.iterate()比query.list()好,但做了N+1次查询 它们都是先从数据库的查询出主键值,然后根据主键值查询出对象,
* 只是query.iterate()会根据主键值先从缓存当中找,若没有就从数据库查询 query.list()会根据主键值在数据库查询(N+1)
*/

public class StuDAO extends SessionFactoryUitl {
private Transaction tran;

/**
* 添加
*/
public void save(Stu stu) {
   try {
    tran = this.GetSession().beginTransaction();
    this.GetSession().save(stu);
    tran.commit();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
}

/**
* 使用HQL全查询
*/
public List getallbyHQL() {
   List arr = null;
   try {
    String hql = "from Stu";
    Query query = this.GetSession().createQuery(hql);
    arr = query.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 使用Criteria全查询
*/
public List getallbyCriteria() {
   List arr = null;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    arr = cri.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 根据主键查询
*/
public Stu getbyID(int id) {
   Stu stu = null;
   try {
    stu = (Stu) this.GetSession().get(Stu.class, id);
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return stu;
}

/**
* 根据对象属性查询(使用Query)
*/
public List getbyPropertyQuery(String name) {
   List arr = null;
   try {
    // 这里不能像SQL语一样select * from Stu where SName=:name,这是不对的。
    // Query query=this.GetSession().createQuery("from Stu where
    // SName=:name");
    // query.setString("name", name);
    // 或者
    Query query = this.GetSession().createQuery(
      "from Stu where SName=?");
    query.setString(0, name);
    arr = query.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 根据对象属性查询(使用Criteria)
*/
public List getbyPropertyCriteria(String name) {
   List arr = null;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    Criterion c1 = Expression.eq("SName", name);
    cri.add(c1);
    arr = cri.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 查询部分属性
*/
public List getProperty() {
   List arr = new ArrayList();
   try {
    String hql = "select s.SName,s.SSex from Stu as s";
    Query query = this.GetSession().createQuery(hql);
    List list = query.list();
    Iterator iter = list.iterator();
    while (iter.hasNext()) {
     Object[] obj = (Object[]) iter.next();
     Stu s = new Stu();
     s.setSName(obj[0].toString());
     s.setSSex(obj[1].toString());
     arr.add(s);
    }
   } catch (HibernateException e) {
    this.CloseSession();
   }
   return arr;
}

/**
* 查询一个属性
*/
public List getoneProperty() {
   List arr = new ArrayList();
   try {
    String hql = "select s.SName from Stu as s";
    Query query = this.GetSession().createQuery(hql);
    Iterator iter = query.iterate();
    while (iter.hasNext()) {
     Object obj = (Object) iter.next();
     Stu s = new Stu();
     s.setSName(obj.toString());
     arr.add(s);
    }
   } catch (HibernateException e) {
    this.CloseSession();
   }
   return arr;
}

/**
* 查询一个对象一个属性值
*/
public Object getonlyProprotyValue(int s_id) {
   Object obj = null;
   try {
    String hql = "select s.SName from Stu as s where s.SId=?";
    Query query = this.GetSession().createQuery(hql);
    query.setInteger(0, s_id);
    obj = query.uniqueResult();

//

如果有多个值则抛错
如果有值且只有一个,返回一个object
如果没值,返回null

经试验,如果是返回一个值的时候,返回类型::

如果hql为:select count(*)from 类名------------------------》结果是数字

如果hql为:select 字段 from 类名 where 条件------------------------------》字段值


   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return obj;
}

/**
* Criteria多条件查询
*/
public List getPropertyByCriteria(String name, int age) {
   List list = null;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    Criterion c1 = Expression.eq("SName", name);
    Criterion c2 = Expression.eq("SAge", age);
    cri.add(c1);
    cri.add(c2);
    list = cri.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return list;
}

/**
* SQL查询
*/
public List getallBYSQL() {
   List arr = null;
   try {
    String sql = "select {c.*} from stu as c";
    SQLQuery sqlquery = this.GetSession().createSQLQuery(sql);
    sqlquery.addEntity("c", Stu.class);
    arr = sqlquery.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 根据对象查询
*/
public List getallByObject(Stu s) {
   List arr = null;
   try {
    String hql = "from Stu as s where s=:stuentity";
    // 或者
    // String hql="from Stu as s where s.SId=:stuentity";
    Query query = this.GetSession().createQuery(hql);
    query.setEntity("stuentity", s);
    arr = query.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 模糊查询
*/
public List getallQueryLike(String name) {
   List arr = null;
   try {
    String hql = "from Stu as s where s.SName like :name";
    Query query = this.GetSession().createQuery(hql);
    query.setString("name", "%" + name + "%");
    // 不能
    // query.setString("name", "'%"+name+"%'");
    arr = query.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* Criteria模糊查询
*/
public List getallCriteriaLike(String name) {
   List arr = null;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    Criterion c1 = Expression.like("SName", "%" + name + "%");
    cri.add(c1);
    arr = cri.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* Criteria范围查询
*/
public List getallCriteriabetween(int age1, int age2) {
   List arr = null;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    Criterion c1 = Expression.between("SAge", age1, age2);
    cri.add(c1);
    arr = cri.list();
   } catch (HibernateException e) {
    this.CloseSession();
   } finally {
    this.CloseSession();
   }
   return arr;
}

/**
* 统计函数
*/
public int CountStu() {
   int count = 0;
   try {
    String hql = "select count(*) from Stu";
    Query query = this.GetSession().createQuery(hql);
    count = (Integer) query.uniqueResult();//一般是显示一个字段的值
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return count;
}

/**
* Criteria条件统计
*/
public int CountStuByWhereInCriteria(int num1, int num2) {
   int count = 0;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    Criterion c1 = Expression.between("SAge", num1, num2);
    cri.add(c1);
    count = cri.list().size();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return count;
}

/**
* 条件统计
*/
public int CountByWhere(String sex) {
   int count = 0;
   try {
    Query query = this.GetSession().createQuery(
      "select count(*) from Stu where SSex=:sex");
    query.setString("sex", sex);
    count = (Integer) query.uniqueResult();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return count;
}

/**
* 统计平均值
*/
public float VagAge() {
   float vag = 0;
   try {
    Query query = this.GetSession().createQuery(
      "select avg(SAge) from Stu");
    vag = (Float) query.uniqueResult();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return vag;
}

/**
* 求和函数
*/
public int sumage() {
   int sum = 0;
   try {
    Query query = this.GetSession().createQuery(
      "select sum(SAge) from Stu");
    sum = (Integer) query.uniqueResult();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return sum;
}

/**
* Criteria排序
*/
public List getallCriteriaOrder() {
   List arr = null;
   try {
    Criteria cri = this.GetSession().createCriteria(Stu.class);
    cri.addOrder(Order.desc("SAge"));
    arr = cri.list();
   } catch (HibernateException e) {
    throw e;
   } finally {
    this.CloseSession();
   }
   return arr;
}
}
一方:

package com.mengya.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Transaction;

import com.mengya.entity.TType;
import com.mengya.util.MySessionUilt;

public class TypeDAO extends MySessionUilt {
 private Transaction tran;
 
 /**
  * 一对多中的一方inner join fetch多方
  * 这里不能用inner join on
  * 查询结果是它把一方对多方的那个集合里面的对象都查询出来放到一方的集合中
  */
 public List getallByinnerjoinTShop(){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TType as t inner join fetch t.TShops");
   list=query.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;
 }
 
 /**
  * left join fetch 左外连接
  * 
  */
 public List getallLeftjoinfetchTShop(){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TType as t left join fetch t.TShops");
   list=query.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;  
 }
 
 /**
  * left join  左外连接
  * 
  */
 public List getallLeftjoinTShop(){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TType as t left join  t.TShops");
   list=query.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;  
 }
 
 /**
  * 隐式内连接
  */
 public List getall(){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TType as t,TShop as s where s.TType=t");
   list=query.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;
 }
 
 /**
  * 集合过滤
  */
 public List getallfilter(int price){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TType");
   list=query.list();
   Iterator iter=list.iterator();
   while(iter.hasNext()){
    TType type=(TType) iter.next();
    Query que=this.GetSession().createFilter(type.getTShops(), "where SPrice>=?");
    que.setInteger(0, price);
    List arr=que.list();
    type.setTShops(new HashSet(arr));
   }
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;
 }
 
}
多方:

package com.mengya.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import com.mengya.entity.TShop;
import com.mengya.util.MySessionUilt;

public class ShopDAO extends MySessionUilt {
 private Transaction tran;
 
 /**
  * 多条件组合查询
  */
 public List getallByMoreWhere(String name,double price){
  List list=null;
  try {
   Criteria cri=this.GetSession().createCriteria(TShop.class);
   if(name!=null && name.length()>1){
    cri.add(Restrictions.like("SName", name,MatchMode.ANYWHERE));
   }
   if(price>0){
    cri.add(Restrictions.lt("SPrice", price));
   }
   list=cri.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;
 }
 
 /**
  * 多对一中的多方的inner join on(主对象可以查出从对象,即使主对象中关与从对象的lazy="true"也是可以把从对象查询出来)
  * 以TShop为主,若TShop的TType为空,则查询后没有这条记录。即查询结果都是非空的
  * 这种方式List中存放的是Object的数组,Object[]中的元素才是TShop和TType
  */
 public List getallByinnerjoinTtype(){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TShop as s inner join s.TType");
   list=query.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;
 }
 
 /**
  * 多对一中的多方的inner join fetch(主对象可以查出从对象,即使主对象中关与从对象的lazy="true"也是可以把从对象查询出来)
  * 以TShop为主,若TShop的TType为空,则查询后没有这条记录。即查询结果都是非空的
  * 这种方式List中存放的是TShop对象,TShop.TType对象是非空的
  */
 public List getallByinnerjoinTtype2(){
  List list=null;
  try {
   Query query=this.GetSession().createQuery("from TShop as s inner join fetch s.TType");
   list=query.list();
  } catch (HibernateException e) {
   throw e;
  }finally{
   this.ColseSession();
  }
  return list;
 } 
}

测试:

package com.mengya.test;

import java.util.Iterator;
import java.util.List;

import com.mengya.dao.ShopDAO;
import com.mengya.dao.TypeDAO;
import com.mengya.entity.TShop;
import com.mengya.entity.TType;

public class Test {
 
 public static void main(String[] args) {
  ShopDAO shopdao=new ShopDAO();
  TypeDAO typedao=new TypeDAO();
  /*List list=shopdao.getallByMoreWhere("", 50);
  Iterator cri=list.iterator();
  while(cri.hasNext()){
   TShop shop=(TShop) cri.next();
   System.out.println(shop);
  }*/
  
  /* 多对一中的多方的inner join on(主对象可以查出从对象,即使主对象中关于从对象的lazy="true"也是可以把从对象查询出来)
   * 以TShop为主,若TShop的TType为空,则查询后没有这条记录。即查询结果都是非空的
   */
  /*List list=shopdao.getallByinnerjoinTtype();
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   Object[] obj=(Object[]) iter.next();
   TShop shop=(TShop) obj[0];
   TType type=(TType) obj[1];
   System.out.println(shop.getSName()+"  "+shop.getSPrice()+"  所属类别"+shop.getTType().getTName());
   System.out.println(type.toString());
   
  }*/
  
  /**
   * 用的from TShop as s inner join fetch s.TType
   * 这样list中存放的就是TShop对象,但它会把一方也查出来,
   * 同样如查TShop对象对应的TType为null,这个TShop也不会查询出来,即查询结果都是非空的。
   */
  /*List list=shopdao.getallByinnerjoinTtype2();
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   //这样就是错的
   //Object[] obj=(Object[]) iter.next();
   //TShop shop=(TShop) obj[0];
   //TType type=(TType) obj[1];
   //System.out.println(shop.getSName()+"  "+shop.getSPrice()+"  所属类别"+shop.getTType().getTName());
   //System.out.println(type.toString());
   TShop shop=(TShop) iter.next();
   System.out.println(shop.getSName()+"  "+shop.getSPrice()+"  所属类别"+shop.getTType().getTName());   
  }*/
  
  /*List list=typedao.getallByinnerjoinTShop();
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   TType type=(TType) iter.next();
   System.out.println(type.toString());
   Iterator<TShop> it=type.getTShops().iterator();
   while(it.hasNext()){
    TShop sh=it.next();
    System.out.println(sh.toString());
   }
  }*/
  
  /*List list=typedao.getallLeftjoinfetchTShop();
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   TType type=(TType) iter.next();
   System.out.println(type.toString());
   Iterator<TShop> it=type.getTShops().iterator();
   while(it.hasNext()){
    TShop sh=it.next();
    System.out.println(sh.toString());
   }
  }*/
  
  /*List list=typedao.getallLeftjoinTShop();
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   Object[] obj=(Object[]) iter.next();
   TType type=(TType) obj[0];
   TShop shop=(TShop) obj[1];
   System.out.println(type.toString());
   //访问type对象里面的TShops集合里的元素,有懒加载问题
   //Iterator<TShop> it=type.getTShops().iterator();
   //while(it.hasNext()){
   //TShop sh=it.next();
   //System.out.println(sh.toString());
   //}
   //from TType as t left join  t.TShops shop可能为空
   if(shop!=null){
    System.out.println(shop.toString());
   }   
  }*/
  
  /**
   * 隐式内联连
   */
  /*List list=typedao.getall();
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   Object[] obj=(Object[]) iter.next();
   TType type=(TType) obj[0];
   TShop shop=(TShop) obj[1];
   System.out.println(type);
   System.out.println(shop);
  }*/
  
  List list=typedao.getallfilter(10);
  Iterator iter=list.iterator();
  while(iter.hasNext()){
   TType type=(TType) iter.next();
   System.out.println(type.toString());
   Iterator<TShop> it=type.getTShops().iterator();
   while(it.hasNext()){
    TShop sh=it.next();
    System.out.println(sh.toString());
   }
  }
  
 }

}

 

分享到:
评论
1 楼 hlbng 2009-06-04  
Query query=this.GetSession().createQuery(hql);
query.iterate()与query.list()
效率是说query.iterate()比query.list()好,但做了N+1次查询
它们都是先从数据库的查询出主键值,然后根据主键值查询出对象,
只是query.iterate()会根据主键值先从缓存当中找,若没有就从数据库查询
query.list()会根据主键值在数据库查询(N+1)

相关推荐

    Hibernate and JDBC

    ### Hibernate与JDBC:概述与对比 #### 一、JDBC简介 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC...

    hibernate+jdbc版课设 新闻发布系统

    "jdbc"文件夹可能包含了一些自定义的JDBC操作,如连接池配置、数据访问对象(DAO)类,或者是一些在Hibernate未能完全覆盖到的特定数据库操作。而"hibernate"文件夹则可能包含了Hibernate的配置文件(如hibernate....

    hibernate3_jdbc_spring3_tomcat6(jar包)

    标题 "hibernate3_jdbc_spring3_tomcat6(jar包)" 暗示了这是一个关于整合Hibernate 3、JDBC、Spring 3框架,并在Tomcat 6应用服务器上运行的项目。这个项目的重点是展示如何在Java环境中高效地管理持久层操作,...

    jdbc_Hibernate总结

    JDBC(Java Database Connectivity)是Java程序连接数据库的标准方式,其基本步骤包括实例化驱动、...了解这些基本概念和操作后,开发者能够更高效地利用Hibernate进行数据库操作,减少了直接处理JDBC时的繁琐工作。

    jdbc和hibernate学习内容

    JDBC(Java Database Connectivity)和Hibernate是Java中处理数据库操作的两个重要工具。对于初学者来说,理解和掌握这两个技术对于深入理解Java后端开发至关重要。 JDBC是Java API,它提供了一种标准的方式来连接...

    在JDBC,hibernate中实现分页

    ### 在JDBC与Hibernate中实现分页功能 随着数据量的不断增长,高效地管理和展示大量数据成为了一个挑战。为了优化用户体验并减轻服务器负担,分页技术被广泛应用于各种应用场景中。本文将深入探讨如何在Java开发...

    Hibernate操作持久化对象

    Hibernate的核心在于提供对象-关系映射(ORM)服务,使得开发者能够以面向对象的方式来管理和操作数据库中的数据,从而减少了直接使用JDBC进行数据操作时的复杂性和错误。 为什么需要Hibernate? 在传统的JDBC编程中...

    hibernate环境搭建基本操作封装

    2. **JDBC驱动**: Hibernate需要JDBC驱动来与MySQL通信,下载对应MySQL版本的JDBC驱动(如`mysql-connector-java-x.x.x.jar`),将其添加到项目的类路径中,或者在Maven或Gradle项目中将其添加为依赖。 3. **创建...

    hibernate操作

    在本文中,我们将深入探讨如何在MyEclipse中配置并使用Hibernate进行数据库操作。Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者通过Java对象来操作数据库,避免了直接编写SQL语句的繁琐过程。 首先...

    使用Hibernate完成影院售票系统

    在这个“使用Hibernate完成影院售票系统”的项目中,我们将探讨如何利用Hibernate来构建一个完整的影院售票应用。这个项目可能是在北大青鸟的两年课程中的一个重要实践环节,旨在提升学员对数据库操作、对象关系映射...

    hibernate工程常用jar包

    SessionFactory的创建通常在应用启动时完成,通过配置文件和hibernate-cfg.xml进行初始化。 2. **Session**:Session是与数据库交互的主要接口,它负责持久化对象的创建、更新和删除,以及执行查询。Session内部...

    hibernate-junit4.0-postgresql-8.4-jdbc等jar包

    同时,可以使用`SessionFactory`和`Session`的实例来完成数据库操作。 综上所述,这个压缩包包含的jar包是实现Hibernate连接PostgreSQL数据库以及进行单元测试所必需的。通过正确地配置和使用这些库,你可以高效、...

    Hibernate基本增删改CRUD操作

    配置完成后,创建`hibernate.cfg.xml`配置文件,设置数据库连接参数,如JDBC驱动、URL、用户名和密码等。 ### 2. 实体类设计 在进行CRUD操作之前,我们需要定义与数据库表对应的实体类。例如,如果我们有一个`User...

    Hibernate操作数据库的方法

    使用Hibernate,开发者无需直接使用JDBC API,因为Hibernate封装了大部分数据库操作的细节,从而可以减少重复代码,提高开发效率。 Hibernate操作数据库时,主要通过以下几个核心组件来实现持久层操作: 1. **...

    传智播客JDBC_完成对数据库的CRUD操作.rar

    本教程“传智播客JDBC_完成对数据库的CRUD操作”主要涵盖了如何利用JDBC进行数据库的基本操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据。 一、创建(Create) 创建数据通常涉及到...

    关于Hibernate分页类和jdbc的sql分页完美融合

    在给定的"SuperHibernateEntityDao.java"文件中,可能包含了一个自定义的DAO基类,该类扩展了Hibernate的通用DAO操作,并可能实现了JDBC SQL分页的方法。这样的类通常会有一个用于执行分页查询的方法,比如`...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    2. **驱动兼容性**: 检查使用的JDBC驱动是否与Hibernate版本和数据库版本兼容。有时升级或降级驱动可以解决问题。 3. **SQL查询异常**: Hibernate的HQL或Criteria API执行出错时,应检查查询语法是否正确,以及实体...

    spring分别与jdbc和hibernate结合的事务控制--案例

    当一个数据库操作跨越多个DAO(数据访问对象)调用时,Spring会确保这些操作在一个事务内完成。这意味着,如果任何一步出错,整个事务都将被回滚,保持数据的一致性。 在实践中,开发者需要考虑事务隔离级别,这是...

Global site tag (gtag.js) - Google Analytics