澳门新葡8455最新网站对于这种删除数据的台本开荒,大概会阻止修改操作

澳门新葡8455最新网站 15

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

  3.使用一对一关联添加数据

    在实际开发中,我们经常会遇到表关联的情况,比如一张数据表的记录与另一张数据表记录一一对应,即:一一对应关系,此时我们对表数据的添加最好也应该是一次性关联添加的.Hibernate就提供了相关的方法,供开发人员处理这种关系的映射,下面就来学习一下.

    此处,我们使用两张新表来进行学习,UserInfo和UserExtend,其中UserInfo记录用户的姓名,性别,出生日期等基础信息,UserExtend记录扩充信息,如职业,公司,地址等。UserInfo中通过一个UserExtend属性与UserExtend表相关联。具体如下:

澳门新葡8455最新网站 1澳门新葡8455最新网站 2

/**
 * 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

澳门新葡8455最新网站 3澳门新葡8455最新网站 4

/**
 * 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

澳门新葡8455最新网站 5澳门新葡8455最新网站 6

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

澳门新葡8455最新网站 7澳门新葡8455最新网站 8

<?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配置。

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

澳门新葡8455最新网站 9

澳门新葡8455最新网站 10

echo ———————–“$(date +”%y-%m-%d
%H:%M:%S”)”———————– >> $LogFile

具体请参考下面的脚本和相关说明,如有不懂的地方欢迎评论或私信咨询博主。

前言

  Session:
是Hibernate持久化操作的基础,提供了众多的数据库操作方法,如save(),update(),delete()。。。etc,用于完成对象的增加,修改,删除等方法.

  后面代码中使用到的HinernateUtil类:是用于构建SessionFactory(Hibernate提供的获取session的工厂类)的一个封装类,在前面的文章SSH初体验系列–Hibernate–1–环境配置及demo中有详细代码,可自行查看.

区分层次的目的即为了“高内聚,低耦合”的思想。

我目前应该使用什么样的备份策略的权衡:
物理备份,恢复快,当然最好是存储在一个机器上。我现在是用物理备份还是逻辑备份为好呢?
考虑到以后会迁移平台。为了保证通用性。恢复速度1分钟左右的差距我是可以容忍的。所以我为了跨平台,我更加愿意使用逻辑备份。存储sql文件形式。
双热机备份方式,目前硬件没有多个。技术人员有限,需要人力去维护,比较麻烦。所以排除在外。
方案:
1、总体策略:写个定时执行任务。定时在晚上或凌晨自动备份(考虑数据库服务器在运行中不能停机)
代码中做成备份成功后,把以前的删掉。避免很多数据占据磁盘。
2、考虑到初期数据量这么小。使用mysqldump进行备份吧。设置在凌晨几点(4-6点这个时候基本上没什么人访问)的时候自动备份。
3、使用逻辑备份方式:恢复速度1分钟左右的差距我是可以容忍的。所以我为了跨平台,我更加愿意使用逻辑备份。存储sql文件形式。
4、每天都进行备份。
由于是在凌晨的时候mysqldump去锁定,访问数据库服务器。对服务器几乎没什么影响。所以每天都可以备份。每天都一个sql文件。那么将会很多文件。
所以,每次备份成功后。删除以前的文件。保留最近一个星期的备份sql文件。

根据这种情况,本周博主刚好在工作过程中,总结并编写了一个自动分批删除数据的模板,模板固定不变,只需要把注意力集中放在delete语句中,并且可以在delete语句中控制每批删除的数据量,比较方便,通过变量组装模板sql,避免每个表就单独写一个分批逻辑的重复代码,化简为繁,增加分批删除一个表指定数据的话只需要增加几行代码就可以。

  4.一对多关联添加数据.

    还有一种开发中常见的需求是,表的一对多关心,举个生活中的例子:一个支付宝账号绑定多张银行卡,每张卡都会显示他自己是哪个银行的,卡号是多少…等信息;

    那么我们这里就用两张新表来演示,一张账户表(Account),类比于支付宝账户;一张绑定银行卡表(BindCard),记录例子中的绑定银行卡信息;一个账户会对应有多条绑定银行卡记录.

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

澳门新葡8455最新网站 11澳门新葡8455最新网站 12

/**
 * 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

澳门新葡8455最新网站 13澳门新葡8455最新网站 14

/**
 * 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;

      其中有几点需要特别说明一下:

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

      生成的数据表结构:

澳门新葡8455最新网站 15

 

1.确定需求:
点击按钮实现年龄自动+1

目前流行几种备份方式:
1、逻辑备份: 使用mysql自带的mysqldump工具进行备份。备份成sql文件形式。
优点:最大好处是能够与正在运行的mysql自动协同工作,
在运行期间可以确保备份是当时的点,它会自动将对应操作的表锁定,不允许其他用户修改(只能访问)。可能会阻止修改操作。sql文件通用方便移植。
缺点:备份的速度比较慢。如果是数据量很多的时候。就很耗时间。如果数据库服务器处在提供给用户服务状态,在这段长时间操作过程中,意味着要锁定表(一般是读锁定,只能读不能写入数据)。那么服务就会影响的。
备注:所谓的与mysql服务器能够自动协同工作,实际上是指加参数来控制mysql服务器,比如锁定所有表只能进行读,不能进行写操作。
–lock-all-tables
2、物理备份: 直接拷贝mysql的数据目录。缺点,你不能去操作正在运行的mysql服务器(在拷贝的过程中有用户通过应用程序访问更新数据,这样就无法备份当时的数据)
可能无法移植到其他机器上去。
直接拷贝只适用于myisam类型的表。这种类型的表是与机器独立的。但实际情况是,你设计数据库的时候不可能全部使用myisam类型表。你也不可能:因为myisam类型表与机器独立,方便移植,于是就选择这种表,这并不是选择它的理由。
更多的情况是,你会根据业务特点(比如你需要支持事务机制就必须使用innodb),查询速度和服务性能来选择表类型的。
必须保证表不被使用中。
如果服务器在你则正在拷贝一个表时改变它,拷贝就失去意义。
如果数据库表在文件系统备份过程中被修改,进入备份的表文件主语不一致的状态,而对以后的恢复表将失去意义。
保证你的拷贝完整性的最好方法是:关闭服务器,拷贝文件,然后重启服务器。
或者是,要锁定对应的表(对前端用户造成访问问题)。
解释直接拷贝文件,为什么不具备可移植性?
mysqldump
产生可移植到其他机器、甚至具有不同硬件结构的机器上的文本文件。直接拷贝文件不能够移植到其他机器上,除非要拷贝的表使用MyISAM
存储格式。ISAM
表只能在具有相同硬件结构的机器之间进行拷贝。例如,将文件从S PARC
的Solaris 机器拷贝到Intel 的Solaris
机器(或者相反)是行不通的。由MySQL3.23 引进的MyISAM
表存储格式可以解决这个问题,因为该格式与机器独立。因此,如果以下两个条件都满足的话,直接拷贝文件可以移植到具有不同硬件结构的机器上:即另一台机器
上也必须运行MySQL3.23 以上的版本,并且文件必须表示成MyISAM
表,而不是ISAM 表。
3、双机热备份。 mysql数据库没有增量备份的机制。当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制(也就是双机热备)
优点:适合数据量大的时候。现在明白了。大的互联网公司对于mysql数据备份,都是采用热机备份。搭建多台数据库服务器,进行主从复制。
主从复制经常遇到的问题就是,如何保证数据不堵塞,不延迟。这个问题还是可以容忍的,有一些方案可以改善。毕竟有得有失的。这已经是很省心省力的方式了。

以上所述是小编给大家介绍的sql
server编写archive通用模板脚本实现自动分批删除数据,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

  1.添加单条个数据;

澳门新葡8455最新网站 16澳门新葡8455最新网站 17

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

添加单条数据

优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 

echo “—————————————————————”
>> $LogFile

博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常使用。然后就对delete语句进行按均匀数据量分批delete的改写,这样的话,原来的删除一个表用一个语句,就可能变成几十行,如果archive的表有十几个甚至几十个,那我们的脚本篇幅就非常大了,增加了开发和维护的成本,不利于经验比较少的新入职同事去开发archive脚本,也容易把注意力分散到所谓分批逻辑中。

二) 查(R)

4.编写业务逻辑层
4.1首先编写一个操作特定表的业务逻辑层类XxxxxBll
4.2编写对应的方法
4.3根据表现层的需求,确定业务访问层类的方法该怎么编写(确定参数和返回值)

#find “/data/backdata/” -cmin +1 -type f -name “*.sql” -print >
deleted.txt
find “/data/backdata/” -ctime +7 -type f -name “*.sql” -print >
deleted.txt
echo -e “delete files:n” >> $LogFile
#循环删除匹配到的文件
cat deleted.txt | while read LINE
do
    rm -rf $LINE
    echo $LINE>> $LogFile
done

相关文章

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图