Hibernate笔记

2024/4/28 2:49:45

简单使用

三、Hibernate的简单使用:

    -- 拷贝jar(lib\required、lib\jpa、lib\optional\c3p0、mysql驱动).

    -- 写全局配置文件hibernate.cfg.xml放在src目录下.

       cfg: Configuration.

    -- 编程:

       a. 写持久化类

          持久类 = pojo + annotation注解(@Entity)

      持久类 = pojo + Xxx.hbm.xml文件

        hbm: Hibernate Mapper (配置pojo与表的转换关素).

          pojo : Plain Old Java Object 最简单最传统的java对象.

          写pojo类注意的四点:

      -- 必须有一个无参的构造器.

      -- 所有的属性都要有setter与getter方法.

      -- 属性不能为final修饰.

      -- 要提供一个唯一的标识符.(主键列) @Id

      注意: 持久类名就是表名, 类的属性名就表中的列名.(默认)

拷贝了jar包后,不要忘记add to buildPath

在类上加注解@Entity 主键列加@Id,就是持久化类

测试类

Configuration configuration = new Configuration()//加载src目录的hibernate.properties

.configure();//加载src目录下的hibernate.cfg.xml文件

//第二步:创建SessionFactory

//创建服务注册对象

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

//第三步:获取session

Session session = sessionFactory.openSession();

//第四步:获取事务

Transaction transaction = session.beginTransaction();

//第五步:利用Session完成所有的持久化操作

User u = new User();

u.setId(1);

u.setName("李小华");

u.setAge(18);

//第六步:事务提交或回滚

transaction.commit();

//关闭Session

session.close();

sessionFactory.close();

对象三种状态

@GeneratedValue(strategy=GenerationType.IDENTITY)mysql的自增长策略(oracle用GenerationType.SEQUENCE)

判断是不是持久化状态 session.contains(u)//true持久化状态

a.添加

1.Serializable id = session.save(持久化对象);

    立即 插入数据

2.session.saveOrUpdate(持久化对象);

3.void session.persist(持久化对象);

   -- 延迟往数据库插数据

4.Object obj持久化 = session.merge(脱管);//集成添加与修改

b.根据主键id获取持久化对象

User u = (User)session.get(User.class,1);

//立即查询

User u = (User)session.load(User.class,1);

//延迟查询,返回一个代理对象,如果关session再用会出异常

c.修改

User u = (User)session.get(User.class,1);

u.setxxx()//不用update,commit的时候才执行update语句

--脱管

session.saveOrUpdate(u);

User user = (User)session.merge(u);

session.update(u);

d.删除

User u = session.get(User.class,1);

session.delete(u);

操作一级缓存:

1.判断:session.contains(u);

2.踢出:session.evict(u);

3.清空:session.clear();

4.同步:session.flush();

5.session.close();

JPA注解:

@Table(name="USER",//表名

       schema="",//指定数据库

       indexes={@Index(columnList="name",name="IDX_NAME"),

                @Index(columnList="age",name="IDX_AGE")},//数组使用花括号,指定索引

       uniqueConstraints={@UniqueConstraint(columnNames={"name","phone"},name="UC_NAME_PHONE")}//联合唯一约束

       )

class User

写在类上面的hibernate注解:

@DynamicInsert(true)//动态插入

@DynamicUpdate(true)//动态修改

@SelectBeforeUpdate(true)//修改前先查询,没发生改变就不生成update语句

二、主键映射

a.主键自增长策略:

-- @GeneratedValue(strategy=GenerationType.IDENTITY)

-- @GeneratedValue(strategy=GenerationType.SEQUENCE)

-- @GeneratedValue(strategy=GenerationType.AUTO)推荐

-- @GeneratedValue(strategy=GenerationType.TABLE)//单独生成一张表来维护主键

b.单个属性做主键

--直接在属性上加@Id

c.多个属性做主键

--多个属性上加@Id

@Entity @Table(name="EMP_INFO")

public class Employee implements Serializable{//联合主键必须实行序列化接口

    @Id

    private String lastName;

    @Id

    private String firstName;

    private int age;

}

d.复合属性

持久化类里@EmbeddedId//复合属性做主键,此对象也要实现序列化接口

三、基本属性映射

@Column

-- columnDefinition

-- length:长度

-- name:列名

-- nullable:非空约束

-- precision:总位数

-- scale:小数点后面的位数(跟上一个结合使用,java类型是BigDecemal)

-- unique:唯一约束

-- insertable:是否允许插入

-- updatable:是否允许修改

要弄默认值,需要动态插入,以及用包装类

@Temporal:修饰日期属性

-- TemporalType.DATE      yyyy-MM-dd

-- TemporalType.TIME      HH:mm:ss

-- TemporalType.TIMESTAMP 

@Lob//大的二进制或文本

@Basic(fetch=FetchType.LAZY)//延迟加载

private byte[] picture;

FileInputStream fis = new FileInputStream("C:\\User\\Administrator\\Picture\\SamplePicture\\Koala.jpg");

byte[] data = new byte[fis.available()];

fis.read(data);

fis.close();

u.setPicture(data);

可能数据库有大小限制,要改my.ini文件

private transient String tel;//@Transient或者transient关键字指定不是持久化的属性

@Basic:延迟加载属性

  - fetch

    FetchType.LAZY//延迟加载

    FetchType.EAGER//立即加载

1对多,1的一端做主表,多的一端做从表。

复合属性映射

@Embedded //复合属性(内含的)

说明:意思是属性是 非基本类型

@AttributeOverrides:属性重新命名(少用)

@AttributeOverrides({

    @AttributeOverride( name="firstName",column=@Column(name="FIRST_NAME") ),//复合属性更改列名

    @AttributeOverride( name="lastName",column=@Column(name="LAST_NAME") )

})

代替方法:在那个类里的属性上写 @Column(name="F_NAME")

集合映射

会单独生成一张表。要面向接口编程并且集合属性要程序员自己初始化。

private List<String> lists = new ArrayList<String>();

1.List集合2.Map集合3.Set集合

公共的注解:

@ElementCollection(fetch=FetchType.LAZY,targetClass=String.class) 元素是集合

                    指定延迟加载 集合映射出来的表

@CollectionTable(name="ADD_INFO",foreignKey = @ForeignKey(name="FK_ADD_USER")) 集合映射出来的表

                  表名 外键约束名

1.List集合(有序): 要在属性上加 @OrderColumn() 排序列

    -- List<String>

    -- List<Address>

    Address复合属性这个类上面需要加 @Embeddable

public class User{

    @Id @GeneratedValue(strategy=GenerationType.AUTO)

    @Column(name="U_ID")

    private int id;

    @Column(name="U_NAME", length=30,nullable=false)

    private String name;

    @Column(name="U_AGE",nullable=false)

    private int age;

    @ElementCollection(fetch=FetchType.LAZY,targetClass=String.class)//targetClass指的是集合的元素类型

    @CollectionTable(name="ADD_INFO",

                    foreignKey = @ForeignKey(name="FK_ADD_USER"),//更改外键约束名

                    joinColumns=@joinColumn(name="USER_ID",REFERENCEDcOLUMNnAME="U_ID"))//改外键列名

    @OrderColumn(name="O_ID")//排序列

    private List<String> addresses = new ArrayList<>();

}

    java代码:

    //利用Session完成所有的持久化操作

    User u = new User();

    u.setAge(18);

    u.setName("李小一");

    u.getAddresses().add("天河区");

    u.getAddresses().add("海珠区");

    session.save(u);

执行完后,生成了USER_INFO表和ADD_INFO表

USER_INFO表

U_ID  U_AGE  U_NAME

1     18     李天一

ADD_INFO表结构是

外键列  addresses  O_ID

1        天河区    0

1        海珠区    1

ADD_INFO表的主键列:【外键列 + 排序列】做联合主键

同样地,集合是对象类型的,要在这个类的上面加@Embeddable

2.Map集合 @MapKeyColumn() key生成的列

    -- Map<String, String>

    -- Map<String, Address>

    Address复合属性需要加 @Embeddable

 public class User{

    @Id @GeneratedValue(strategy=GenerationType.AUTO)

    @Column(name="U_ID")

    private int id;

    @Column(name="U_NAME", length=30,nullable=false)

    private String name;

    @Column(name="U_AGE",nullable=false)

    private int age;

    @ElementCollection(fetch=FetchType.LAZY,targetClass=String.class)//targetClass指的是集合的元素类型

    @CollectionTable(name="ADD_INFO",

                    foreignKey = @ForeignKey(name="FK_ADD_USER"),//更改外键约束名

                    joinColumns=@joinColumn(name="USER_ID",REFERENCEDcOLUMNnAME="U_ID"))//改外键列名

    //map的key

    @MapKeyColumn(name="MAP_KEY")

    private Map<String, String> addresses = new HashMap<>();

}

    java代码:

    //利用Session完成所有的持久化操作

    User u = new User();

    u.setAge(18);

    u.setName("李小一");

    u.getAddresses().put("100000","天河区");

    u.getAddresses().put("200000","海珠区");

    session.save(u);

      用户表(user_info):

      U_ID  U_AGE U_NAME

      1      18   李小一

      集合映射出来的表(add_info):

      USER_ID  addresses  MAP_KEY

      1        天河区     100000

      1        海珠区     200000

      说明:USER_ID是外键,主键列:【外键列 + Map的key对应的列】

3.Set集合 (无序列)

    -- Set<String>

    -- Set<Address> -->在属性上加 @Column(name="A_NAME",nullable=false) 外键和这几个联合作主键

    Address复合属性需要加 @Embeddable

      //加非空约束,才有主键列(默认没主键列)

      @Column(nullable=false)

      private Set<String> addresses = new HashSet<>();

      java代码:

        //利用Session完成所有的持久化操作

        User u = new User();

        u.setAge(18);

        u.setName("李小一");

        u.getAddresses().add("天河区");

        u.getAddresses().add("海珠区");

        session.save(u);

      用户表(user_info):

      U_ID   U_AGE  U_NAME

      1      18     李小一

      集合映射出来的表(add_info):

      USER_ID addresses

      1       天河区

      1       海珠区

      说明:主键列:【外键列 + set集合元素列】

-------------------------------------------------------------

关联映射(重点)

   -- 双向关联(1-N):(两边都加注解)

   1的一端(主表)

   N的一端(从表)

@Entity @Table(name="TEA_INFO")

public class Teacher{

    private int id;

    private String name;

    private String job;

    @OneToMany(fetch=FetchType.LAZY,//延迟加载

               targetEntity=Student.class,//关联持久化类

           cascade=CascadeType.REMOVE, //级联删除(级联到关联的实体),一般在主表配置,在从表也可(老师没数据时会被删)

           orphanRemoval=true,//删除孤儿记录(主表从表断绝关系)

           mappedBy="teacher") //代表哪边维护关联关系,写关联的实体中哪个引用了它自己的那个属性

    private Set<Student> students = new HashSet<>();//1的一端

}

@Entity @Table(name="STU_INFO")

public class Student{

    private int id;

    private String name;

    private int age;

    @ManyToOne(fetch=FetchType.LAZY, //延迟加载

               targetEntity=Teacher.class // 关联的实体

           )

    @JoinColumn(name="T_ID",referencedColumnName="TEA_ID") //指定外键列

    private Teacher teacher;

}

说明:1的一端属性写另外的集合,多的一端写指向1的端的属性.

(表里面生成有外键列,外键列那端就是多的一端——李小华语)。1的一端(加了mappedBy一端)不维护关联关系

测试代码:

Teacher t1 = new Teacher();//主表

t1.setName("唐僧");

t1.setJob("长老");

session.save(t1);

Student s1 = new Student(); //从表

s1.setAge(500);

s1.setName("孙悟空");

s1.setTeacher(t1);

Student s2 = new Student(); //从表

s2.setAge(500);

s2.setName("猪八戒");

s2.setTeacher(t1);

说明:先保存主表,再保存从表

tea_info

TEA_ID  TEA_JOB  TEA_NAME

1       长老     唐僧

stu_info是多的一端

STU_ID  STU_AGE  STU_NAME  T_ID

1       500      孙悟空    1

2       500      猪八戒    1

查询(测试延迟加载):

Teacher t1 = (Teacher)session.get(Teacher.class,1);

Set<Student> students = t1.getStudents();

Iterator<Student> iter = students.iterator();

while(iter.hasNext()){

    Student s = iter.next();

    System.out.println(s.getName());

}

删除:

session.delete(t1);

说明:配置级联删除,只删老师,也会删学生。级联删除在主表里面配置。如果在从表配置是不科学(把某老师的学生删掉同时就删了那老师,不科学)

t1.getStudents().clear();//把从表关联的记录全部删除

说明:要在主表 @OneToMany注解里配orphanRemoval=true,//删除孤儿记录(主表从表断绝关系)

------------N-N(多对多)-------------

@ManyToMany()

@Entity @Table(name="TEA_INFO")

public class Teacher{

    private int id;

    private String name;

    private String job;

    @ManyToMany(fetch=FetchType.LAZY,//延迟加载

               targetEntity=Student.class,//关联持久化类

           cascade=CascadeType.REMOVE, //级联删除(级联到关联的实体)

           mappedBy="teachers") //代表哪边维护关联关系,写关联的实体中哪个引用了它自己的那个属性

    private Set<Student> students = new HashSet<>();//1的一端

}

@Entity @Table(name="STU_INFO")

public class Student{

    private int id;

    private String name;

    private int age;

    @ManyToMany(fetch=FetchType.LAZY, //延迟加载

               targetEntity=Teacher.class // 关联的实体

           )

    // 生成中间表

    @JoinTable(name="STU_2_TEA",

              joinColumns= @JoinColumn(name="S_ID",referencedColumnName="STU_ID"),//没有加mappedBy属性的一端

              inverseJoinColumns= @JoinColumn(name="T_ID",referencedColumnName="TEA_ID")) //加了mappedBy属性的一端

    private Set<Teacher> teachers = new HashSet<>();

}

(STU_2_TEA)表

S_ID  T_ID

1     1

2     1

-----------------1-1 -----------------

双向关联

1-1

说明:1.两边都用 @OneToOne

      2.两边属性都用关联的实体定义

@Entity @Table(name="TEA_INFO")

public class Teacher{

    private int id;

    private String name;

    private String job;

    @OneToOne(fetch=FetchType.LAZY,//延迟加载

               targetEntity=Student.class,//关联持久化类

           cascade=CascadeType.REMOVE, //级联删除(级联到关联的实体)

           orphanRemoval=true,//删除孤儿记录(主表从表断绝关系)

           mappedBy="teacher") //代表哪边维护关联关系,写关联的实体中哪个引用了它自己的那个属性

    private Student student;

}

@Entity @Table(name="STU_INFO")

public class Student{

    private int id;

    private String name;

    private int age;

    @OneToOne(fetch=FetchType.LAZY, //延迟加载

               targetEntity=Teacher.class // 关联的实体

           )

    @JoinColumn(name="T_ID",referencedColumnName="TEA_ID") //指定外键列

    private Teacher teacher;

}

单向关联(只需要一边能查询)

1-1

1-N(?)

N-1(保留学生这边的注解,删掉老师这端的)

N-N

继承映射

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)//生成在一张表中

@DiscriminatorColumn(name="DC",discriminatorType=DiscriminatorType.INTEGER)//辨别者列

@DiscriminatorValue("0")//辨别者列的值

public class Person{

    @Id @Generator()

    private int id;

    private String name;

}

@DiscriminatorValue("1")//辨别者列的值

public class Employee extends Person{

    private double salary;

}

@DiscriminatorValue("2")//辨别者列的值

public class Manager extends Employee{

    private String job;

}

hibernate.cfg.xml配置持久化类

代码:

Manager m = new Manager();

m.setJob("经理");

m.setName("李大华");

m.setSalary(2909.98);

session.save(m);

Employee m = new Employee();

m.setJob("经理");

m.setName("李大华");

m.setSalary(2909.98);

session.save(m);

DC  ID  NAME  SALARY  JOB

2   1   达宏  299     经理

1   2   大华  1       null

都继承在同个表里

第二种方式:

顶级父类:

@Entity

@Inheritance(strategy=InheritanceType.JOINE)//每个类单独生成一张表

第三种方式:

顶级父类:

@Entity

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)//每个类单独生成一张表

一、HQL查询

Query query = session.createQuery(hql);

分页

第一个?号 query.setFirstResult((pageIndex-1)*pageSize);

第二个?号 query.setMaxResults(pageSize);

实例:

List<Student> students = session.createQuery("from Student as s").list();//from 持久化类名

List<Student> students = session.createQuery("select s from Student as s").list();

List<Object[]> list = session.createQuery("select name,age from Student").list();//查询多列

List<String> list = session.createQuery("select name from Student").list();

List<List<Object>> list = session.createQuery("select new list(name,age) from Student").list();//默认是obj数组,new了就变成list

List<Map<String,Object>> lists = session.createQuery("select new map(name,age) from Student").list();//key默认第一列0,第二列是1

List<Map<String,Object>> lists = session.createQuery("select new map(name as n,age as a) from Student").list();//改key

List<Person> lists = session.createQuery("select new org.fkjava.domain.Person(name,age) from Student").list();//

关联查询实例:

//老师id为1的所有学生(隐式关联,意思是关联的属性是个持久化类)

session.createQuery("select s from Student s where s.teacher.id=?").setInteger(0,1).list();

//关联的属性是集合,要用显式关联

//查学生id为1的老师

Teacher t = session.createQuery("select t from Teacher t inner join t.students as s where s.id = ?").setParameter(0,1).list();

//抓取连接join fetch

List<Student> stus = session.createQuery("select s from Student s join fetch s.teacher").list();

//order by

List<Student> stus = session.createQuery("select s from Student s order by s.age asc")

                            .setFirstResult((pageIndex-1)*pageSize)

                            .setMaxResults(pageSize)

                            .list();

//统计函数,跟sql一样,注意ave(),sum()返回出来接收用Double

//根据老师分组,统计学生的数量

List<Object[]> list = session.createQuery("select count(s),s.teacher.name from Student as s group by s.teacher.id")

//过滤出老师id为2的

Object[] obj = session.createQuery("select count(s),s.teacher.name from Student as s group by s.teacher.id having s.teacher.id=?")

                                .setParameter(0,2).uniqueResult();

session.createQuery("select s from Student s where s.name like ?11")

       .setParameter("11","%小%").list();

二、Criteria查询:完全面向对象(不需要写查询语句)

1.session 2.Criteria criteria = session.createCriteria(持久化类.class)

Criteria 类的方法:

- add(Criterion criterion):添加查询条件

    Criterion:查询对象

    a.Restrictions 生成查询对象的工具类,把where中的运算符,表达式,函数全部改成了静态的方法。

    万能的:sqlRestriction(String sql); // 如果没找到where部分的运算符,表达式,函数,就直接用sqlRestriction(String sql)

    b.Property工具类(生成查询条件)

- addOrder(Order order):排序

- createAlias(String associationPath):关联查询

     创建关联查询后(如果不加别名)添加的查询条件,永远都是为目标持久化类添加的

- createCriteria(String associationPath):关联查询

     创建关联查询后(如果不加别名)添加的查询条件,永远都是为关联持久化类添加的

- setFetchMode(String associationPath):抓取延迟的属性

     FetchMode.JOIN:立即加载

     FetchMode.SELECT:延迟加载

- setProjection(Projection projection):查询哪些列

- 子查询(离线查询)

   相当于定义了一条查询语句

//离线查询

DetachedCriteria dc = DetachedCriteria.forClass(Student.class);

//与session关联起来

Criteria ci = dc.getExecutableCriteria(session);

List<Student> lists = ci.list();

//子查询

List<Student> lists = session.createCriteria(Student.class)

                             .add(Restrictions.in("age",new Object[]{19,20,21})).list();

//子查询和离线查询结合

DetachedCriteria dc = DetachedCriteria.forClass(Teacher.class)

                                      .setProjection(Projections.property("id"));

List<Student> lists = session.createCriteria(Student.class)

                             .add(Property.forName("id").in(dc)).list();

例子1://查询所有学生

List<Student> students = session.createCriteria(Student.class).list();

//添加查询条件

List<Student> students = session.createCriteria(Student.class)

                                .add(Restrictions.like("name","%小%"))

                .add(Restrictions.between("age",20,22))

                .add(Restrictions.sqlRestriction("length(stu_name) = ?",6,StandardBasicTypes.INTEGER))

                                .list();

//排序

List<Student> students = session.createCriteria(Student.class)

                                .addOrder(Order.asc("age")).list();

//查询多列

ProjectionList pl = Projections.projectionList();

pl.add(Projections.property("name"))

  .add(Projections.property("age"));

List<Object[]> lists = session.createCriteria(Student.class)

       .setProjection(pl)

       .list();

//查询指定的列(一列,后面覆盖前面)

List<Object> lists = session.createCriteria(Student.class)

       .setProjection(Projections.property("name"))

       .setProjection(Projections.property("age"))

       .list();

//聚集函数count、max、min、avg

Object count = session.createCriteria(Student.class)

                      .setProjection(Projections.count("id"))

              .uniqueResult();

//分组

session.createCriteria(Student.class)

       .setProjection(Projections.groupProperty("teacher.id")).list();

//创建关联

List<Student> lists = session.createCriteria(Student.class)

                             .createAlias("teacher","t")//创建关联查询

                 .add(Restrictions.eq("t.id",1)).list();

说明:如果下边查询条件不取别名,默认是目标持久化类(Student.class)的条件

//createCriteria :创建关联

List<Student> lists = session.createCriteria(Student.class)

                             .createCriteria("teacher")创建关联查询

                 .add(Restrictions.e q("id",1)).list();//添加查询条件是Teacher的

//两个对象都添加查询条件createAlias

List<Student> lists = session.createCriteria(Student.class)

                             .createAlias("teacher","t")//创建关联查询

                 .add(Restrictions.between("age",10,20))//学生

                 .add(Restrictions.eq("t.id",1)).list();//添加查询条件是Teacher的

//两个对象都添加查询条件createCriteria

List<Student> lists = session.createCriteria(Student.class,"s")

                             .createCriteria("teacher")//创建关联查询

                 .add(Restrictions.between("s.age",10,20))//学生

                 .add(Restrictions.eq("id",1)).list();//添加查询条件是Teacher的

//抓取延迟加载

List<Student> lists = session.createCriteria(Student.class)

                 .setFetchMode("teacher",FetchMode.JOIN).list();

三、原生的SQL查询:写sql进行查询

a.session

b.写sql

c.SQLQuery sqlQuery = session.createSQLQuery(sql);

SQLQuery中的方法:

  - addEntity(Class entityType) : 实体查询

  - addJoin(String tableAlias, String path) : 关联查询

  - addScalar(String columnAlias) : 标量查询

  - 命名查询(sql命名查询)

  第一种方式:使用步骤:

    a.给个配置文件,定义hql语句

      xxx.hbm.xml

      <sql-query name="起个名字">hql语句</sql-query>

    b.在hibernate.cfg.xml文件进行配置

      <mapping resource="org/fkjava/domain/Query.hbm.xml"/>

    c.使用:Query query = session.getNamedQuery("sql语句的名字");

    例子:

    Query.hbm.xml文件

    <hibernate-mapping>

        <!--定义sql语句-->

    <sql-query name="sql-query_1">

        select s.*,t.* from stu_info as s,tea_info as t where s.t_id = t.tea_id

        <!--实体查询:addEntity-->

        <return alias="s" class="org.fkjava.domain.Student"></return>

        <return alias="t" class="org.fkjava.domain.Teacher"></return>

        <!--关联查询:addJoin-->

        <return-join alias="t" property="s.teacher"/>

        <!--标量查询:addScalar-->

        <return-scalar column="s.stu_age"/>

    </sql-query>

    </hibernate-mapping>

    //命名查询

    session.getNamedQuery("sql-query_1");

  第二种方式:(加注解)

    a.在持久化类上加注解

      @NamedNativeQuery(name="sql_query_2",resultSetMapping="rs", query="查询语句")

      @SqlResultSetMapping(name="rs",entities={ @EntityResult(entityClass=Student.class), // 实体查询

                                                @EntityResult(entityClass=Teacher.class)},

                                     columns={ @ColumnResult(name="s.stu_age")}) // 标量查询

    说明:下面的注解是关于rs结果集映射的

    b.配置

      <mapping class="org.fkjava.domain.Teacher"/>

    c.使用:Query query = session.getNamedQuery("hql语句的名字");

    List<Object[]> lists = query.list();

    for(Object[] obj : lists){

    System.out.println(obj.length);

    System.out.println(obj[0] + "==" + obj[1] + "==" + obj[2]);

    }

  - 调用存储过程

  <sql-query name="call_proc">

    {call proc_query(?)}

    <return class="org.fkjava.domain.Student"></return>

  </sql-query>

在数据库创建存储过程:

DELIMITER $

CREATE PROCEDURE proc_query(IN minAge INT)

BEGIN

   select * from stu_info where stu_age > minAge;

END

$

//调用存储过程

List<Student> students = session.getNamedQuery("call_proc").setParameter(0,20).list();

for(Student stu : students){

    System.out.println(stu.getName() + "==" + stu.getAge());

}

//使用SQLQuery直接写存储过程sql

List<Student> students = session.createSQLQuery("{call proc_query(?)}")

                                .addEntity(Student.class).setParameter(0,20).list();

for(Student stu : students){

    System.out.println(stu.getName() + "==" + stu.getAge());

}

//addEntity() : 实体查询

List<Student> students = session.createSQLQuery("select * from stu_info")

                                .addEntity(Student.class).list();

//关联

List<Object[]> lists = session.createSQLQuery("select s.*, t.* from stu_info as s,tea_info as t where s.t_id = t.tea_id")

                              .addEntity("s",Student.class)

                  .addEntity("t",Teacher.class)

                  .list();

//查两列

List<Object[]> lists = session.createSQLQuery("select stu_name, stu_age from stu_info").list();

//addScalar() : 标量查询

List<Object[]> lists = session.createSQLQuery("select * from stu_info")

                              .addScalar("stu_name") // 标量查询

                  .addScalar("stu_age").list();

//addJoin(String tableAlias, String path) : 关联查询

List<Object[]> lists = session.createSQLQuery("select s.*, t.* from stu_info as s,tea_info as t where s.t_id = t.tea_id")

                              .addEntity("s",Student.class) //实体查询

                  .addEntity("t",Teacher.class)

                  .addJoin("t","s.teacher") // 关联查询

                  .addScalar("s.stu_age") // 标量查询

                  .list();

说明:关联查询就是把t放到s.teacher这个属性里面去。Student里面teacher属性就有值了。

=========================================

########## HQL语句写法 ##########

1.from 字句

from Student [as s]

2.select 字句

查询对象:select s from Student as s 返回类型是List<Student>

查询多列:select s.id,s.age from Student as s 返回类型是List<Object[]>

     select id,age from Student 返回类型是List<Object[]>

     select s,s.name,s.age from Student as s 返回类型是List<Object[]>

查询一列:select name from Student 返回类型是List<String>

3.select new 字句(可以改变返回的List集合中元素存放的是什么)

select new list():List<List<>>

select new map():List<Map<>>

select new User():List<User>

举例:

select new list(name,age) from Student 返回类型是List<List<Object>>,已经不是List<object[]>

select new map(name,age) from Student 返回类型是List<Map<String,Object>>,默认第一个的key为0,第二个为1等等

select new map(name as n,age as a) from Student 这时key就变为 n 和 a

select new org.fkjava.domain.Person(name,age) from Student 返回类型是List<Person>

4.关联查询(对象)

-- 隐式关联: @ManyToOne 、 @OneToOne

   关联的属性是一个持久化类

-- 显式关联: @OneToMany 、 @ManyToMany

   关联的属性是一个集合

类之间的关系:学生类有一个老师的属性,老师类有一个装学生的集合

问题来了:现在有一个需求,查老师id为1的学生,就是关联查询

select s from Student as s where s.teacher.id = ?

session.createQuery(hql).setInteger(0,1).list();//第一个0代表 第一个 ? ,参数值为1

说明:你要查的持久化类关联的属性是实体,就用隐式关联

需求是查学生id为1的老师,要查老师,看里面关联的属性是集合,就得用显式关联

select t from Teacher as t inner join t.students as s where s.id = ?

说明:s就相当于对象了

-- 抓取连接(延迟加载的属性)

select s from Student as s join fetch s.teacher

排序order by

select s from Student as s order by s.age asc

分页

List<Student> students = session.createQuery("select s from Student as s")

.setFirstResult((pageIndex - 1)*pageSize)

.setMaxResults(pageSize)

.list();

聚合函数(统计函数)

Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();

//可以根据具体数据的类型写返回类型

Integer max = (Integer)session.createQuery("select max(age) from Student").uniqueResult();

Double avg = (Double)session.createQuery("select avg(score) from Student").uniqueResult();

Double sum = (Double)session.createQuery("select sum(score) from Student").uniqueResult();

分组

根据老师分组,统计学生的数量

select count(s),s.teacher.name from Student as s group by s.teacher.id

根据老师分组,统计学生的数量,把老师id为2的过滤出来

select count(s),s.teacher.name from Student as s group by s.teacher.id having s.teacher.id = ?

where 字句

select s from Student as s where s.name like ?11

...setParameter("11","%小%").list();

小结:

from 字句的类后面不取别名,前面就直接写属性名

select new list()意思就是返回的List<List<Object>> 里面泛型是List集合

select new map()里的key默认从0开始,如果想改变key,查询属性取别名即可

select new 数据传输类(包名加类名),这个类要有对应带参构造器

如果查学生,看里面关联属性是什么,是类就隐式,是集合就显式

=======================李韩飞========================

持久化映射文件 *.hbm.xml

<hibernate-mapping>

    <!--name是类名,table是表-->

    <class name="Person" table="t_person">

         <id name="id" column="id">

          <generator class="native"/>

     </id>

     <property name="name" column="t_name"></property>

    </class>

</hibernate-mapping>

连接工厂是线程安全,session非线程安全

一级缓存:clear后就会清掉

批量操作建议的方式:在循环里面

if(i % 10 == 0){

      session.flush();

      session.clear();

}

普通组件和动态组件(在对象的属性是个对象)

<component name="phone">

    <property name="companyPhone" column="t_company_phone"/>

    <property name="homePhone"/>

</component>

即映射到类的对象属性里

动态组件

private Map attribute = new HashMap();

配置文件:

<dynamic-component name="attribute">

    <property name="key1" column="t_key1" type="string" />

    <property name="key2" column="t_key2" type="integer" />

</dynamic-component>

//高效操作map数据

Iterator<Map.Entry> it = p.getAttribute().entrySet().iterator();

for(;it.hasNext();){

     Map.Entry map = it.next();

     System.out.println(map.getKey()+"==="+map.getValue());

}

数组映射

<array name="arrays">

    <key column="id"/> 指person类的id

    <list-index column="indexs"/>

    <element column="values" type="string"></element>

</array>

<!-- Map的映射配置-->

<map name="myMap">

    <key column="id"/> 指person类的id

    <map-key column="map_key"/>

    <element column="values" type="string"></element>

</map>

<!-- set的映射配置-->

<set name="mySet">

    <key column="id"/> 指person类的id

    <element column="values"></element>

</set>

关联映射

<one-to-one name="address"/>

<many-to-one name="" nuique="true" not-null="true"/>

保存数据,要先保存主表,再保存从表。

===============================

=====================项目运用======================

多条件分页查询的dao写法:条件是不确定的,所以hql要拼出来。

public List<User> getUserByPage(User user, PageModel pageModel){

    StringBuilder hql = new StringBuilder();

    hql.append("select u from User as u where 1=1");

    List<Object> params = new ArrayList<>();

    if(user != null){

        if(StringUtils.hasText(user.getName())){

            hql.append(" and name like ? ");

            params.add("%"+user.getName()+"%");

        }

        if(StringUtils.hasText(user.getPhone())){

            hql.append(" and phone like ?");

            params.add("%"+user.getPhone()+"%");

        }

        if(user.getJob()!=null && StringUtils.hasText(user.getJob().getCode())){

            hql.append(" and job.code = ?");

            params.add(user.getJob().getCode());

        }

    }

    hql.append(" order by createDate asc");

    return this.findByPage(hql.toString(), pageModel, params);

}

使用第三种方式要在 userDao实现类里加deleteUser方法:

    public void deleteUser(String[] userIds){

        StringBuilder hql = new StringBuilder();

        hql.append("delete from User where userId in(");

        for(int i = 0;i<userIds.length;i++){

            hql.append( i == 0 ? "?" : ",?");

        }

        hql.append(")");

        this.bulkUpdate(hql.toString(), userIds);

    }

--dao实现类增加方法

    public void checkUser(String[] userIds,Short status){

        StringBuilder hql = new StringBuilder();

        hql.append("update User set status = ?,checker = ?,checkDate = ? where userId in(");

        List<Object> params = new ArrayList<>();

        params.add(status);

        params.add(WebConstant.getSessionUser());

        params.add(new Date());

        for(int i = 0;i<userIds.length;i++){

            hql.append( i == 0 ? "?" : ",?");

            params.add(userIds[i]);

        }

        hql.append(")");

        this.bulkUpdate(hql.toString(), params.toArray());

    }

//批量删除角色

    public void deleteRole(String[] ids){

        StringBuilder hql = new StringBuilder();

        hql.append("delete from Role where id in(");

        Long[] params = new Long[ids.length];//id是long类型要注意

        for(int i=0;i<ids.length;i++){

            hql.append(i==0? "?":",?");

            params[i] = Long.valueOf(ids[i]);

        }

        hql.append(")");

        this.bulkUpdate(hql.toString(),params);

    }

//异步加载树的hql

public List<Object[]> getModuleByCodeAndName() {

    String hql = "select code,name from Module order by code asc";

    return find(hql);

}

---------------------------------

集合映射(对象有个集合)

T_USER

ID  NAME

T_USER_ADDRESS

USER_ID外键 ADDRESS

* 这种是1对多的处理方式

有集合就意味着有额外包含外键的一张表

无序,不重复

order-by属性:order-by="address DESC"(默认ASC)

<set name="addressSet" table="user_addressSet" sort="natural">排序属性,用TreeSet

    <key column="userId"></key>指定名字即可,会自动找主键

    <element type="string" column="address"></element>

</set>

List映射,有序,可重复

<list name="addressList" table="">

    <key column="userId"></key>

    <list-index column="idx"></list-index>

    <element type="string" column=""></element>

</list>

map映射,

<map name="addressMap" table="">

    <key column="userId"></key>

    <map-key type="string" column="key_"></map-key>

    <element type="string" column="address"></element>

</map>

Bag  无序,可重复,用List来引用

<bagname="addressMap" table="">

    <key column="userId"></key>

    <element type="string" column="address"></element>

</bag>

1对多(外键在多的一方)

public class Department{

    private Set<Employee> employees;

}

inverse属性,默认false维护关联关系,true就不维护关联关系

--------------------------------------------------------

=====================项目运用======================

多条件分页查询的dao写法:条件是不确定的,所以hql要拼出来。

public List<User> getUserByPage(User user, PageModel pageModel){

    StringBuilder hql = new StringBuilder();

    hql.append("select u from User as u where 1=1");

    List<Object> params = new ArrayList<>();

    if(user != null){

        if(StringUtils.hasText(user.getName())){

            hql.append(" and name like ? ");

            params.add("%"+user.getName()+"%");

        }

        if(StringUtils.hasText(user.getPhone())){

            hql.append(" and phone like ?");

            params.add("%"+user.getPhone()+"%");

        }

        if(user.getJob()!=null && StringUtils.hasText(user.getJob().getCode())){

            hql.append(" and job.code = ?");

            params.add(user.getJob().getCode());

        }

    }

    hql.append(" order by createDate asc");

    return this.findByPage(hql.toString(), pageModel, params);

}

使用第三种方式要在 userDao实现类里加deleteUser方法:

    public void deleteUser(String[] userIds){

        StringBuilder hql = new StringBuilder();

        hql.append("delete from User where userId in(");

        for(int i = 0;i<userIds.length;i++){

            hql.append( i == 0 ? "?" : ",?");

        }

        hql.append(")");

        this.bulkUpdate(hql.toString(), userIds);

    }

--dao实现类增加方法

    public void checkUser(String[] userIds,Short status){

        StringBuilder hql = new StringBuilder();

        hql.append("update User set status = ?,checker = ?,checkDate = ? where userId in(");

        List<Object> params = new ArrayList<>();

        params.add(status);

        params.add(WebConstant.getSessionUser());

        params.add(new Date());

        for(int i = 0;i<userIds.length;i++){

            hql.append( i == 0 ? "?" : ",?");

            params.add(userIds[i]);

        }

        hql.append(")");

        this.bulkUpdate(hql.toString(), params.toArray());

    }

//批量删除角色

    public void deleteRole(String[] ids){

        StringBuilder hql = new StringBuilder();

        hql.append("delete from Role where id in(");

        Long[] params = new Long[ids.length];//id是long类型要注意

        for(int i=0;i<ids.length;i++){

            hql.append(i==0? "?":",?");

            params[i] = Long.valueOf(ids[i]);

        }

        hql.append(")");

        this.bulkUpdate(hql.toString(),params);

    }

//异步加载树的hql

public List<Object[]> getModuleByCodeAndName() {

    String hql = "select code,name from Module order by code asc";

    return find(hql);

}


转载于:https://blog.51cto.com/hebinteng/1974915

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. XUtil学习之ResLoader(五)

    ResLoader学习 ResLoader是Xutil提供的资源加载的工具类,结构挺简单的,就提供了一个方法,loadRes(ResType type, Context context, int id);1、type表示资源类型;参考 ResType类,资源类型定义的挺丰富的。 2、context表示上下文; 3、 id表示查询资源的id标识;具体的…...

    2024/4/22 4:12:52
  2. 函数名前加static与不加static的区别

    函数名前加static与不加static的区别近段时间,在做一个项目时,发现函数名前都加上static,才想到如果不加static有什么作用呢?它们之间的区别是什么,查找了一个资料,对它们的区别列举如下: 1:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见…...

    2024/4/28 1:13:18
  3. pascal语言基础(一)

    该内容为学习 《PASCAL程序设计 第2版》郑启华编著 的笔记,部分与c语言对比学习,方便记忆。pascal语言基础(二)基本介绍保留字(35个)AND、ARRAY、BEGIN、CASE、CONST、DIV、DO、DOWNTO、ELSE、END、FILE、FOR、FUNCTION、GOTO、IF、IN、LABEL、MOD、NIL、NOT、OF、OR、P…...

    2024/4/14 21:11:35
  4. CSDN - Markdown模板 使用示例(文首附markdown源码,即.md文件)

    CSDN - Markdown模板 使用示例附 本文的Markdown源码: https://github.com/yanglr/AlgoSolutions/blob/master/Welcome_to_use_CSDN-markdown_Editor.md 点击”Raw”可看到源码,欢迎fork或star~本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:M…...

    2024/4/14 21:11:35
  5. SQL Server性能优化详解

    数据库性能优化详解 性能调节的目的是通过将网络流通、磁盘 I/O和 CPU时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量。为达到此目的,需要了解应用程序的需求和数据的逻辑和物理结构,并在相互冲突的数据库使用之间(如联机事务处理 (OLTP)…...

    2024/4/24 23:26:17
  6. 【第四章】 资源 之 4.4 Resource通配符路径 ——跟我学spring3

    文章转自:http://sishuok.com/forum/blogPost/list/2458.html4.4.1 使用路径通配符加载Resource前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源。Ant路径通配符支持“?”、“*”、“**”,…...

    2024/4/24 23:26:16
  7. Pascal 基础教程

    Pascal现在还有人想学习吗?先给出一本不错的Pascal教程,Object Pascal的教程我日后给出。 Pascal基础教程第一课  初识PASCAL语言 …………………… 1第二课  赋值语句与简单的输出语句 …………………… 5第三课  带格式的输出语句输入语句 ……………………...

    2024/4/24 23:26:15
  8. C/C++中Static的作用

    在c语言中1.先来介绍它的第一条也是最重要的一条:隐藏原则 这是被static所修饰的函数和变量共同遵循的原则当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。注意是未加static的全局的函数和全局的变量具有全局性即它们可以被其他.c文件访问。…...

    2024/4/24 23:26:14
  9. 【专题】CSDN下载频道5月热门资源top100汇总

    下载频道5月下载量TOP100的资源集中整理汇总,这些资源依然以(移动开发、课程资源、开发技术)三个大类为主,希望整理的这些资源对大家会有些许帮助。5月Download TOP 100注释: 1、以下每个类别的资源都是按照下载量排序;2、点击评论条数可查看该资源的全部评论;3、点击用…...

    2024/4/24 23:26:14
  10. english words

    1.iterate v.反复说;重做;[计]迭代 [ɪtəreɪt] [ɪtəreɪt]1) Managing the caches Whenever you pass an object to save ( ) , update ( ) or saveOrUpdate ( ) , and whenever you retrieve an object using load ( ) , get ( ) , list ( ) , iterate ( ) or scroll ( …...

    2024/4/27 23:11:36
  11. 我与CSDN的这十年——笔耕不辍,青春热血

    1024程序员的节日就要来了,作者也挤时间写了一篇文章——《我与CSDN的这十年》,分享下程序猿和程序媛的故事,纪念这十年奋斗和感动的日子。 十年, 说长不长,说短不短,人生进度条的八分之一,都是青春,都是热血。十年, 从看博客到写博客,笔耕不辍,从未停止。或许,对其…...

    2024/4/24 23:26:14
  12. 使用原始文件

    使用XML 1.在res/xml目录 下创建my_pets.xml 2.my_pets.xml内容 <?xml version="1.0" encoding="utf-8"?> <pets><pet name="bit" type="bunny"/><pet name="nibble" type="bunny"/>&l…...

    2024/4/24 23:26:10
  13. SQL Server 2012 新功能简介之一 安全性和高可用性

    SQL Server AlwaysOn 全新的SQL Server AlwaysOn将灾难恢复解决方案和高可用性结合起来,可以在数据中心内部、也可以跨数据中心提供冗余,从而有助于在计划性停机及非计划性停机的情况下快速地完成应用程序的故障转移。AlwaysOn提供了如下一系列新功能:AlwaysOn Ava…...

    2024/4/24 23:26:11
  14. free pascal语言学习笔记(一)

    最近在学习pascal语言,在这里记录一下学习的进度和学习笔记首先来看一下最简单的pascal语言程序,最经典的helloworldprogram helloworld; beginwriteln(hello world!); end.首先需要强调一点的是,与大多数的程序设计语言不同,pascal语言是大小写不敏感的语言,不仅你定义的标识符…...

    2024/4/24 23:26:09
  15. PASCAL程序设计语言 PDF 分享

    链接:https://pan.baidu.com/s/1cflbic-tCaG0csUiaHFABA 560d相关推荐 Go 语言程序设计 中文编程学习进阶 易语言编程系统 Python高级编程 Java数据结构和算法 Java编程思想(第4版)PASCAL 语言是第一个体现结构化程序设计概念的计算机语言,因此它在 60 年代末 70 年…...

    2024/4/24 23:26:07
  16. 使用 Spring ResourcePatternResolver 读取指定路径下的类信息

    通过 Spring 提供的Api ResourcePatternResolver 读取指定classpath下面的类信息。 示例代码:import org.junit.Test; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.io.Resource; import org.springframework.core.io.supp…...

    2024/4/24 23:26:06
  17. CSDN如何转载别人的文章

    看到别人写的好文章,总想收纳到自己的知识盒子中好好研究一下。但是CSDN貌似没有转载按钮的耶,怎么办啊?不过有问题就有解决的办法。那告诉大家如何转载文章。Ps:这个需要点前端的审查元素的小知识,不用慌,慢慢解释就懂了。以chrome浏览器解释哈。第一步 找到你要转载的文…...

    2024/4/24 23:26:07
  18. static成员函数访问非static成员

    在C++中类的static成员类似于作用于类的全局成员,可以在类未创建任何实例化时直接通过 类名::静态成员名 进行访问。static成员函数只能访问static成员,而不能访问非static成员。这是因为在类为实例化时,静态成员已经存在,而非静态成员只有在实例化的时候才创建,如…...

    2024/4/24 23:26:04
  19. Hibernate--对象关系

    在hibernate中,关联关系映射分为单向关联和双向关联。共有七种关系@Many To One@One To Many(单向)@One To Many(多向)@One To One(单向)@One To One(多向)@Many To Many(单向)@Many To Many(多向)hibernate在维护这几种关系的时候,要不通过连接表,要不通过外键…...

    2024/4/24 23:26:06
  20. SQL Server 数据库设计、命名、编码规范

    2.简介 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求 数据库设计和开发标准是使Newegg Support Center的数据库系统的设计和开发正式化的标准。通过此标准,来规范数据库设计。 通过一致的…...

    2024/4/17 4:12:12

最新文章

  1. QCreator在DeBug下运行Opencv4报错解决方案

    QCreator在DeBug下运行Opencv4报错: D:\Qt5\Tools\QtCreator\bin\jom\jom.exe -f Makefile.Debuglink /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type=win32 name=Microsoft.Windows.Common-Controls version=6.0.0.0 publicKeyTo…...

    2024/4/28 2:49:23
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. SpringMVC初始化工程

    SpringMVC初始化工程 本文采用maven作为构建工具,SpringMVC作为主框架。 创建一个maven的web工程,并配置pom文件<!-- pom.xml --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0&qu…...

    2024/4/19 0:08:43
  4. Go语言map、slice、channel底层实现(go面试)

    slice 切片是一个引用类型&#xff0c;其底层实现是一个结构体&#xff0c;包含以下字段&#xff1a; ptr&#xff1a;一个指向底层数组的指针&#xff0c;指针指向数组的第一个元素。 len&#xff1a;切片当前包含的元素数量。 cap&#xff1a;切片的容量&#xff0c;即底层…...

    2024/4/24 19:38:16
  5. 《c++》多态案例一.电脑组装

    一.代码展示 #include <iostream> using namespace std; class CPU { public://抽象计算函数virtual void calculate() 0;};class CVideoCard { public://抽象显示函数virtual void display() 0;}; class Memory { public://抽象存储函数virtual void storage() 0;};…...

    2024/4/23 4:46:08
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57