hibernate初接触
hibernate 是一个数据持久层的轻量级框架,它对 jdbc 进行了进一步的封装, 在使用上较 jdbc 更为简易;
首先, 看一下 hibernate 的配置:
1、引入
maven 引入
<dependency> <groupId>hibernate</groupId>
<artifactId>hibernate</artifactId> <version>3.0.5</version> </dependency> <!-- 事物管理 --> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <!-- 解析 XML 文件使用 --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <!-- 打日志用 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- 连接数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.5</version> </dependency>
2、配置 hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://xxxxxx/abcd?useUnicode=true&characterEncoding=utf-8</property> <property name="hibernate.connection.username">xxx</property> <property name="hibernate.connection.password">xxxx</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> </session-factory> </hibernate-configuration>
3、定义一个与数据库表字段映射的实体类
沿用前例
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SurveyQuest {
public int quest_id;
public int scene_id;
public int survey_id;
public String quest_name;
public int version;
public int quest_seq;
public String quest_type;
public String required;
public String create_time;
}
4、定义映射文件 surveyQuest.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.study.hugy.modal.SurveyQuest" table="survey_quest"> <id name="quest_id" type="int" column="quest_id"/> <property name="scene_id" type="int" column="scene_id"/> <property name="survey_id" type="int"/> <property name="quest_name" type="java.lang.String"/> <property name="version" type="int"/> <property name="quest_seq" type="int"/> <property name="required" type="java.lang.String"/> <property name="create_time" type="java.lang.String"/> </class> </hibernate-mapping>
5、添加映射文件到 hibernate.cfg.xml 中
<hibernate-configuration> <session-factory> <mapping resource="surveyQuest.hbm.xml"/> </session-factory> </hibernate-configuration>
做完这些, 准备工作就做完了,下面总结一下几种用法。
1、简单的增删改查
Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = null; Transation transation = null; try { session = factory.openSession(); transation = session.beginTransation(); // todo 这里代码不一样 transation.commit(); } catch( Exception e) { transation.rollback(); } finally { if (session != null && session.isopen()) { session.close(); factory.close(); } }
查询: 根据 映射文件 中的 id 属性作为条件进行查询
SurveyQuest bean = session.get(SurveyQuest.class, id);
增加:
SurveyQuest bean = new SurveyQuest(); bean.setId(12345); ... session.save(bean);
删除:
SurveyQuest bean = new SurveyQuest(); bean.setId(12345); session.delete(bean);
更新:
...
session.update(bean);
可以看到,简单增删改查都是以 映射文件 中配置的 id 属性进行查询, 且我们并不需要写入什么 select、insert、update、delete 等;
2、根据 hql 语句进行查询
查询:
List<SurveyQuest> list = session.createQuery("SELECT quest_id FROM SurveyQuest").list();
List<SurveyQuest> list = session.createQuery("SELECT quest_id FROM SurveyQuest WHERE quest_id = ?").setParameter(0, 101).list();
List<SurveyQuest> list = session.createQuery("SELECT quest_id FROM SurveyQuest WHERE quest_id = :questId").setParameter("questId", 101).list();
删除、修改、增加:
session.createQuery("").executeUpdate();
代码格式都是如上所示,只是 HQL 的差别
INSERT INTO SurveyQuest (quest_id, quest_name, survey_id) VALUES (123, "456", 789) UPDATE SurveyQuest SET quest_name = "你好啊,hibernate" WHERE quest_id = ? DELETE FROM SurveyQuest WHERE quest_id = ?
带入参数的方法仍然是 setParameter() ;
如果要加入多个参数,调用多次 setParameter() 即可, 亦或者直接动态的拼接完 hql 在放在 session 中执行;
3、通过 xml 文件配置查询
在 映射文件 中添加 hql 语句
<query name = "selectAll"> SELECT quest_id FROM SurveyQuest WHERE quest_id = ? </query>
使用时调用 getNamedQuery("selectAll")
session.getNamedQuery("selectAll").setParameter(0, 121).list()
PS: hql 中表的名称 是在映射文件中对应类 的类名, 并不是原表的名称;
番外, hql 中取查询结果的多少到多少条(分页), 使用的 api 是 setFirstResult(int start) 、 setMaxResults(Int count)
session.createQuery("SELECT quest_id FROM SurveyQuest").setFirstResult(3).setMaxResults(2).list()