Hibernate 映射文件使用方式案例

来源:互联网 发布:软件可靠性方法 pdf 编辑:程序博客网 时间:2024/05/21 15:04

Hibernate 映射文件使用方式案例

本案例使用的hibernate版本为  hibernate-release-5.2.10.Final 

为了测试,本案例在mysql数据库中创建了一个db数据库。

创建一个java项目:项目的结构如下:(lib文件夹用于存放jar包)


lib目录下则是hibernate5需要的jar包(注需要将jar加载到项目中:选中jar包右键 --》BuildPath--》Add to Build Path)

log4j.properties为日志配置文件(需要加载配置junit),此项目可以不需要日志,使用日志只是为了观察方便。
注:junit配置可以参考 http://blog.csdn.net/benxiaohai888/article/details/78231911

由于在主配置文件配置了字段创建数据表的配置,所以第一次加载时就会自动创建数据表

配置的代码:

<!-- 自动生成数据表(数据表的生成方式) -->
<property name="hbm2ddl.auto">update</property>


接下来是示例代码:

1、主配置文件 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><!-- 数据库URL --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db?characterEncoding=utf8</property><!--数据库用户名, --><property name="hibernate.connection.username">root</property><!--数据库密码 --><property name="hibernate.connection.password"></property><!--配置二:数据库方言配置,配置数据库方言的作用是屏蔽数据库的差异,换句话说是使hibernate框架知道 要与哪种数据库取得联系 --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!--配置三:其它配置 (这些配置可选) --><!-- 是否在控制台显示sql语句 --><property name="hibernate.show_sql">true</property><!--是否格式化删除sql语句 --><property name="hibernate.format_sql">true</property><!-- 自动生成数据表(数据表的生成方式) --><property name="hbm2ddl.auto">update</property><!-- 将session绑定到当前线程 --><property name="hibernate.current_session_context_class">thread</property><!-- 设置事务的隔离级别 --><property name="hibernate.connection.isolation">4</property><!-- 配置四:映射配置 --><mapping resource="cn/sz/entity/User.hbm.xml" /></session-factory></hibernate-configuration>


2、工具类(获取Session)HibernateUtil.java

package cn.sz.utils;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil {public static Session getSession() {Session session = null;// 创建一个读取主配置文件的对象Configuration cfg = new Configuration();// 读取主配置文件cfg.configure();// 创建Session工厂SessionFactory factory = cfg.buildSessionFactory();// 打开Session// session = factory.openSession();// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出sessionsession = factory.getCurrentSession();return session;}}


3、日志文件 log4j.properties

log4j.rootLogger=DEBUG,console,FILElog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.threshold=INFOlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%nlog4j.appender.FILE=org.apache.log4j.RollingFileAppenderlog4j.appender.FILE.maxBackupIndex=100##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.Append=truelog4j.appender.FILE.File=c:/error1.loglog4j.appender.FILE.Threshold=INFOlog4j.appender.FILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%nlog4j.appender.FILE.MaxFileSize=1MB


4、实体类 User.java

package cn.sz.entity;import java.io.Serializable;import java.util.Date;import java.util.List;import java.util.Map;import java.util.Set;public class User implements Serializable {// 适应数值形式的主键值private Integer uid;private String uname;private Date udate;private String content;// 使用字节数组存储图片private byte[] photo;// 集合类型的属性// Set集合private Set<String> setAddress;// List集合private List<String> listAddress;// 对应映射文件bagprivate List<String> bagListAddress;// Map集合private Map<String, String> mapAddress;// 数组属性private String[] arrayAddress;public User() {}public Set<String> getSetAddress() {return setAddress;}public void setSetAddress(Set<String> setAddress) {this.setAddress = setAddress;}public List<String> getListAddress() {return listAddress;}public void setListAddress(List<String> listAddress) {this.listAddress = listAddress;}public List<String> getBagListAddress() {return bagListAddress;}public void setBagListAddress(List<String> bagListAddress) {this.bagListAddress = bagListAddress;}public Map<String, String> getMapAddress() {return mapAddress;}public void setMapAddress(Map<String, String> mapAddress) {this.mapAddress = mapAddress;}public String[] getArrayAddress() {return arrayAddress;}public void setArrayAddress(String[] arrayAddress) {this.arrayAddress = arrayAddress;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public byte[] getPhoto() {return photo;}public void setPhoto(byte[] photo) {this.photo = photo;}public Date getUdate() {return udate;}public void setUdate(Date udate) {this.udate = udate;}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}}


5、User实体映射文件User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- package为实体类所在的包 --><hibernate-mapping package="cn.sz.entity"><!-- 实体类和哪个表对应 ;table用于配置实体类和表的对应;name用于配置哪个实体类和表对应 --><class table="q_user" name="User"><!-- id用于配置主属性和主键字段对应;id的name用于配置属性名 --><id name="uid"><!-- 主键生成策略 --><generator class="native"></generator></id><!-- property用于配置普通属性和字段的对应 --><!-- type用于设置字段的类型,值的选择可以选hibernate类型,也可以选择Java类型; type可以省略,在省略的情况下hibernate自适应;length为长度 --><property name="uname" length="30"></property><property name="udate" type="date"></property><property name="content" type="text" length="10000"></property><property name="photo" type="byte[]" length="1024000"></property><!-- 使用set标签对应实体类中的set属性,name用于配制属性名, table用于配制所生成的第二张表格名称的;set对应无序特点 --><set name="setAddress" table="q_set"><!-- key用于配制第二张表中外键字段 --><key column="userid"></key><element column="address" type="string"></element></set><!-- list标签 --><list name="listAddress" table="q_list"><key column="userid"></key><list-index column="index_"></list-index><element column="address" type="string"></element></list><!-- 在实体类中通过list集合,在映射中通过bag标签定义一类属性和表的 对应关系,此bag特点是set和list两个特点结合到一起(无序,能重复) --><bag name="bagListAddress" table="q_bag"><key column="userid"></key><element column="address" type="string"></element></bag><!-- 对应数组属性成员 --><array name="arrayAddress" table="q_arr"><key column="userid"></key><index column="index_"></index><element column="address" type="string"></element></array><!-- 对应map类型的属性的配置 --><map name="mapAddress" table="q_map"><key column="userid"></key><!-- 对应映射集合中的key --><map-key column="key_" type="string"></map-key><element column="address" type="string"></element></map></class></hibernate-mapping>



6、测试类

package cn.sz.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import org.hibernate.Session;import org.junit.Test;import cn.sz.entity.User;import cn.sz.utils.HibernateUtil;public class UserTest {@Testpublic void testSave() throws IOException {Session session = HibernateUtil.getSession();session.beginTransaction();// 创建一个用户User u = new User();u.setUname("张三");u.setContent("张三的个人简介");u.setUdate(new Date());// 读取图片InputStream is = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\test.jpg"));byte[] photo = new byte[is.available()];is.read(photo);u.setPhoto(photo);// 创建Map集合Map<String, String> map = new HashMap<>();map.put("a1", "北京");map.put("a2", "上海");// 将map集合绑定到用户u.setMapAddress(map);// 创建List集合List<String> list = new ArrayList<>();list.add("南京");list.add("昆明");// 将List集合绑定到用户u.setListAddress(list);// 测试List集合和Set的结合体bagList<String> list2 = new ArrayList<>();list2.add("南京");list2.add("昆明");// 将List集合绑定到用户u.setBagListAddress(list2);// 创建Set集合Set<String> set = new HashSet<>();set.add("西藏");set.add("深圳");// 将set集合绑定到用户u.setSetAddress(set);// 创建数组String[] arr = new String[2];arr[0] = "龙华";arr[1] = "澳门";// 将数组绑定到用户u.setArrayAddress(arr);session.save(u);session.getTransaction().commit();is.close();session.close();}@Testpublic void testQuery() throws IOException {Session session = HibernateUtil.getSession();session.beginTransaction();// 查询id为1的用户姓名User user = session.get(User.class, 1);System.out.println(user.getUname());// set集合查询Set<String> set = user.getSetAddress();for (String string : set) {System.out.println(string);}// list集合查询List<String> listAddress = user.getListAddress();for (String string : listAddress) {System.out.println(string);}// map集合查询Map<String, String> mapAddress = user.getMapAddress();Set<String> keySet = mapAddress.keySet();for (String string : keySet) {System.out.println(mapAddress.get(string));}// 数组查询String[] arrayAddress = user.getArrayAddress();for (String string : arrayAddress) {System.out.println(string);}// bagList<String> bagListAddress = user.getBagListAddress();for (String string : bagListAddress) {System.out.println(string);}// 将图片写出去OutputStream os = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\测试.jpg"));byte[] photo = user.getPhoto();os.write(photo);os.close();session.getTransaction().commit();session.close();}}



原创粉丝点击