周末复习 创建实体类,配置mapping,保存对象 删除对象,事务启动,提交,回滚 保存50个对象,修改对象 Query 与list —-Query与uniqueResult Hibernate使用UUID主键 OpenSession与CurrentSession 带有参数的HQL语句(问号参数和冒号参数) 投影查询(只查询属性的几个属性) HQL得到数据数组

  • 创建Maven项目

    • 1.什么是groupid和artifactId?
      groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
        groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。
    • 注意:如果选择的时War,pom.xml会报错。
    • 解决方案:在src->webapp下面新建 WEB-INF文件夹,里面粘贴一个web.xml
  • 在pom.xml里面引用hibernate的依赖

    • 百度搜索mvn
    • 搜索hibernate
    • 找带有core的
  • hibernate的运行需要hibernate.cfg.xml

    • 注意名字必须是它,具体里面的配置内容寻找百度

    • 放在src/main/resources下面

    • 里面包含了要连接数据库的基本信息,例如数据库的账号,密码

      重点代码

      1
      2
      3
      4
      5
      Configuration cfg = new Configuration().configure();
      SessionFactory fac = cfg.buildSessionFactory();//会启动一个新线程
      Session session = fac.openSession();//打开一个数据库对话,肯定会建立数据库
      session.close();//关闭session
      fac.close();//关闭fac

创建实体类,配置mapping,保存对象

  • 创建实体类

  • 例如创建一个entity包,里面放一个User类

  • 新建一个mapping文件

    • 网上有mapping文件

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17

      <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      <!-- mapping文件用来描述Entity与数据表的关系 -->
      <hibernate-mapping>

      <class name="entity.User" table="rethink_user" >
      <id name="id" column="rethink_id">
      <generator class="idntity"></generator>
      </id>
      <property name="username" column="rethink_name" type="string" length="16"></property>
      <property name="password" column="rethink_password"></property>
      <property name="age"></property>
      </class>

      </hibernate-mapping>

      对mapping编写完成后需要在hibernate写入映射

      1
      <mapping resource ="entity/Person.hbm.xml"></mapping>
  • 接着运行Test.java,可能会出现如下错误

数据库方言Error

1
2
 Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
  • 解决数据库方言BUG

  • 1
    2
    <!-- 数据库方言配置 org.hibernate.dialect.MySQLDialect (出现问题就更换) -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  • 保存对象

    • 在Test.java里面编写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package demo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();// 会到类路径下读取hibernate.cfg.xml
SessionFactory fac = cfg.buildSessionFactory();// 会开启一个新线程
Session session = fac.openSession();//打开一条数据库会话,肯定会建立连接
System.out.println("成功连接数据库");
User user = new User();
user.setAge(18);
user.setUsername("刘延昊");
user.setPassword("123456");
session.save(user);
session.close();
fac.close();
}

}
  • 重点代码

    User user = new User();

    **user.setAge(18);**
    **user.setUsername("刘延昊");**
    **user.setPassword("123456");**
    **session.save(user);**

删除对象,事务启动,提交,回滚

删除对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package test;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestDelete {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
User us = new User();
us.setId(1);
session.delete(us);//虽然参数时Object,但实际上用ID
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • 注意要启动事务
  • 注意要提交事务

保存50个对象,修改对象

TestSave50.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package test;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestSave50 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
for(int i = 0;i<50;i++) {
User user = new User();
user.setUsername("刘"+i);
user.setAge(i);
user.setPassword("123456");
session.save(user);
}
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • session.save(user);

TestUpdate.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package test;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestUpdate {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
//根据ID修改密码,先查询-再修改
User user = session.get(User.class, 3);
user.setPassword("12");
session.update(user);
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}

Query 与list —-Query与uniqueResult

TestQuery.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package test;
import java.util.List;

import org.hibernate.Query;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestQuery {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
//HQL语句,纯查询语句,面向对象的语言,在HQL里面没有数据库的概念
String hql = "from entity.User where age>30"; //也可以加别名
Query<User> query = session.createQuery(hql);
List<User> list = query.list();
for(User us:list) {
System.out.println(us.getUsername());
}
Query<User> query2 = session.createQuery("from entity.User where username='刘3'");
User un = query2.uniqueResult();//如果查出多个数据,会抛异常
System.out.println(un.getId());
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • **String hql = “from entity.User where age>30”; //也可以加别名
    Query<User> query = session.createQuery(hql);
      List<User> list = query.list();
      for(User us:list) {
          System.out.println(us.getUsername());
      }
      Query<User> query2 = session.createQuery("from entity.User where username='刘3'");
      User un = query2.uniqueResult();//如果查出多个数据,会抛异常
      System.out.println(un.getId());**

Hibernate使用UUID主键

Book.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package entity;

public class Book {
private String id;
private String name;
private String author;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}

Book.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- mapping文件用来描述Entity与数据表的关系 -->
<hibernate-mapping>

<class name="entity.Book" table="rethink_book" >
<id name="id" column="book_id">
<generator class="uuid"></generator><!-- 使用Hibernate的UUID主键 -->
</id>
<property name="name" column="book_name"></property>
<property name="author" column="book_author"></property>
</class>

</hibernate-mapping>

在hibernate.cfg.xml里面配置相关的mapping

TestUUID.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package test;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.Book;
import entity.User;

public class TestUUID {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
Book book = new Book();
book.setAuthor("希不");
book.setName("我的书");
session.save(book);
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}

OpenSession与CurrentSession

  • 首先在hibernate.cfg.xml里面配置

    1
    2
    3
    >  <!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
    > <property name="hibernate.current_session_context_class">thread</property>
    >

TestSession.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package test;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestSession {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
Session session1 = fac.openSession();
Session session2 = fac.openSession();
Session session3 = fac.getCurrentSession();//获取最近的currentSession,没有就创建一个,不要以为是Session,和session1和session2没有关系
Session session4 = fac.getCurrentSession();

session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • OpenSession 打开新的Session
    GetCurrentSession 获取最近的Session,我们需要在配置文件中描述何为最近

    GetCurrentSession()会获取最近的CurrentSession,如果没有就建一个,

    OpenSession在查询的时候可以不用事务,用过之后必须关闭
    CurrentSession必须使用事务,使用之后不用关闭

    无论什么Session,无论增删改查,都加事务就肯定没错,

带有参数的HQL语句(问号参数和冒号参数)

TestParams.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package test;
import org.hibernate.Query;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestParams {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
String hql = "from User u where u.username = ?";
Query<User> query = session.createQuery(hql);
query.setParameter(0, "刘1");
User user = query.uniqueResult();
System.out.println(user.getId());
String hql2 = "from User u where u.username =:bieming";
Query<User> query2 = session.createQuery(hql2);
query2.setParameter("bieming", "刘2");
User user2 = query2.uniqueResult();
System.out.println(user2.getId());
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • String hql = “from User u where u.username = ?”;

  • String hql2 = “from User u where u.username =:bieming”;

投影查询(只查询属性的几个属性)

TestQuery2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package test;
import java.util.List;

import org.hibernate.Query;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestQuery2 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
//HQL语句,纯查询语句,面向对象的语言,在HQL里面没有数据库的概念
String hql = "select new User(id,username) from User";
Query<User> query = session.createQuery(hql);
List<User> list = query.getResultList();
for(User user:list) {
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getAge());
System.out.println(user.getPassword());
System.out.println("-----------");
}
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • **String hql = “select new User(id,username) from User”;
    <font color ='purple'>Query<User> query = session.createQuery(hql);</font>**

HQL得到数据数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package test;
import java.util.List;

import org.hibernate.Query;
//删除对象
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import entity.User;

public class TestQuery3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SessionFactory fac = cfg.buildSessionFactory();
Session session = fac.openSession();
session.getTransaction().begin();//启动事务
//HQL语句,纯查询语句,面向对象的语言,在HQL里面没有数据库的概念
String hql = "select username,age from User";
Query<Object> query = session.createQuery(hql);
List<Object> list = query.getResultList();
for(Object obj:list) {
Object[] arr = (Object[])obj;
String name = (String)arr[0];
int age = (Integer) arr[1];
System.out.println(name);
System.out.println(age);
System.out.println("------------");
}
session.getTransaction().commit();//提交事务
session.close();
fac.close();
}

}
  • String hql = “select username,age from User”;