初学hibrenate,利用它实现常用的增删改查等基本操作。
注:代码中所有sess=Hilbernateutil.getSession();都是用的工具类,
算了,工具类代码也贴上:
增加:我采用的是学生类。
浏览:
/获取所有学生
@Override
public List getAllStudent() {
Session sess =null;
Transaction tran=null;
try{
//得到session对象
sess=Hilbernateutil.getSession();
//利用Hibernate操作数据库,都要开启事务,得到事务对象
tran=sess.beginTransaction();
//开启事务
//添加对象到数据库
Query query=sess.createQuery("FROM Student");
List lis=query.list();
return lis;
}catch(Exception e){
throw new RuntimeException(e);
}finally{ //提交事务
tran.commit();
//关闭Session
sess.close();
}
}
删除
@Override
public void deleteSudent(int id) {
Session sess =null;
Transaction tran=null;
try{
sess=Hilbernateutil.getSession();
//利用Hibernate操作数据库,都要开启事务,得到事务对象
tran=sess.beginTransaction();
//先查询这个ID存在不,如果存在再删除它
Object oh=sess.get(Student.class, id);
if(oh!=null){
sess.delete(oh);
}
}
catch(Exception e){
throw new RuntimeException(e);
}
finally{
//提交事务
tran.commit();
//关闭对象
sess.close();
}
}
片
修改:修改这里记得学生对象需要赋值一个id,就是主键,不然会报错,查不到
@Override
public void updateStudent(Student stu) {
Session sess =null;
Transaction tran=null;
try{
//加载Student的隐射文件
//创建session工厂对象
//得到session对象
sess=Hilbernateutil.getSession();;
//利用Hibernate操作数据库,都要开启事务,得到事务对象
tran=sess.beginTransaction();
sess.update(stu);
}
catch(Exception e){
throw new RuntimeException(e);
}
finally{
//提交事务
tran.commit();
//关闭对象
sess.close();
}
}
//检索学生:注释掉的部分是另一种方式,并不是错的,只是因为直接return 哪一行的方式适合不了解 sql语句的,就是简单一点,
@Override
public Student queryStudent(int pid) {
Session session =null;
Transaction tran=null;
try{
//利用Hibernate操作数据库,都要开启事务,得到事务对象
session=Hilbernateutil.getSession();
//开启事务
tran=session.beginTransaction();
//Query query=session.get("from Student where pid=?");
//Object stu=sess.get(Student.class,id);
//query.setParameter(0, id);
//Student stu=new Student();
return (Student) session.get(Student.class, pid);
}catch(Exception e){
throw new RuntimeException(e);
}finally{
tran.commit();
//关闭Session
session.close();
}
}
//分页数据 别嫌方法名乱写,因为只是临时想不到了用啥了。。。
@Override
public List<Student> fenyeStudent(int currenpage, int pagesize) {
Session session=null;
Transaction tx=null;
try{
session =Hilbernateutil.getSession();//获取事务对象
tx=session.beginTransaction();//开启事务
Query query=session.createQuery("from Student");
//设置开始的地方
query.setFirstResult((currenpage-1)*pagesize);
//设置最大结果,就是每页显示多少
query.setMaxResults(pagesize);
return query.list();
}catch(Exception e){
throw new RuntimeException(e);
}
finally{
tx.commit();
session.close();
}
}
//这个是模糊查询
@Override
public List<Student> likeStudent(String name) {
Session session=null;
Transaction tx=null;
try {
session =Hilbernateutil.getSession();
tx=session.beginTransaction();
String hql=" from Student where pname=?";//hql的语句检索
Query quer=session.createQuery(hql);//检索需要的这个query
quer.setParameter(0, name);//这个是赋值,数据库从0开始的
return quer.list();
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}finally{
tx.commit();
session.close();
}
}
上面是基本的增删改查,顺便扩展说一下数据库存储图片,因为之前存数据库都是把图片路径。名字放进去,而这里是把图片整个放进去,就是图片本身(当然放进去是个分割一堆乱起八糟的二进制之类的数字的图片的)如果你要存图片,那么类映射需要这么写,加一个binary类型,长度这个把我是尽量放大了,我觉得一个图片没多大把。。。
然后是图片的上传给数据库,之前有学过存文件的应该知道,当时用的是解析工厂之类的,老麻烦的一串,
这里传图片用的是流,
FileInputStream fl;//文件输入流,
byte[] photo=null;//放照片。转2进制
try {
fl=new FileInputStream(“d:\1.png”);//这里是读取目标的图片
photo=new byte[fl.available()];//获取文件大小
fl.read(photo);//从输入流中读取数据存放到字节数组照片当中
System.out.println(photo);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stu.setPhoto(photo);//把照片赋值
这顿操作弄完图片就变成支离破碎的一堆了,然后就可以调用方法放入数据库了,
当然我们用浏览方法获取到的也是一堆数字,乱码,
要想看只能采用流再把它导到本地看,
FileOutputStream fos = new FileOutputStream(“d:\2.jpg”);//写入目标位置
fos.write(stu.getPhoto()); //获取照片并写入指定位置。
fos.close(); //关闭这个六
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这轮操作弄完就可以看到一张你上传的图片,也算是另类的复制粘贴把。。。