基本类型映射:
Java类型 | Hibernate映射类型 | 标准SQL类型 | 大小和取值范围 |
int/Integer | int/integer | INTEGER | 4Byte |
long/Long | long | BIGINT | 8Byte |
short/Short | short | SAMLLINT | 2Byte |
byte/Byte | byte | TINYINT | 1Byte |
float/Float | float | FLOAT | 4Byte |
double/Double | double | DOUBLE | 8Byte |
BigDecimal | big_decimal | NUMBERIC | Numeric(8,2) |
char/Character/String | character | CHAR(1) | 定长字符 |
String | string | VARCHAR | 变长字符 |
boolean/Boolean | boolean | BIT | 布尔类型 |
boolean/Boolean | yes/no | CHAR(1)('Y'/'N') | 布尔类型 |
boolean/Boolean | true/false | CHAR(1)('T'/'F') | 布尔类型 |
Java时间和日期类型的Hibernate映射类型:
Java类型 | Hibernate映射类型 | 标准SQL类型 | 描述 |
java.util.Date/java.sql.Date | date | DATE | 日期,yyyy-mm-dd |
java.util.Date/java.sql.TIme | time | TIME | 时间,hh:mm:ss |
java.util.Date/java.sql.Timestamp | timestamp | TIMESTAMP | 时间戳,yyyymmddhhmmss |
java.util.Calendar | calendar | TIMESTAMP | 同上 |
java.util.Calendar | calendar_date | DATE | 日期,yyyy-mm-dd |
Java 大对象类型的Hibernate映射类型:
Java类型 | Hibernate映射类型 | 标准SQL类型 | MySql类型 | Oracle类型 |
byte[] | binary | VARBINARY/BLOB | BLOB | BLOB |
String | text | CLOB | TEXT | CLOB |
serializable | 实现serializable接口的一个java类 | VARBINARY/BLOB | BLOB | BLOB |
java.sql.Clob | clob | CLOB | TEXT | CLOB |
java.sql.Blob | blob | BLOB | BLOB | BLOB |
用个图书对象举例:
Book.java:
package com.tao.entity; import java.sql.Blob; import java.util.Date; public class Book { private int id; private String bookName; //图书名称 private float price; //图书价格 private boolean speciaPrice; //是否特价 private Date publishDate; //发布日期 private String author; //作者 private String introduction; //简介 private Blob bookPic; //图片封面 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public boolean isSpeciaPrice() { return speciaPrice; } public void setSpeciaPrice(boolean speciaPrice) { this.speciaPrice = speciaPrice; } public Date getPublishDate() { return publishDate; } public void setPublishDate(Date publishDate) { this.publishDate = publishDate; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getIntroduction() { return introduction; } public void setIntroduction(String introduction) { this.introduction = introduction; } public Blob getBookPic() { return bookPic; } public void setBookPic(Blob bookPic) { this.bookPic = bookPic; } }
Book.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.entity"> <class name="Book" table="t_book"> <id name="id" column="book_id"> <generator class="native"></generator> </id> <!-- 字符串类型 --> <property name="bookName" column="book_name" length="40"></property> <!-- 浮点类型 --> <property name="price" column="book_price" type="float"></property> <!-- 布尔类型 --> <property name="speciaPrice" column="book_speciaPrice" type="boolean"></property> <!-- 日期类型 --> <property name="publishDate" column="book_publishDate" type="date"></property> <!-- 字符串类型 --> <property name="author" column="book_author" length="20"></property> <!-- 文本类型 --> <property name="introduction" column="book_introduction" type="text"></property> <!-- 二进制类ixng --> <property name="bookPic" column="book_bookPic" type="blob"></property> </class> </hibernate-mapping>
TesstBook.java:
@Test public void test() throws Exception { Book book = new Book(); book.setBookName("java编程思想"); book.setPrice(100); book.setSpeciaPrice(true); book.setPublishDate(new Date()); book.setAuthor("埃克尔"); book.setIntroduction("简介......."); LobHelper lobHelper = session.getLobHelper(); InputStream inputStream = new FileInputStream("E://java编程思想.jpg"); Blob blob = lobHelper.createBlob(inputStream, inputStream.available()); book.setBookPic(blob); session.save(book); }
插入成功,看数据库生成的表:
关于当前日期入库:
1.如果数据库是Date 类型:
java中:直接 setDate(new Date()) 即可.数据库只存储时间
2.如果数据库字段是 dateTime类型:
Date date = new Date();
Timestamp timeStamp = new Timestamp(date.getTime()); 即可
集合类型的映射:
1.Set 无序 元素不可重复::
Worker.java:
package com.tao.entity; import java.util.Set; public class Worker { private long id; private String name; private Set<String> images; public Set<String> getImages() { return images; } public void setImages(Set<String> images) { this.images = images; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Worker.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.entity"> <class name="Worker" table="t_worker"> <id name="id" column="worker_id"> <generator class="native"></generator> </id> <property name="name" column="worker_name" length="30"></property> <set name="images" table="t_image"> <!-- column 为 t_image 表的外键字段 关联t_worker主键 --> <key column="workerId"></key> <element column="image_name" type="string"></element> </set> </class> </hibernate-mapping>
TestWorker:
@Test public void testSetSave() throws Exception { Set<String> imageSet = new HashSet<String>(); imageSet.add("生活照.png"); imageSet.add("工作照.png"); imageSet.add("自拍照.png"); imageSet.add("工作照.png"); imageSet.add("生活照.png"); Worker worker = new Worker(); worker.setImages(imageSet); worker.setName("一号工人"); session.save(worker); }
看数据库生成的表结构:
且有一个外键维护:
我们试试查询结果:
@Test public void testSetFetch() throws Exception { Worker worker = (Worker) session.get(Worker.class, Long.valueOf(1)); Iterator<String> iterator = worker.getImages().iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }
Hibernate: select worker0_.worker_id as worker_i1_5_0_, worker0_.worker_name as worker_n2_5_0_ from t_worker worker0_ where worker0_.worker_id=? Hibernate: select images0_.workerId as workerId1_5_0_, images0_.image_name as image_na2_2_0_ from t_image images0_ where images0_.workerId=? 自拍照.png 生活照.png 工作照.png
只有三条,无序 而且之前插入没有重复。
2,List 有序 元素可重复
Worker2.java:
package com.tao.entity; import java.util.List; /** * List映射类型举例 * @author TaoGG * */ public class Worker2 { private long id; private String name; private List<String> images; public List<String> getImages() { return images; } public void setImages(List<String> images) { this.images = images; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.entity"> <class name="Worker2" table="t_worker2"> <id name="id" column="worker_id"> <generator class="native"></generator> </id> <property name="name" column="worker_name" length="30"></property> <list name="images" table="t_image2"> <key column="workerId"></key> <list-index column="imageIndex"></list-index> <element column="image_name" type="string"></element> </list> </class> </hibernate-mapping>
Test:
@Test public void testListSave() throws Exception { List<String> imageList = new ArrayList<String>(); imageList.add("生活照.png"); imageList.add("工作照.png"); imageList.add("自拍照.png"); imageList.add("工作照.png"); imageList.add("生活照.png"); Worker2 worker = new Worker2(); worker.setName("一号工人"); worker.setImages(imageList); session.save(worker); }
@Test public void testSetFetch() throws Exception { Worker2 worker2 = (Worker2) session.get(Worker2.class, Long.valueOf(1)); List<String> imagesList = worker2.getImages(); for(String s:imagesList){ System.out.println(s); } }
看表结构:
多了个索引字段 保证有序,且可重复。
3,Bag 无序 元素可重复:
Worker3.java:(Bag采用List使用)
package com.tao.entity; import java.util.List; /** * List映射类型举例 * @author TaoGG * */ public class Worker3 { private long id; private String name; private List<String> images; public List<String> getImages() { return images; } public void setImages(List<String> images) { this.images = images; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Worker3.hbm.xml:
Bag有自己的主键和生成策略,没有索引:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.entity"> <class name="Worker3" table="t_worker3"> <id name="id" column="worker_id"> <generator class="native"></generator> </id> <property name="name" column="worker_name" length="30"></property> <idbag name="images" table="t_image3"> <!-- 增加一个主键 --> <collection-id type="long" column="image_id"> <generator class="increment"></generator> </collection-id> <key column="workerId"></key> <element column="image_name" type="string"></element> </idbag> </class> </hibernate-mapping>
Test:
@Test public void testBagSave() throws Exception { List<String> imList = new ArrayList<String>(); imList.add("生活照.png"); imList.add("工作照.png"); imList.add("自拍照.png"); imList.add("生活照.png"); Worker3 worker3 = new Worker3(); worker3.setImages(imList);; session.save(worker3); }
数据库表:可重复 生成主键 以及外键和t_worker3表关联。
遍历查询:
@Test public void testSetFetch() throws Exception { Worker3 worker3 = (Worker3) session.get(Worker3.class, Long.valueOf(1)); List<String> images = worker3.getImages(); for(String s:images){ System.out.println(s); } }
结果:可重复 无序
Hibernate: select worker3x0_.worker_id as worker_i1_9_0_, worker3x0_.worker_name as worker_n2_9_0_ from t_worker3 worker3x0_ where worker3x0_.worker_id=? Hibernate: select images0_.workerId as workerId1_9_0_, images0_.image_name as image_na2_4_0_, images0_.image_id as image_id3_0_ from t_image3 images0_ where images0_.workerId=? 生活照.png 工作照.png 自拍照.png 生活照.png
4,Map 键值对:
Work4.java:
package com.tao.entity; import java.util.Map; /** * List映射类型举例 * @author TaoGG * */ public class Worker4 { private long id; private String name; private Map<String,String> images; public Map<String, String> getImages() { return images; } public void setImages(Map<String, String> images) { this.images = images; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Work4.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.entity"> <class name="Worker4" table="t_worker4"> <id name="id" column="worker_id"> <generator class="native"></generator> </id> <property name="name" column="worker_name" length="30"></property> <map name="images" table="t_image4"> <!-- 定义外键 --> <key column="workId"></key> <!-- 定义map的key --> <map-key column="image_key" type="string"></map-key> <element column="image_name" type="string"></element> </map> </class> </hibernate-mapping>
Test:
@Test public void testBagSave() throws Exception { List<String> imList = new ArrayList<String>(); Map<String, String> map = new HashMap<String, String>(); map.put("i1", "生活照.png"); map.put("i2", "工作照.png"); map.put("i3", "自拍照.png"); map.put("i4", "生活照.png"); Worker4 worker4 = new Worker4(); worker4.setImages(map); session.save(worker4); }
数据库表:
复合主键
@Test public void testSetFetch() throws Exception { Worker4 worker4 = (Worker4) session.get(Worker4.class, Long.valueOf(1)); Map<String, String> images = worker4.getImages(); Iterator<Entry<String, String>> iterator = images.entrySet().iterator(); while(iterator.hasNext()){ Entry<String, String> next = iterator.next(); System.out.println(next.getKey()+"---"+next.getValue()); } }
结果:
Hibernate: select worker4x0_.worker_id as worker_i1_11_0_, worker4x0_.worker_name as worker_n2_11_0_ from t_worker4 worker4x0_ where worker4x0_.worker_id=? Hibernate: select images0_.workId as workId1_11_0_, images0_.image_name as image_na2_5_0_, images0_.image_key as image_ke3_0_ from t_image4 images0_ where images0_.workId=? i1---生活照.png i2---工作照.png i3---自拍照.png i4---生活照.png