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