zoukankan      html  css  js  c++  java
  • 数据查询大集合

    1.HQL查询:

      基本规则:就像SQL一样,也是有select from where,但是select,from后面跟着并不是表中的字段名或者表名,而是他们对应的类名和属性名。注意:若是select * 一般是可以省略的;注意类名包名属性名的大小写,这里对这些东西大小写敏感。

    下面做一个测试,事先连接好数据库,写好实体类。

    记录大坑:今天写hibernate配置文件的时候,遇到了两个大坑,害的我花了三小时才搞通了,心累。。。。。。。。。。就是因为自己菜

      大坑一:在主配置文件中,写资源mapping的时候,运行之后,老是找不到资源位置,也就是*.hbm.xml文件的位置。最后实在气不过,直接把*.hbm.xml扔到resource文件中,不和entity文件在一起,和主配置文件hibernate.cfg.xml在一起就好了。

      大坑二:在主配置文件中,在配置url的时候,老是报错。最后发现,这个和properties.yml中的配置不一样,后面的"&"连接都要改成";"才可以。配置文件如下:

    hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!--驱动路径注意数据库类型  -->
            <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
            <!--数据库路径  -->
            <property name="hibernate.connection.url">jdbc:mysql:///student?serverTimezone=UTC</property>
            <!--数据库用户名  -->
            <property name="hibernate.connection.username">root</property>
            <!--数据库密码  -->
            <property name="hibernate.connection.password">123456</property>
            <!--方言,便于hibernate对象操作转化为合适的数据库语句  -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <!--是否显示sql语句,sql一般会很难看  默认为false-->
            <property name="hibernate.show_sql">true</property>
            <!--下一个层级的映射文件,用来配置bean对象与数据表之间的关系  -->
            <mapping resource="xml/Student.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

    Student.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 注意包名。不写的话下面要写全限定名 -->
    <hibernate-mapping    package="com.yyj.demo.pojo">
        <!-- 类名对应表名 -->
        <class name="Student" table="student">
            <!-- 主键使用id标签。然后对应属性名与列名 -->
            <id name="id" type="int" column="id">
                <!-- 自增长主键不同数据库有不同类型的自增长类型,有需要可以百度到答案的 -->
                <generator class="identity"></generator>
            </id>
            <!-- 非主键映射关系,注意类型并不是单纯的java类型也不是数据库类型,而是一种中间类型,注意大小写特别是String在这里开头要小写 -->
            <property name="name" type="string" column="name"></property>
            <property name="age" type="int" column="age"></property>
            <property name="xh" type="string" column="xh"></property>
        </class>
    </hibernate-mapping>

    测试:

    import com.yyj.demo.pojo.Student;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.query.Query;

    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    public class TestHibernate {

    private static Configuration con = null;
    private static SessionFactory factory = null;
    private static Session session = null;

    public static void canShuChaungDi(){
    //String hql = "from Student where name=?";
    String hql = "from Student where name = :name"; //使用参数名称动态绑定!(推荐使用!)
    Query q = session.createQuery(hql);
    //q.setString(0, "SMITH"); //问号的个数,参数索引从0开始计数,而不像jdbc一样从1开始。
    q.setString("name", "yyj7");
    List list = q.list();
    for(int i=0;i<list.size();i++){
    Student c = (Student) list.get(i);
    System.out.println(c.getXh());
    }
    }

    public static void getAllStudent(){
    //select *直接省略
    String hql = "from Student";
    //创建HQL查询
    Query query = session.createQuery(hql);
    query.setFirstResult(0); //从第几条开始取数据
    query.setMaxResults(10); //设置每页最多显示记录的个数
    List list = query.list();
    for(int i = 0;i < list.size();i++){
    //可以通过对象数组或者Map获取
    //Object[] o = list.get(i); List<Object[]> list = query.list();
    //Map map = list.get(i); List<Map> list = query.list();
    Student student = (Student) list.get(i);
    System.out.println(student.getName() + " " + student.getXh());
    }
    }
    public static void dongTaiChaXun(){
    String hql = "from Student where 1=1";
    //创建StringBuffer对象,方便字符串的拼接
    StringBuffer buffer = new StringBuffer(hql);
    Student student = new Student();
    student.setAge(23);
    if(student.getAge() != 0){
    buffer.append(" and age=:age");
    }
    Query query = session.createQuery(buffer.toString());
    Student student1 = (Student) query.uniqueResult();//单个结果
    System.out.println(student1);
    }
    public static void getStudent2(){
    String hql = "from Student where id=:id and age=:age";
    Query q = session.createQuery(hql);
    Map<String, Object> ma = new HashMap<>();
    ma.put("id",4);//或者使用setParameter(1,1)
    ma.put("age",23);
    q.setProperties(ma);
    List list = q.list();//多个结果
    for(int i = 0;i < list.size();i ++){
    Student s = (Student) list.get(i);
    System.out.println(s.getName());
    }
    }
    public static void getStudent(){
    String hql = "from Student where id=:id and age=:age and name=:name and xh=:xh";
    Query query = session.createQuery(hql);
    Student student = new Student(4,23,"tzj","002");
    query.setProperties(student);
    List<Map> list = query.list();
    for(int i = 0;i < list.size();i ++){
    Map map = list.get(i);
    System.out.println(map.get("name"));
    }
    }
    public static void getNum(){
    //count(*),count(1)都可以
    String hql = "select count(*) from Student";
    Query query = session.createQuery(hql);
    Number number = (Number) query.uniqueResult();
    System.out.println(number.intValue());
    }
    public static void main(String[] args){
    //读取配置文件中的信息
    con =new Configuration().configure();
    //获取sessionFactory对象
    factory=con.buildSessionFactory();
    //获取Session对象
    session=factory.openSession();
    canShuChaungDi();
    //getAllStudent();
    //getNum();
    session.close();
    }
    }

    2.SQL查询和命名方式查询:

      填坑:配置hibernate文件需要添加mapping,直接上代码吧,加粗的地方要注意。

    1.Address.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.yyj.demo.pojo">
        <class name="Address" table="address">
            <!-- 主键使用id标签。然后对应属性名与列名 -->
            <id name="id" type="int" column="id">
                <!-- 自增长主键不同数据库有不同类型的自增长类型,有需要可以百度到答案的 -->
                <generator class="identity"></generator>
            </id>
            <!-- 非主键映射关系,注意类型并不是单纯的java类型也不是数据库类型,而是一种中间类型,注意大小写特别是String在这里开头要小写 -->
            <property name="province" type="string" column="province"></property>
            <property name="city" type="string" column="city"></property>
            <property name="town" type="string" column="town"></property>
            <property name="village" type="string" column="village"></property>
        </class>
        <sql-query name="address.list">
            <return class="Address"></return>
            <![CDATA[select * from address where city = :city]]>
        </sql-query>
    </hibernate-mapping>

    2.TestSQL.java

    import java.util.List;
    
    public class TestSQL {
        private static Configuration con = null;
        private static SessionFactory factory = null;
        private static Session session = null;
    
        public static void getAllAddress(){
            Query query = session.getNamedQuery("address.list").setParameter("city", "合肥");
            List<Address> list = query.list();
            for (int i = 0;i < list.size();i ++){
                System.out.println(list.get(i).getProvince());
            }
        }
        public static void main(String[] args){
            //读取配置文件中的信息
            con =new Configuration().configure();
            //获取sessionFactory对象
            factory=con.buildSessionFactory();
            //获取Session对象
            session=factory.openSession();
            getAllAddress();
            session.close();
        }
    }
  • 相关阅读:
    NO29 用户提权sudo配置文件详解实践--志行为审计
    NO28 第四关考试题
    NO27 定时任务
    NO26 Linux的文件权限--chmod--Linux删除文件说明--suid--sgid
    NO25 三剑客之SED行天下
    NO24 第三关--企业面试题
    gcc编译错误表
    C++的精髓——虚函数
    gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer
    正确使用#include和前置声明(forward declaration)
  • 原文地址:https://www.cnblogs.com/Fantastic-Code/p/11726990.html
Copyright © 2011-2022 走看看