Hibernate注解開發
首先舉個例子(PO類注解配置)
@Entity @Table(name="t_book") public class Book { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") private String id; @Column(name="b_name") private String name; @Temporal(TemporalType.TIMESTAMP) private Date date; @Transient private Double price; 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 Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", date=" + date + ", price=" + price + "]"; } }
@Entity 聲明一個實體
@Table來描述類與表對應
@Id來聲明一個主鍵
@GenerateValue 用它來聲明一個主鍵生成策略
默認情況下相當於native,可以選擇的主鍵生成策略 AUTO IDENTITY SEQUENCE
@Column來定義列
@Temporal來聲明日期類型
TemporalType.DATA 只有年月日,TemporalType.TIME 只有小時分鍾秒,TemporalType.TIMESTAMP 有年月日小時分鍾秒
最后我們在hibernate.cfg.xml文件中將我們的類中的注解引用生效
<mapping class="com.learn.domain.Book"/>
一對多關系注解配置(描述一個客戶擁有多個訂單)
一個客戶類:
@Entity @Table(name="t_customer") public class Customer { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") /* * Id代表主鍵聲明 * GenericGenerator聲明一個主鍵生成策略 * GeneratedValue引用一個主鍵生成策略 * */ private String id; @Column(name="c_name") private String name; @OneToMany(targetEntity=Order.class,mappedBy="c") @Cascade(CascadeType.SAVE_UPDATE) //mappedBy代表外鍵交給多的一方來維護 private Set<Order> orders = new HashSet<>(); 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 Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + "]"; } }
一個訂單類:
@Entity @Table(name="t_order") public class Order { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") private String id; @Column(name="o_name") private String name; @ManyToOne(targetEntity=Customer.class) @JoinColumn(name="c_customer_id") //指定外鍵列 private Customer c = new Customer(); 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 Customer getC() { return c; } public void setC(Customer c) { this.c = c; } @Override public String toString() { return "Order [id=" + id + ", name=" + name + ", c=" + c + "]"; } }
需要注意的是mappedBy它代表的是外鍵由哪一方來維護,如果是例子中的有引用c的Order類來維護,在保存訂單時,就需要
聲明關系,簡單來說就是要添加訂單與客戶關系的代碼
對於cascade注解,這里在customer中配置了@Cascade(CascadeType.SAVE_UPDATE),這就表示保存客戶自動保存訂單
多對多關系(一個老師可以有多個學生,一個學生也可以有多個老師)
學生類:
@Entity @Table(name="t_student") public class Student { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") private String id; @Column(name="s_name") private String name; @ManyToMany(targetEntity=Teacher.class,mappedBy="students") private Set<Teacher> teachers = new HashSet<>(); 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 Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
老師類:
@Entity @Table(name="t_teacher") public class Teacher { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") private String id; @Column(name="t_name") private String name; @ManyToMany(targetEntity=Student.class) @JoinTable(name="s_t",joinColumns={@JoinColumn(name="t_teacher_id")},inverseJoinColumns={@JoinColumn(name="s_student_id")}) @Cascade(CascadeType.SAVE_UPDATE) /** * ManyToMany代表關聯對象的class(簡單點說就是set中的泛型) * JoinTable描述中間表 * joinColumns就是描述本類中的表與中間表的關系 * inverseJoinColumns用來描述另一個表與中間表的關系 * */ private Set<Student> students = new HashSet<>(); 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 Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + ", students=" + students + "]"; } }
一對一關系(用戶和身份編號)
用戶類:
@Entity @Table(name="t_user") public class User { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") private String id; @Column(name="u_name") private String name; @OneToOne(targetEntity=IDCard.class,mappedBy="user") private IDCard idCard; 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 IDCard getIdCard() { return idCard; } public void setIdCard(IDCard idCard) { this.idCard = idCard; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
身份類:
@Entity @Table(name="t_idcard") public class IDCard { @Id @GenericGenerator(name="myuuid",strategy="uuid") @GeneratedValue(generator="myuuid") private String id; @Column(name="i_cardnum") private String cardNum; @OneToOne(targetEntity=User.class) @JoinColumn(name="c_user_id") //joinColumn指定外鍵列名稱 @Cascade(CascadeType.SAVE_UPDATE) private User user; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCardNum() { return cardNum; } public void setCardNum(String cardNum) { this.cardNum = cardNum; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "IDCard [id=" + id + ", cardNum=" + cardNum + ", user=" + user + "]"; } }
HQL
public class TestHQL { //准備數據 @Test public void test1() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Customer c = new Customer(); c.setName("猥瑣逼"); for (int i = 0; i < 10; i++) { Order order = new Order(); order.setMoney(2000+i*10d); order.setReceiverInfo("日本"); order.setC(c); session.save(order); } session.getTransaction().commit(); session.close(); } //基本索引 @Test public void test2() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Query query = session.createQuery("from Customer"); List<Customer> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //排序索引 @Test public void test3() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Query query = session.createQuery("from Order order by money desc"); List<Order> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //條件檢索 @Test public void test4() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Query query = session.createQuery("from Order where money > ?"); query.setParameter(0, 2000d); List<Order> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //分頁檢索 @Test public void test5() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Query query = session.createQuery("from Order"); query.setFirstResult(11); query.setMaxResults(6); List<Order> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //分頁統計檢索 @Test public void test6() { Session session = HibernateUtils.openSession(); session.beginTransaction(); /*Query query = session.createQuery("select count(*) from Order"); Object count = query.uniqueResult(); System.out.println(count);*/ Query query = session.createQuery("select sum(money) from Order group by c"); //需要注意的是group by c,其中的c是引用的Customer對象 List list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //投影檢索 //@Test public void test7() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Query query = session.createQuery("select new Customer(id,name) from Customer"); List<Customer> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } }
QBC
public class TestQBC { //基本檢索 @Test public void test1() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //排序查詢 @Test public void test2() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Criteria criteria = session.createCriteria(Order.class); criteria.addOrder(org.hibernate.criterion.Order.asc("money")); List list = criteria.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //條件檢索 @Test public void test3() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Criteria criteria = session.createCriteria(Customer.class); criteria.add(Restrictions.eq("name", "猥瑣逼")); Object result = criteria.uniqueResult(); System.out.println(result); session.getTransaction().commit(); session.close(); } //分頁查詢 @Test public void test4() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Criteria criteria = session.createCriteria(Order.class); criteria.setFirstResult(0); criteria.setMaxResults(2); List<Order> list = criteria.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //統計分頁查詢 @Test public void test5() { Session session = HibernateUtils.openSession(); session.beginTransaction(); Criteria criteria = session.createCriteria(Order.class); /*criteria.setProjection(Projections.rowCount()); Object count = criteria.uniqueResult(); System.out.println(count);*/ criteria.setProjection(Projections.projectionList().add(Projections.sum("money")).add(Projections.groupProperty("c"))); List<Object[]> list = criteria.list(); for (Object[] objects : list) { for (Object object : objects) { System.out.println(object); } } session.getTransaction().commit(); session.close(); } //離線條件查詢 @Test public void test6() { //創建離線查詢對象 DetachedCriteria dc = DetachedCriteria.forClass(Customer.class); dc.add(Restrictions.eq("name", "猥瑣逼")); Session session = HibernateUtils.openSession(); session.beginTransaction(); //生成criteria Criteria criteria = dc.getExecutableCriteria(session); Customer c = (Customer) criteria.uniqueResult(); System.out.println(c); session.getTransaction().commit(); session.close(); } }
SQL
public class TestSQL { //測試執行sql @Test public void test1() { Session session = HibernateUtils.openSession(); session.beginTransaction(); SQLQuery query = session.createSQLQuery("select * from t_customer"); //將查詢結果綁定到指定對象 query.addEntity(Customer.class); List list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } }