实体类规范(javaBean规范)
1.提供无参构造方法
2.成员变量私有化 提供get/set方法
3.基本数据类型尽量使用包装类型(可以多表示一个值null 例如考试分数 缺考和0分)
4.实体中必须要提供一个与表中的主键对应的属性id
hibernate是通过主键来区别对象是否相同
5.不要使用final修饰实体类(代理对象是要继承该类的)
主键类型
1.自然主键
表中有复合主键规范的的字段(唯一并且不重复) 此时可以用来做主键
2.代理主键(常用)
找不到主键(没有字段符合主键规则)
创建一个没有任何意义的主键id列 作为主键 就是为了非空不重复 叫做代理主键
主键生成策略(7种)
1 identity: 主键自增 由数据库维护 插入数据 无id
2.increment: 主键自增 由hibernate维护
会先查询最大的id 然后在这个最大的基础上+1 并且插入数据时有id
3.sequence: 序列
4.hilo: 高低位算法 (hibernate会自己通过该算法 算出主键自增)
5.native(常用): hilo + identity + sequence 三选一
系统会检测你的数据库类型 mysql 就是自增策略
6.uuid: 全球范围内 不重复的值 是字符串
注意: 主键必须是字符串类型
是由hibernate生成的id 然后插入到数据库中
7.assigned: 是由程序员自己管理主键
三种状态
1.瞬时态 没有id 和没有session关联
2.持久态 有id 和session有关联
3.游离态 有id 和session没有关联
目的: 将我们想要同步到数据库的数据 所对应的对象转换成持久态
一级缓存
快照
HQL 查询(简单多表查询 不复杂的查询)
1.查询所有对象
String HQL = "from User";
其中User是类名 不是表名
String HQL = "from User where id = 1";
其中id代表属性名 不是表中的字段名
查询方法: session.createQuery(字符串名);
返回结果(预见结果)
如果返回的是集合 就使用list()
如果返回的是单个 就使用uniqueResult()
@Test
public void fun1() {
String sql = "from com.lanou3g.User";
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery(sql);
// 预见结果(单数据)
// User user = (User) query.uniqueResult();
// System.out.println(user);
// 预见结果(多数据)
List list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
2.问号(?)占位符查询
赋值参数的时候 参数1 占位符的索引 参数2 查询条件
注意:HQL索引从0开始的
query.setParameter(0, 2);
@Test
public void fun2() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
String sql = "from com.lanou3g.User where id = ?";
Query query = session.createQuery(sql);
// 给语句中的问号赋值 从0开始
query.setParameter(0, 2);
User user = (User) query.uniqueResult();
System.out.println(user);
transaction.commit();
session.close();
}
3.冒号(:)占位符查询
冒号(:) 后面相当于给这个冒号占位符 起了个别名
注意: 冒号后面不要加空格
@Test
public void fun3() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
// 冒号(:) 后面相当于给这个冒号占位符 起了个别名
// 注意: 冒号后面不要加空格
String sql = "from com.lanou3g.User where id = :ww";
Query query = session.createQuery(sql);
query.setParameter("ww", 1);
User user = (User) query.uniqueResult();
System.out.println(user);
transaction.commit();
session.close();
}
4.分页查询
设置起始setFirstResult();
最大显示setMaxResults();
@Test
public void fun4() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
String hql = "from com.lanou3g.User";
Query query = session.createQuery(hql);
// 设置起始 和 最大位置
query.setFirstResult(0);
query.setMaxResults(2);
// 接收
List list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
5.无语句查询
Restrictions.eq() 等于
Restrictions.gt() 大于
Restrictions.ge() 大于等于
Restrictions.lt() 小于
Restrictions.le() 小于等于
Restrictions.isnull() 等于空值
Restrictions.isNotNull() 非空值
Restrictions.like() 字符串模式匹配
Restrictions.and() 逻辑与
Restrictions.or() 逻辑或
Restrictions.not() 逻辑非
Restrictions.in() 等于列表中的某一个值
Restrictions.between() 闭区间中的任意值
@Test
public void fun5() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
List list = criteria.list();
System.out.println(list);
transaction.commit();
session.close();
}
6.查询一共有多少记录数
一般返回值是个数的 通常使用Long来接收
@Test
public void fun7() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.rowCount());
Long l = (Long) criteria.uniqueResult();
System.out.println(l);
transaction.commit();
session.close();
}
7.原生sql查询(复杂的多表查询)
注意:返回的结果跟对象没有关系
@Test
public void fun8() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
String sql = "select * from user where id=?";
Query query = session.createSQLQuery(sql);
query.setParameter(0, 3);
// List<Object[]> list = query.list();
// for (Object[] object : list) {
// System.out.println(Arrays.toString(object));
// }
// 一条记录就是一个Object数组
Object[] objects = (Object[]) query.uniqueResult();
for (Object object : objects) {
System.out.println(object);
}
transaction.commit();
session.close();
}