hibernate和Jdbc查询的区别以及hibernate查询普通查询和Hql

来源:互联网 发布:mac照片如何归类 编辑:程序博客网 时间:2024/04/30 05:57

hibernate查询

我们先来看看传统的jdbc的dao是怎么写的
(1)首先创建一个连接池

public class lianjie {       static String url="jdbc:sqlserver://localhost:1433;DatabaseName=SuperMarket";    static String user="sa";    static String pass="sa";        //添加一个静态的方法可以直接通过lianjie.ljw()的方式得到一个Connection      public static Connection ljw(){      Connection c=null;    try {       //添加一个驱动(要导进来jar包)Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");    } catch (ClassNotFoundException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    try {    //通过驱动包的管理工具得到与数据库的连接        c=DriverManager.getConnection(url, user, pass);        System.out.println("数据库连接成功");    } catch (SQLException e) {        e.printStackTrace();        System.out.println("数据库连接失败");    }      return c; }public static void main(String[] args) {    lianjie.ljw();   }}

//jdbc方式的持久化操作(把结果存放在一个一个的对象

Connection c=new lianjie().ljw();Statement s=c.createStatement();String sql="select * from stu where name='"+name+"'";ResultSet r=s.executeQuery(sql);//得到结果集通过游标的方式取出(只有一个结果也要用youbiao)List<Map> list=new ArrayList()();while(r.next()){//结果集的每一个元素是一个Map类型的//存放进对象User  user=new  User();user.setName(r.getString("name"));user.setPassword(r.getString("name"));//或者是user.setName(r.getString(1));user.setPassword(r.getString(2));list.add(user);}

?方式来jdbc方式的持久化操作

Connection c=new lianjie().ljw();String sql="select * from stu where name=? and password=?";PrepareStatement s=c.prepareStatement(sql);s.setString(1,sso);s.setString(2,ss2);ResultSet r=s.executeQuery();//得到结果集通过游标的方式取出(只有一个结果也要用)List<Map> list=new ArrayList();while(r.next()){    //结果集的每一个元素是一个Map类型的    //存放进对象    User  user=new  User();    user.setName(r.getString("name"));    user.setPassword(r.getString("name"));    //或者是    user.setName(r.getString(1));    user.setPassword(r.getString(2));       list.add(user);}==========================================        Connection c=new lianjie().ljw();        PreparedStatement pre = null;        ResultSet r = null;        List list = new ArrayList();        try {            pre = c.prepareStatement(sql);            for (int i = 0; i < obj.length; i++) {                pre.setObject(i + 1, obj[i]);            }            r = pre.executeQuery();            //可以得到每一个列名            ResultSetMetaData rsmd = r.getMetaData();            while (r.next()) {                Map map = new HashMap();                for (int i = 0; i < rsmd.getColumnCount(); i++) {                    map.put(rsmd.getColumnName(i + 1), r.getObject(i + 1));                }                list.add(map);            }            r.close();            pre.close();            c.close();    ```     =================================================(为什么要使用hibernate框架呢)理由:![这里写图片描述](http://img.blog.csdn.net/20151122230634973)![这里写图片描述](http://img.blog.csdn.net/20151122230952876)hibernate是一个主流的orm框架(对象关系映射机制)通过映射文件来保存映射信息好处是:是持久化操作以面向对象的方式来编程,不用考虑数据的保存形式![这里写图片描述](http://img.blog.csdn.net/20151122231157370)使用hibernate的三个准备和七个步骤(1)三个准备+++++++导入jar包+++++++配置hibernate.cgf.xm

这里写图片描述

传统的hibernate方法

//读取hibernate配置文件.得到连接池信息Configuration config=new Configuration().configure();//创建sessionfactorySessionfactory sessionfactory=config.buildSessionfaction();//打开sessionSession session=sessionfactory.openSession();//开启一个事务Transaction ts=session.begintransaction();====insert操作 User user=new User(); user.setName("aaa"); session.save(user);====select操作(通过Id来进行查询) User user=(Usersession.get(User.class,id);====update操作 User user=(Usersession.get(User.class,id);  user.setName("addd");  session.update(user);====delete操作      session.delete(user);//提交事务ts.commit();session.close();

这里写图片描述

注意事项:
//读取hibernate配置文件.得到连接池信息
Configuration config=new Configuration().configure();
//创建sessionfactory
Sessionfactory sessionfactory=config.buildSessionfaction();
//打开session
Session session=sessionfactory.openSession();

========================>等价于
Session session=HibernateSessionFactory.getSession();

若继承了父类之后,若方法的重写或者是调用父类的方法(继承父类的方法在子类是不显示的,但是实现接口或者是抽象类的话必须实现重写方法)
用Super.来实现父类的方法

(2)使用hibernate的HQL语句来进行详细的查询或者模糊的查询(可以实现数据库的所有的操作)
//读取hibernate配置文件.得到连接池信息Configuration config=new Configuration().configure();//创建sessionfactorySessionfactory sessionfactory=config.buildSessionfaction();//打开sessionSession session=sessionfactory.openSession();//开启一个事务Transaction ts=session.begintransaction();============================//Tblfw是对象而不是数据库的表名,as可以省略String hql="select fw from Tblfw as fw";Query query=session.createQuery(hql);List list=query.list();=============================//也可以进行模糊查询String hql="select fw from Tblfw as fw where fw.title like '%adfa%'";Query query=session.createQuery(hql);List list=query.list();=============================//也可以用占位符的方式进行模糊查询(下表从0开始)String hql="select fw from Tblfw as fw where fw.title like ?";Query query=session.createQuery(hql);query.setString(0,"%adfa%");List list=query.list();=============================//也可以用参数名作为占位符的方式进行模糊查询(下表从0开始)String hql="select fw from Tblfw as fw where fw.title like :zh";Query query=session.createQuery(hql);query.setString(“:zh”,"%adfa%");List list=query.list();=============================// 分页查询String hql="select fw from Tblfw as fw order by fw.id";Query query=session.createQuery(hql);int firstResultIndex=pageSize*(PageNo-1);query.setFirstResult(firstResultIndex);query.setMaxResults(pageSize);List list=query.list();=============================// 当查询的结果只有一条的时候String hql="select count(fw) from Tblfw as fw order by fw.id";Query query=session.createQuery(hql);query.setMaxResults(pageSize); int num=query.luniqueResult();
0 0