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();
        }
    }
  • 相关阅读:
    IIS7中的几种身份鉴别方式(一)Basic身份验证
    IIS7中的几种身份鉴别方式(二)集成身份验证
    java集合
    SharePoint 2010中welcome page的设置细节
    SharePoint中使用Linq出现未将对象引用到实例化的解决方法
    SharePoint 2010中关于An error was encountered while retrieving the user profile的处理方式记录
    The Need for an Architectural Body of Knowledge
    The Softer Side of the Architect
    Event Receivers 学习小结
    使用SmtpClient发送带图片的邮件的代码实现
  • 原文地址:https://www.cnblogs.com/Fantastic-Code/p/11726990.html
Copyright © 2011-2022 走看看