三层构架讲授,SSH初体验种类

时间:2020-03-02 10:34来源:江苏十一选五手机版数据库
博主做过很多类型的archive脚本编写,对于这种删除数据的本子开垦,明显是一同始的话用最简易的贰个delete语句,然后由于某些表数据量相当大呀,索引很多呀,会发觉除去数据极慢况

博主做过很多类型的archive脚本编写,对于这种删除数据的本子开垦,明显是一同始的话用最简易的贰个delete语句,然后由于某些表数据量相当大呀,索引很多呀,会发觉除去数据极慢况且影响系统的健康使用。然后就对delete语句实行按均匀数据量分批delete的改写,那样的话,原本的删减叁个表用叁个讲话,就恐怕成为几十行,要是archive的表有19个以至几13个,那大家的本子篇幅就特别大了,扩大了开支和保养的基金,不便利阅历少之甚少的新入职同事去付出archive脚本,也轻巧把专注力分散到所谓分批逻辑中。

Ok,后天比较详细的求学一下hibernate的C(create卡塔尔、奥德赛(readState of Qatar、U(updateState of Qatar、D(deleteState of Qatar相关api...

平时性意义上的三层布局便是将全体育赛事情应用细分为:表现层(UI**江苏十一选五手机版,作业逻辑层(BLL数码访问层(**DAL)

听别人讲这种状态,本周博主恰幸而做事进度中,总计并编写了贰个活动分批删除数据的模版,模板固定不变,只须要把专注力聚焦放在delete语句中,况兼可以在delete语句中央调节制每批删除的数据量,相比较便利,通过变量组装模板sql,防止每个表就独自写叁个分批逻辑的重复代码,化简为繁,扩足够批删除一个表内定数量的话只需求追加几行代码就能够。

前言

  Session: 是Hibernate持久化操作的底子,提供了超多的数据库操作方法,如save(卡塔尔(قطر‎,update(卡塔尔(قطر‎,delete(卡塔尔国。。。etc,用于完结目的的加多,校正,删除等方法.

  前边代码中应用到的HinernateUtil类:是用来构建SessionFactory(Hibernate提供的取得session的工厂类卡塔尔的三个封装类,在后边的随笔SSH初体验种类--Hibernate--1--情况布署及demo中有详细代码,可机关查看.

有别于档期的顺序的目标即为了“高内聚,低耦合”的思想。

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

一) 增(C)

表现层(UI):通俗讲就是表现给客户的分界面,即客户在行使八个系统的时候的所见所得。

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();
        }
    }

加多单条数据

业务逻辑层(BLL):针对实际难点的操作,也能够说是对数据层的操作,对数据业务逻辑管理

实际请参谋下边包车型客车本子和血脉相仿注脚,如有不懂的地点款待钻探或私信咨询博主。

  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,批量交给",就是我们最终想要的高质量的答案;

多少访谈层(DAL):该层所做事情直接操作数据库,本着数据的扩大、删除、矫正、更新、查找等每层之间是一种笔直的关系

-- ===== 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

三层布局是N层布局的一种,平时的话,等级次序之间是向下重视的,下层代码未规定其接口(左券)前,上层代码是无奈支付的,下层代码接口(合同)的浮动将使上层的代码一齐变化。

总结

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

    还恐怕有一种开发江西中国广播公司泛的需固然,表的一对多关心,举个生活中的例子:二个支付宝账号绑定多张银行卡,每张卡都会来得他本身是哪些银行的,卡号是稍微...等新闻;

    那么我们那边就用两张新表来演示,一张账户表(AccountState of Qatar,类比于支付宝账户;一张绑定银行卡表(BindCardState of Qatar,记录例子中的绑定银行卡音讯;二个账户会对应该多条绑定银行卡记录.

    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;

      在那之中有几点须求极度说美素佳儿(Friso卡塔尔国下:

        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();
    }
}

江苏十一选五手机版 21

   方式三: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 = 等于;

                    b卡塔尔 Restrictions.allEq = 使用Map、key/value举办五个特别的对照;

                    c) Restrictions.gt = 大于;

                    d卡塔尔(قطر‎ Restrictions.ge = 大于等于;

                    e) Restrictions.ct = 小于;

                    f卡塔尔(قطر‎  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(卡塔尔代替格局的询问结果,在百度上临时很难找到,那一个地方也是费了老大劲了. 卡塔尔国:

@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");
    }

 

编辑3层的步骤:

三) 改(U)、删(D)

  相较于"CGL450",修正和删除的急需相对就比较简单了,未有那么多的纷纷必要,那一个地方就轻巧带过了;

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

 

1.明确须要:
点击按键达成年龄自动+1

后言

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

  真正写的时候,才发觉, "crud",叫起来何等轻巧的四个单词,中间的篇章何其多,深挖起来,几天几夜也说不完; hibernate三个风靡的框架,里面包车型客车内容又是多么多,博主实在是不敢继续持续长远下去了,不然那篇小说公布不知要到何年何月去了(哈哈~~开个笑话卡塔尔国...

  小说内容即便不深,可是博主是在细心写,里面包车型客车每一段代码,都以测量检验运维,确认精确的...(本人受够了互连网前言不搭后语的demo代码,骂过... 相符原因,可不想自个儿也被参照他事他说加以考察了文内代码的人在私行骂^_^卡塔尔要是我们开采什么难题,也迎接评论,有标题标地点,小编会立时改进;

  文章写着挺耗费时间的,但是楼主会至死不悟下去。理由独有七个:1.只要您也刚开头学Hibernate,本文能让您感觉有个别有个别收获,笔者就能认为温馨的从未有过做无用功;  2.博首要好忘了的时候,业得以回头来翻看;

  也招待我们关切,合营学习,合营进步.

 本文版权归小编和博客园共有,款待转发,但未经小编同意必需保留此段注解,且在小说页面明显地点给出原来的书文连接,不然保留深究法律义务的权利;

本文来源:新浪--别问是何人

2.遵照要求鲜明SQL语句。
update tblstudent set tsage=tsage+1 where tsid=@id

3.1因为有了SQL语句,迟早都要推行,所以先编辑实行该SQL语句的代码。实行该SQL语句的代码应该放在“数据访谈层”(编写数据访谈层)
在数量访问层,以后大概实行超多的sql语句,区别的Sql语句大概操作差别的表,所以大家要为今是昨非的表建分裂类,在某些类中,都以有关操作某张表的Sql语句。

3.2编辑具体的施行钦定sql语句的法子:1>分明方法的参数2>鲜明方法的再次来到值
//分明方法的参数:日常要奉行的sql语句中有多少个参数,那么该办法就有多少个参数。

//鲜明再次来到值:实施完结该sql语句,数据库再次来到了何等,那么该格局原样重临该值,不要做判别

4.编写制定工作逻辑层
4.1先是编写多个操作特定表的事务逻辑层类XxxxxBll
4.2编写制定对应的方式
4.3依据表现层的急需,分明职业访谈层类的办法该怎么编写(显然参数和再次回到值)

public bool IncAge(int sid)
{

}

5.表现层调用业务层完毕效果与利益。

编辑:江苏十一选五手机版数据库 本文来源:三层构架讲授,SSH初体验种类

关键词: