SSH初体验系列–Hibernate–2–crud操作

博主做过比超级多门类的archive脚本编写,对于这种删除数据的剧本开采,断定是一最早的话用最简便的叁个delete语句,然后由于有的表数据量比极大呀,索引超多呀,会意识除去数据超级慢而且影响系统的常规使用。然后就对delete语句实行按均匀数据量分批delete的改写,那样的话,原本的去除二个表用一个口舌,就大概变为几十行,要是archive的表有二十个以至几十三个,那我们的台本篇幅就可怜大了,扩张了付出和护卫的财力,不便民涉世相当少的新入职同事去支付archive脚本,也轻易把集中力分散到所谓分批逻辑中。

Ok,明日可比详细的求学一下hibernate的C(create)、Escort(readState of Qatar、U(updateState of Qatar、D(delete卡塔尔国相关api…

基于这种状态,本周博主适逢其会在办事历程中,总括并编写制定了一个电动分批删除数据的模板,模板固定不改变,只供给把集中力聚集放在delete语句中,况兼能够在delete语句中央调整制每批删除的数据量,相比较方便,通过变量组装模板sql,幸免各种表就独自写三个分批逻辑的双重代码,化简为繁,扩大分批删除贰个表钦赐数量的话只要求增加几行代码就能够。

前言

  Session:
是Hibernate悠久化操作的底工,提供了无数的数据库操作方法,如save(卡塔尔(قطر‎,update(卡塔尔国,delete(State of Qatar。。。etc,用于达成目的的增加,更正,删除等方法.

  前面代码中使用到的HinernateUtil类:是用以创设SessionFactory(Hibernate提供的拿走session的工厂类State of Qatar的三个封装类,在头里的小说SSH初体验连串–Hibernate–1–情况安顿及demo中有详细代码,可自动查看.

demo1:不带参数,根据表tmp_Del删除表A对应ID的数据。

一) 增(C)

demo2:带参数,依据Date字段是或不是过期删除表B对应数据。

  1.增多单条个数据;

澳门贵宾会注册送豪礼 1澳门贵宾会注册送豪礼 2

    @org.junit.Test
    public void save(){
        //创建对象
        Feedback newItem=new Feedback();
        newItem.setUsername("andew17");
        newItem.setContent("测试单条插入");
        newItem.setSendTime(new Timestamp(System.currentTimeMillis()));

        Session session=null;
        Transaction tx=null;
        try{
            //获取session对象
            session= HibernateUtil.openSession();
            //开启事务
            tx=session.beginTransaction();
            //执行保存
            session.save(newItem);
            //提交事务
            tx.commit();
        }catch(Exception e){
            //异常时,事务回滚
            tx.rollback();
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //释放session
            session.close();
        }
    }

增多单条数据

切切实实请参照他事他说加以考察下边的台本和有关认证,如有不懂之处接待争论或私信咨询博主。

  2.批量抬高数据;

    能够通过for循环,将数据统一增加到拔尖缓存session中,再commit到数据库;

澳门贵宾会注册送豪礼 3澳门贵宾会注册送豪礼 4

@org.junit.Test
    public void saveMany(){
        //创建对象
        List<Feedback> feedbackList=new ArrayList<>();
        for(int i=0;i<10;i++){
            Feedback newItem=new Feedback();
            newItem.setUsername("andew"+i);
            newItem.setContent("测试单条插入"+i);
            newItem.setSendTime(new Timestamp(System.currentTimeMillis()));
            feedbackList.add(newItem);
        }
        Session session=null;
        Transaction tx=null;
        try{
            //获取session对象
            session= HibernateUtil.openSession();
            //开启事务
            tx=session.beginTransaction();
            //执行保存,此时只是保存到Session缓存中,并没有同步到数据库
            Feedback feedback=null;
            for(int i=0;i<feedbackList.size();i++){
                feedback=feedbackList.get(i);
                session.save(feedback);
            }
            //提交事务,就缓存同步到数据库
            tx.commit();
        }catch(Exception e){
            //异常时,事务回滚
            tx.rollback();
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //释放session
            session.close();
        }
    }

for循环试行session的save方法

    要是数据量十分的小时,只怕对品质未有最棒的求偶时,这种形式还ok;不过当批量布署数据量比较大时,那么些措施的坏处就展现出来了.

    缺陷主要有两点:a,循环向Session增添,改过数据时,Session对象自笔者开垦的一级缓存会不断被消耗,直到耗尽(outOfMemoryErrorState of Qatar;

             b,通过在hibernate.cfg.xml文件配置”显示sql语句”

        <!--显示SQL语句-->
        <property name="show_sql">true</property>

              再追踪打字与印刷的SQl语句,超轻巧就意识,内部其实还是进行了n(n=数据量卡塔尔(قطر‎次的插入操作,实际不是二回语句实践,在性能上,可想并非很好.
对于爱好追求代码质量的同伴,那是令人难以忍受的,骨鲠在喉…

Hibernate: select max(id) from feedback
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Hibernate: insert into feedback (username, content, sendTime, id) values (?, ?, ?, ?)
Disconnected from the target VM, address: '127.0.0.1:59399', transport: 'socket'

Process finished with exit code 0

    设计方案:a,对于内部存储器溢出,能够在代码中开展判断,每间距n条,释放一次缓存;何况在hibernate.xfg.xml中铺排每一回提交sql的数目

<property name="hibernate.jdbc.batch_size">10</property>

// 每处理20条清空缓存
session.save(newItem);
if (i%20 == 0) {
    session.flush();
    session.clear();
}

        b.若想在质量上富有进级,能够绕过Hibernate
Api,直接使用jdbc api来做批量插入;

澳门贵宾会注册送豪礼 5澳门贵宾会注册送豪礼 6

@org.junit.Test
    public void saveJdbc(){
        //创建对象
        List<Feedback> feedbackList=new ArrayList<>();
        for(int i=0;i<20;i++){
            Feedback newItem=new Feedback();
            newItem.setUsername("andew"+i);
            newItem.setContent("测试单条插入"+i);
            newItem.setSendTime(new Timestamp(System.currentTimeMillis()));
            feedbackList.add(newItem);
        }
        String insertSql="insert into feedback (username, content, sendTime) values (?, ?, ?)";

        Session session=null;
//        Transaction tx=null;
        try{
            session= HibernateUtil.openSession();
            //tx=session.beginTransaction();
            session.doWork(new Work() {
                @Override
                public void execute(Connection connection) throws SQLException {
                    //这里面就得到connection了
                    PreparedStatement stmt=connection.prepareStatement(insertSql);
                    //方式1:自动提交
                    /*connection.setAutoCommit(true);
                    for(int i=0;i<feedbackList.size();i++){
                        stmt.setString(1,"andrew"+1);
                        stmt.setString(2,"test content "+i);
                        stmt.setTimestamp(3,new Timestamp(System.currentTimeMillis()));
                        stmt.execute();//此语句,每次执行,都会将一条数据插入到db
                    }*/

                    //方式2:批量提交
                    connection.setAutoCommit(false);
                    for(int i = 0; i<feedbackList.size();i++) {
                        stmt.setString(1,"andrew"+1);
                        stmt.setString(2,"test content "+i);
                        stmt.setTimestamp(3,new Timestamp(System.currentTimeMillis()));
                        stmt.addBatch();
                        if (i % 10 == 0) {
                            stmt.executeBatch();
                            connection.commit();//此处执行一次db插入操作
                        }
                    }
                    stmt.executeBatch();
                    connection.commit();
                }
            });
            ////注意:此时不能再用事务,会报错:org.hibernate.TransactionException: Unable to commit against JDBC Connection
            // tx.commit();
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //释放session
            session.close();
        }
    }

jdbc批量插入数据

    当中有多少个地点须要专一:

      a,connection对象的得到:

a)过时方式:session.connection();
     但是这个方法Hibernate不推荐使用,The method connection() from the type         Session is deprecated
    在3.3以后的版本中已经被废除了。

b)Session.doWork;
    3.3官方的替代方法是用Session.doWork(Work work);
    传入的参数work是一个接口,可以:
    HibernateFactory.getSession().doWork(
          new Work() {
            public void execute(Connection connection) {
              // 这里面就得到connection了,    
                }
          }
        );   

      b.代码中的”方式2,批量付出”,就是大家最后想要的高性能的答案;

-- ===== 1 分批archive模板 =======================================================--/* 说明:1. 组装的archive语句为:@sql = @sql_Part1 + @sql_Del + @sql_Part22. 组装的参数@parameters为:@parameters = @parameters_Base + 自定义参数3. 传入参数:@strStepInfo 需要print的step信息4. archive逻辑专注于@sql_Del,而非分散于分批。*/declare @parameters nvarchar(max) = '', @parameters_Base nvarchar(max) = N'@strStepInfo nvarchar(100)', @sql nvarchar(max) = '', @sql_Part1 nvarchar(max) = N'declare @iBatch int = 1, --批次 @iRowCount int = -1 --删除行数,初始为-1,后面取每批删除行数@@ROWCOUNTprint convert(varchar(50), getdate(), 121) + @strStepInfowhile @iRowCount  0begin print ''begin batch:'' print @iBatch print convert(varchar(50), getdate(), 121) begin try begin tran', @sql_Del nvarchar(max) = '' --@sql_Del脚本需要根据实际情况在后续脚本中自行编写, @sql_Part2 nvarchar(max) = N' select @iRowCount = @@rowcount commit tran end try begin catch rollback tran print ''-- Error Message:'' + convert(varchar, error_line()) + '' | '' + error_message() end catch waitfor delay ''0:00:01'' --延时 print convert(varchar(50), getdate(), 121) print ''end batch'' select @iBatch = @iBatch + 1end'-- ===== 2 demo1:archive 表A =======================================================select @parameters = @parameters_Base + '' --如果有需要增加自定义参数,在这里加,例如@parameters = @parameters_Base + ', @ArchiveDate datetime', @sql_Del = ' delete top (50000) tc_Del from 表A tc_Del inner join tmp_Del cd on cd.ID = tc_Del.ID'select @sql = @sql_Part1 + @sql_Del + @sql_Part2print @sqlexec sp_executesql @sql, @parameters, N' 2 archive 表A'-- ===== 3 demo2:archive 表B =======================================================select @parameters = @parameters_Base + ', @ArchiveDaate datetime' --如果有需要增加自定义参数,在这里加,例如@parameters = @parameters_Base + ', @ArchiveDate datetime', @sql_Del = ' delete top (50000) from 表B where Date  @ArchiveDate'select @sql = @sql_Part1 + @sql_Del + @sql_Part2print @sqlexec sp_executesql @sql, @parameters, N' 3 archive 表B', @ArchiveDate

  3.运用一对一涉及增加数据

    在实际上付出中,大家平常会遇上表关联的图景,譬如一张数据表的记录与另一张数据表记录一一对应,即:一一对应提到,那时候大家对表数据的增进最好也应当是三回性关系加多的.Hibernate就提供了有关的点子,供开拓人士管理这种涉及的映射,上面就来读书一下.

    此处,大家采取两张新表来进行学习,UserInfo和UserExtend,此中UserInfo记录客户的姓名,性别,出生日期等基本功消息,UserExtend记录扩大新闻,如工作,公司,地址等。UserInfo中通过一个UserExtend属性与UserExtend表相关联。具体如下:

澳门贵宾会注册送豪礼 7澳门贵宾会注册送豪礼 8

/**
 * Created by c-yangx on 11/18/2016.
        */
public class UserInfo {
    private int id;
    private String name;
    private Timestamp birthday;
    private String sex;
    private UserExtend userExtend;

    public int getId() {return id;}

    public void setId(int id) {this.id=id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public Timestamp getBirthday() {return birthday;}

    public void setBirthday(Timestamp birthday) {this.birthday = birthday;}

    public String getSex() {return sex;}

    public void setSex(String sex) {this.sex = sex;}

    public UserExtend getUserExtend() {return userExtend;}

    public void setUserExtend(UserExtend userExtend) {this.userExtend = userExtend;}
}

UserInfo.java

澳门贵宾会注册送豪礼 9澳门贵宾会注册送豪礼 10

/**
 * Created by c-yangx on 11/18/2016.
 */
public class UserExtend {
    private int id;
    private String position;
    private String company;
    private String address;
    private UserInfo userInfo;

    public int getId() {return id;}
    public void setId(int id) {this.id = id;}

    public String getPosition() {return position;}

    public void setPosition(String position) {this.position = position;}

    public String getCompany() {return company;}

    public void setCompany(String company) {this.company = company;}

    public String getAddress() {return address;}

    public void setAddress(String address) {this.address = address;}

    public UserInfo getUserInfo() {return userInfo;}

    public void setUserInfo(UserInfo userInfo) {this.userInfo = userInfo;}
}

UserExtend.java

澳门贵宾会注册送豪礼 11澳门贵宾会注册送豪礼 12

<?xml version="1.0"  encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="models">
    <class name="models.UserInfo" table="userinfo" catalog="public">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" not-null="true">
                <comment>姓名</comment>
            </column>
        </property>
        <property name="birthday" type="java.sql.Timestamp">
            <column name="birthday" length="20" not-null="true">
                <comment>出生日期</comment>
            </column>
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex" length="5" not-null="true">
                <comment>性别:w=女;m=男;</comment>
            </column>
        </property>
        <many-to-one name="userExtend" column="userExtend" unique="true" not-null="true" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>

UserInfo.hbm.xml

澳门贵宾会注册送豪礼 13澳门贵宾会注册送豪礼 14

<?xml version="1.0"  encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="models">
    <class name="models.UserExtend" table="userextend" catalog="public">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"></generator>
        </id>
        <property name="position" type="java.lang.String">
            <column name="position" length="50" not-null="false">
                <comment>职位</comment>
            </column>
        </property>
        <property name="company" type="java.lang.String">
            <column name="company" length="200" not-null="false">
                <comment>公司名</comment>
            </column>
        </property>
        <property name="address" type="java.lang.String">
            <column name="address" length="50" not-null="false">
                <comment>住址</comment>
            </column>
        </property>
        <one-to-one name="userInfo" property-ref="userExtend"></one-to-one>
    </class>
</hibernate-mapping>

UserExtend.hbm.xml

    测量试验代码为:

@org.junit.Test
    public void save_one2one() throws ParseException {
        //创建对象
        UserInfo userInfo=new UserInfo();
        UserExtend userExtend=new UserExtend();
        userExtend.setPosition("IT");
        userExtend.setCompany("guess");
        userExtend.setAddress("BeiJing CangPing");
        userInfo.setName("andrew");

        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
        userInfo.setBirthday(new Timestamp(simpleDateFormat.parse("1992-01-10").getTime()));

        userInfo.setSex("m");
        userInfo.setUserExtend(userExtend);

        Session session=null;
        Transaction tx=null;
        try{
            session= HibernateUtil.openSession();
            tx=session.beginTransaction();

            session.save(userInfo);

            tx.commit();
        }catch(Exception e){
            tx.rollback();
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            session.close();
        }
    }

    从细分类上,此种归属”唯一外键双向关联”,别的的还只怕有”多对一单向关系”、”多对多单向关系”等,那么些话题内容比较多,就不在那处伸开,后边可能会单开一篇小说研讨一下.

    对了,最终一定别忘了在主配置文件hibernate.cfg.xml中增添mapping配置。

    放一张数据库截图,生成表构造如图所示:

澳门贵宾会注册送豪礼 15

总结

  4.一对多关系增多数据.

    还或然有一种开辟中广泛的须求是,表的一对多关切,举个生活中的例子:二个支付宝账号绑定多张银行卡,每张卡都会展现她本人是哪位银行的,卡号是微微…等新闻;

    那么大家那边就用两张新表来演示,一张账户表(Account卡塔尔国,类比于支付宝账户;一张绑定银行卡表(BindCard卡塔尔国,记录例子中的绑定银行卡音信;叁个账户会对应当多条绑定银行卡记录.

    a> 多个model类的代码如下:

澳门贵宾会注册送豪礼 16澳门贵宾会注册送豪礼 17

/**
 * Created by c-yangx on 11/18/2016.
 */
public class Account {

    private int id;
    private String name;
    private Set<BindCard> bindCards;

    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public Set<BindCard> getBindCards() {return bindCards;}

    public void setBindCards(Set<BindCard> bindCards) {this.bindCards = bindCards;}
}

Account.java

澳门贵宾会注册送豪礼 18澳门贵宾会注册送豪礼 19

/**
 * Created by c-yangx on 11/18/2016.
 */
public class BindCard {
    private int id;
    private String cardNum;
    private int cardType;

    private Account account;

    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getCardNum() {return cardNum;}

    public void setCardNum(String cardNum) {this.cardNum = cardNum;}

    public int getCardType() {return cardType;}

    public void setCardType(int cardType) {this.cardType = cardType;}

    public Account getAccount() {return account;}

    public void setAccount(Account account) {this.account = account;}
}

BindCard.java

    b>Account.hbm.xml;

      个中有几点须求特意说澳优(KaricareState of Qatar下:

        1.在璀璨文件里,通过<set>标签配置一对多的关系映射;

        2.cascade属性设置的是级联操作类型,设置为all时,是为此操作都能进行; 
假如只实行”创制”和”修正”,也可设置成save-update;

        3.<set>标签的name属性值=持久化类对应的天性名; 
 <key>的column属性值=与其涉嫌的表的外键;                    

<?xml version="1.0"  encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="models">
    <class name="models.Account" table="account" catalog="public">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" not-null="true">
                <comment>账户名</comment>
            </column>
        </property>
        <set name="bindCards" cascade="all" lazy="false">
            <key column="cardId"/>
            <one-to-many class="models.BindCard"/>
        </set>
    </class>
</hibernate-mapping>

    c>最终是测量试验代码,那就没啥许多说的了

@org.junit.Test
    public void save_one2many(){
        BindCard bindCard1=new BindCard();
        bindCard1.setCardNum("1234343242");
        bindCard1.setCardType(0);

        BindCard bindCard2=new BindCard();
        bindCard2.setCardNum("3421213131");
        bindCard2.setCardType(1);

        Set<BindCard> set=new HashSet<>();
        set.add(bindCard1);
        set.add(bindCard2);

        Account account=new Account();
        account.setName("andrew's account");
        account.setBindCards(set);

        Session session=null;
        Transaction tx=null;
        try{
            session= HibernateUtil.openSession();
            tx=session.beginTransaction();

            session.save(account);

            tx.commit();
        }catch(Exception e){
            tx.rollback();
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            session.close();
        }
    }

      生成的数据表布局:

澳门贵宾会注册送豪礼 20

 

以上所述是小编给咱们介绍的sql
server编写archive通用模板脚本完结全自动分批删除数据,希望对大家全数助于,假如我们有此外难题迎接给本人留言,笔者会及时回复咱们的!

二) 查(R)

  情势一:依执照主人键id,查询单条记录,那也是最轻便易行的方式;

        Session session=HibernateUtil.openSession();
        Feedback feedback= session.get(Feedback.class,60);

  方式二:HQL(hibernate query language)查询;

     1.HQL询问语言是什么样?
HQL查询语言是面向对象查询语言,帮忙多态查询;
 当大家想在询问时,做一些复杂的逻辑,比如where 筛选,order by
排序等,HQL就顶上用了;

        Session session= HibernateUtil.openSession();
        String sqlStr="from Feedback";
        Query q=session.createQuery(sqlStr);
        List<Feedback> feedbacks=q.list();

      做标准筛选时,改善下sqlStr就能够:

public List<Feedback> getAll(String userName) {
    Session session = null;
    try {
        session = HibernateUtils.getSession();
        Query q =session.createQuery("from Feedback where userName=?");
        // 注意:参数索引从0开始
        q.setParameter(0, userName);
        // 执行查询
        return q.list();
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        session.close();
    }
}

   方式三:QBC(Query By Criteria)查询;

      1卡塔尔Hibernate
5.2版本以前(临时还不曾核算是5.2事前的哪叁个本子开端卡塔尔,

        使用QBC查询,通常有3个步骤:

          1.用Session实例的createCriterria(卡塔尔(قطر‎方法创设Criteria对象c;

          2.使用Restrictions工具类的相干办法为创立的指标c设置查询条件。

            经常见到的秘诀有: aState of Qatar Restrictions.eq = 等于;

                    bState of Qatar Restrictions.allEq =
使用Map、key/value进行八个极度的比较;

                    c) Restrictions.gt = 大于;

                    d卡塔尔 Restrictions.ge = 大于等于;

                    e) Restrictions.ct = 小于;

                    fState of Qatar  Restrictions.le = 小于等于;

                    g)  Restrictions.between =
对应SQL的between子句;

                    h) Restrictions.like =
对应SQL的like 子句;

                    i) Restrictions.in = 对应SQL
的in子句;

          3.应用对象c的list(卡塔尔方法执行查询,获取结果;

       2卡塔尔国 Hibernate
5.2本未时,createCriteria(卡塔尔(قطر‎方法已经过时了,新版中利用的是链式的询问语句(相近C#中的linq
to
sql,还也可以有今后android中的rxjava,看来,链式编制程序以其杰出的代码风格,便于维护的表征,越来越成为洋气卡塔尔

        上边放一段基本代码
(恐怕因为h5.2版本较新,关于createCriteria(卡塔尔替代方式的询问结果,在百度上不经常很难找到,这几个地点也是费了老大劲了.
State of Qatar:

@org.junit.Test
    public void get_qbc(){
        Session session= HibernateUtil.openSession();
        //在Hibernate 5.2中,此方法过时了
        //Criteria criteria=session.createCriteria(Feedback.class);

        //用新的替代方法
        CriteriaBuilder cBuilder=session.getCriteriaBuilder();
        CriteriaQuery<Feedback> cQuery= cBuilder.createQuery(Feedback.class);
        Root<Feedback> feedbackRoot=cQuery.from(Feedback.class);


        //1.select all records
        CriteriaQuery<Feedback> select = cQuery.select(feedbackRoot);
        TypedQuery<Feedback> typedQuery = session.createQuery(select);
        List<Feedback> resultlist = typedQuery.getResultList();
        /*
        最终打印的sql语句:
        Hibernate: select feedback0_.id as id1_2_, feedback0_.username as username2_2_, feedback0_.content as content3_2_, feedback0_.sendTime as sendTime4_2_ 
            from feedback feedback0_
        **/

        //2.Ordering the records
        CriteriaQuery<Feedback> select1 = cQuery.select(feedbackRoot);
        select1.orderBy(cBuilder.asc(feedbackRoot.get("id")));
        TypedQuery<Feedback> typedQuery1 = session.createQuery(select1);
        List<Feedback> resultlist1 = typedQuery1.getResultList();
        /*
        最终打印的sql语句:
        Hibernate: select feedback0_.id as id1_2_, feedback0_.username as username2_2_, feedback0_.content as content3_2_, feedback0_.sendTime as sendTime4_2_ 
            from feedback feedback0_ order by feedback0_.id asc
        * */


        //3.where select条件筛选查询
        CriteriaQuery<Feedback> select2 = cQuery.select(feedbackRoot);
        select2.orderBy(cBuilder.asc(feedbackRoot.get("id")));
        select2.where(cBuilder.ge(feedbackRoot.get("id"),60));
        TypedQuery<Feedback> typedQuery2 = session.createQuery(select2);
        List<Feedback> resultlist2 = typedQuery2.getResultList();
        /*
        最终打印的sql语句:
        Hibernate: select feedback0_.id as id1_2_, feedback0_.username as username2_2_, feedback0_.content as content3_2_, feedback0_.sendTime as sendTime4_2_ 
            from feedback feedback0_ where feedback0_.id>=60 order by feedback0_.id asc
        * */


        System.out.println("result ok");
    }

 

三) 改(U)、删(D)

  相较于”CSportage”,改进和删除的须求相对就比较轻易了,未有那么多的纷纭必要,那几个地方就轻便带过了;

        //修改(updateInstance=要修改的实例)
        session.update(updateInstance);
        //删除(deleteInstance=要删除的实例)
        session.delete(deleteInstance);

 

后言

  呼~~总算能松口气了。。。

澳门贵宾会注册送豪礼,  真正写的时候,才意识,
“crud”,叫起来何等简单的一个单词,中间的文章何其多,深挖起来,几天几夜也说不完;
hibernate一个风行的框架,里面包车型的士开始和结果又是何其多,博主实乃不敢继续持续浓重下去了,不然那篇文章公布不知要到何年何月去了(哈哈~~开个噱头State of Qatar…

  随笔内容尽管不深,然而博主是在精心写,里面的每一段代码,都以测量检验运营,确认准确的…(自个儿受够了英特网风马不接的demo代码,骂过…
同样原因,可不想自身也被参谋了文内代码的人在背后骂^_^卡塔尔要是大家发现怎么难点,也应接斟酌,有标题标地点,小编会顿时改善;

  小说写着挺耗费时间的,可是楼主会百折不屈下去。理由唯有多个:1.比方你也刚先河学Hibernate,本文能让您感觉有一些有一些收获,作者就能够以为自身的远非做无用功;
 2.博主团结忘了的时候,业得以回头来翻看;

  也招待大家关注,协同学习,合营升高.

 本文版权归作者和天涯论坛共有,接待转发,但未经笔者同意必得保留此段申明,且在文章页面明显地点给出原来的文章连接,否则保留追查法律义务的权利;

本文来源:搜狐–别问是哪个人

发表评论

电子邮件地址不会被公开。 必填项已用*标注