Hibernate 笔记4 实现对数据库的增删改查
1 准备
首先在mysql数据库中建表User,并添加相关信息。
user表结构如下。
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| pwd | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
建立User类,添加set,get 方法。
使用hibernate对数据进行增删改差的步骤:
- 获得连接
- 开启事务
- 增删改查操作
- 提交事务
- 关闭连接
2 对数据进行添加(insert)
插入操作使用 session.save(类对象)如上述代码14行所示。
可以使用session.saveorupdate(类对象),由hibernate判断是添加还是更新。
save是返回插入数据的主见的,而saveOrUpdate是void
save方法更适用与确定了是要插入,而且需要得到插入数据的主键而saveOrUpdate更倾向于不确定是插入还是更新,而且你不需要得到他的主键
另一方面,如果你无法确定你要插入或更新的对象是不是持久态或游离态时。如果你save一个持久态或更新一个游离态,这都是有问题的,
此时你就要用到 saveOrUpdat
总体来说,如果你能确定你即将操作对象的状态,则不需要用saveOrUpdate
1 public void TestInsert() throws Exception{
2 User user= new User(); //初始化User
3 user.setId(1); //设置属性的数据
4 user.setName("蓝冰竹斋");
5 user.setPwd("123");
6
7 Configuration config=new Configuration().configure(); // 加载总配置文件
8 SessionFactory sessionFactory= config.buildSessionFactory(); // 建立工厂
9 Session session=null; //定义Session
10 Transaction tx=null; // 定义事务
11 try{
12 session=sessionFactory.openSession(); // 通过工厂建立连接
13 tx=session.beginTransaction(); // 通过连接开启事务
14 session.save(user); // 通过连接保存user
15 tx.commit(); // 提交
16
17 }catch(Exception e){
18 tx.rollback(); // 出现异常回滚
19
20 }finally{
21 if(session!=null){
22 session.close(); // 关闭连接
23 }
24 if(sessionFactory!=null){
25 sessionFactory.close(); // 关闭连接工厂
26 }
27 }
28 }
测试后打印出的语句:Hibernate: insert into user (name, pwd) values (?, ?)
3 对数据进行修改(update)
修改操作使用session.save(类对象),根据表id知道要修改的对象。 如果id不存在,出现异常org.hibernate.StaleStateException
如果某列不需要更新,需要在映射文件的相应<property>中加入 update="false",如不更新name,
<propertyname="pwd" column="pwd" update="false"></property>
更新时需要将表中所有字段数据进行设置,不设置的字段,其值默认为null.
可以使用session.saveorupdate(类对象),由hibernate判断是添加还是更新。
public void TestUpdate() throws Exception{
User user= new User();
user.setId(1);
user.setName("蓝冰"); //对name进行了修改
user.setPwd("1321121"); //对pwd进行了修改
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tx=null;
try{
session=sessionFactory.openSession();
tx=session.beginTransaction();
session.update(user); //修改数据
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}
Hibernate: update user set name=?, pwd=? where id=?
4 删除数据(deleted)
修改操作使用session.delete(类对象)
注意,只能通过id来删除数据,不能通过title或content来删除,会报缺少标示符错误。
public void TestDelete() throws Exception{
User user= new User();
user.setId(1);
user.setName("蓝冰竹斋1"); //根据ID删除,设置其他属性不起作用
user.setPwd("1321121");
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tx=null;
try{
session=sessionFactory.openSession();
tx=session.beginTransaction();
session.delete(user); //删除数据
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}
Hibernate: delete from user where id=?
5 查询数据(select)
通过ID进行查询。
查询有两种方式,1 session.get(类.class,id);
2 session.load(类.class,id);
类名.class 返回这个类的Class类型对象
load 支持懒加载,既使用对象时才执行。调用getID() 和 getclass()两个方法不执行。
两者的区别会在后面详细说明。
public void TestSelect() throws Exception{
User user1=null; // 用户1,使用get方法查询
User user2=null; // 用户2,使用load方法查询
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tx=null;
try{
session=sessionFactory.openSession();
tx=session.beginTransaction();
user1=(User) session.get(User.class, 3); //用户1 get查询 get方法中第一个字段是查询的类.class,第二个参数是id
user2=(User) session.load(User.class, 3); //用户2 load查询 参数同上
System.out.println(user1.getName()+"user1用户");
System.out.println(user2.getPwd()+"user2用户");
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.pwd as pwd0_0_ from user user0_ where user0_.id=?