SSH整合的步骤:
1.创建数据库 db1707
2.创建java项目hibernate1_helloworld
3.加入架包
(1)c3p0 (2)mysql (3)required
4.创建配置文件hibernate.cfg.xml
5.创建实体类com.test.po.News
6.在News中加入hibernate注解
7.写一个工具类.com.test.util.DBUitls, 在类中封装创建SessionFactory对象,
创建SessionFactory对象中封装了hibernate.cfg.xml的信息
8.写一个测式类,来使用数据库, 类名: com.test.test.TestDao;
在数据库中可以没有表,在JAVAWEB项目中配置如下相关操作,会自动生成响应的表。
@Entity
//@Table(name = "news_inf") // 配置对应的表名,默认表名为类名。
public class News implements Serializable {
@Id // 表示该字段为主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//设置字段自增长
@Column(name="xxx")
private int id;
......
}
@Test
public void queryById() {
SessionFactory sf = DBUtils.getSF();// 创建SessionFactory
Session sess = sf.openSession();// 创建Session
Transaction tr = sess.beginTransaction(); // 开启事务
// News news = (News) sess.get(News.class, 5); //Integer
News news = (News) sess.load(News.class, 5);// 根据主键的值2查询记录。
System.out.println(news);
tr.commit();// 提交事务,事务结束1
sess.close();
System.out.println(news);
}
@Test
public void hqlQuery() {
SessionFactory sf = DBUtils.getSF();// 创建SessionFactory
Session sess = sf.openSession();// 创建Session
Transaction tr = sess.beginTransaction(); // 开启事务
String hql = "select s from News s where s.id> :xid and s.title = :xtitle";
Query query = sess.createQuery(hql);
query.setInteger("xid", 0);
query.setString("xtitle", "手机");
Iterator it = query.iterate();
while (it.hasNext()) {
News news = (News) it.next();
System.out.println(news);
}
tr.commit();// 提交事务,事务结束1
sess.close();
}
hibernate的状态转换图
下面来讲解增删改需要注意的问题:
hibernate 的修改和删除,只有在持久状态下才能进行,其它的状态是不生效的。
让数据变为持久状态有两种方式:①先执行
查询操作,将查询出来的数据做响应增删改操作。
②
保存之后在做其它的增删改操作。
示例1:
// 查出后才能修改
@Test
public void update1() {
SessionFactory sf = DBUtils.getSF();// 创建SessionFactory
Session sess = sf.openSession();// 创建Session
Transaction tr = sess.beginTransaction(); // 开启事务
News news = (News) sess.load(News.class, 7);// 根据主键的值6查询记录。
news.setTitle("学校1");
news.setContent("华清远见就是好1");
news.setGrade(100);
tr.commit();// 提交事务,事务结束
sess.close();
}
示例2:
@Test
public void saveNews() {
News news = new News();//临时状态
news.setTitle("好专业");
news.setContent(";
news.setGrade(100);
SessionFactory sf = DBUtils.getSF();// 得到SessionFactory
Session sess = sf.openSession();// 创建Session
Transaction tr = sess.beginTransaction(); // 开启事务
sess.save(news);// 执行保存,只能传递临时状态的news,保存之后变成了持久状态
sess.save(news);//此条语句将不生效,只会生成一条记录。
// sess.saveOrUpdate(news);// 执行保存
// sess.delete(news);//只能删除持久状态,删除后变成了临时状态
tr.commit();// 提交事务,事务结束
sess.close();
}
数据库查询的其它重要知识点。
示例3:
//根据key模糊查询
public List getNewsByKeyTitle(String key) {
Session session = DBUtils.getSF().openSession();
// Transaction ts = session.beginTransaction();
session.beginTransaction();
//模糊查询的关键字like.
String hql = "select s from News s where s.title like :title";
Query query = session.createQuery(hql);
query.setString("title", "%"+key+"%");
List list = query.list();
// ts.commit();
session.getTransaction().commit();
session.close();
return list;
}
示例4:
public Long functionQuery() {
Session session = DBUtils.getSF().openSession();
session.beginTransaction();
String hql = "select count(s.id) from News s";
Query query = session.createQuery(hql);
List list = query.list();
Long x = list.get(0);
session.getTransaction().commit();
session.close();
return x;
}
示例5:
@Test
public void pageQuery() {
Session session = DBUtils.getSF().openSession();
session.beginTransaction();
String hql = "select s from News s";
Query query = session.createQuery(hql);
query.setFirstResult(10);//索引
query.setMaxResults(5);//每页条数
List list = query.list();
for (News news : list) {
System.out.println(news);
}
session.getTransaction().commit();
session.close();
}
状态的切换
//进入游离状态
@Test
public void m3() {
SessionFactory sf = DBUtils.getSF();
Session session = sf.openSession();
Transaction tr = session.beginTransaction();
//News是po中的一个JAVABEANS,与数据库交接
News news1 = (News) session.get(News.class, 6);//持久化状态
News news2 = (News) session.get(News.class, 7);//持久化状态
// session.clear();//把session中的持化状态对象全部丢出,变成游离状态
// session.evict(news1);//把news1中的news1丢出,变成游离状态
tr.commit();
session.close();//状态session,则session中的所有持久状态都变成游离状态
}
//游离状态变成持久状态
@Test
public void m4() {
SessionFactory sf = DBUtils.getSF();
Session session = sf.openSession();
Transaction tr = session.beginTransaction();
News news1 = (News) session.get(News.class, 6);//持久化状态
News news2 = (News) session.get(News.class, 7);//持久化状态
session.evict(news1);//把news1中的news1丢出,变成游离状态
news1.setContent("小明");//修改游离状态
session.update(news1);//从游离状态--->持久状态
tr.commit();
session.close();//状态session,则session中的所有持久状态都变成游离状态
Session session2 = sf.openSession();
Transaction tr2 = session2.beginTransaction();
session2.update(news2);//从游离状态--->持久状态
news2.setGrade(10000);
tr2.commit();
session2.close();//状态session,则session中的所有持久状态都变成游离状态
}