Hibernate框架簡介④
Hibernate的關聯映射:
多對一關聯映射:
第一步: 創建實體模型
Emp類:
package com.rl.hiber.model;
import java.util.Date;
public class Emp {
private Integer empNo;
private String ename;
private Date birthday;
private Integer gender;
private String address;
/**
* 引入一的一端作為屬性, 建立多對一的關系
*/
private Team team;
public Integer getEmpNo() {
return empNo;
}
public void setEmpNo(Integer empNo) {
this.empNo = empNo;
}
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Team類:
package com.rl.hiber.model;
public class Team {
private Integer tId;
private String tName;
private String loc;
public Integer gettId() {
return tId;
}
public void settId(Integer tId) {
this.tId = tId;
}
public String gettName() {
return tName;
}
public void settName(String tName) {
this.tName = tName;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
第二步: 配置實體映射文件
Emp.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.rl.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
<!-- 指定多對一的關聯映射
name: 多的一端中定義的一的一端的屬性, 也就是team
column: 多的一端中的外鍵, 也就是一的一端中的主鍵, t_id
-->
<many-to-one name="team" column="t_id">
</many-to-one>
</class>
</hibernate-mapping>
Team.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.rl.hiber.model">
<class name="Team" table="t_team">
<id name="tId" column="t_id">
<generator class="native"></generator>
</id>
<property name="tName" column="t_name"></property>
<property name="loc"></property>
</class>
</hibernate-mapping>
hibernate.cfg.xml:
生成建表腳本:
數據庫建表結果:
第三步: 測試多對一關聯映射
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Team;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void test1() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Team team = new Team();
team.settName("公牛隊");
team.setLoc("芝加哥");
//保存球隊(要先保存球隊, 否則是瞬時對象)
session.save(team);
Emp emp1 = new Emp();
Emp emp2 = new Emp();
emp1.setEname("喬丹");
emp1.setAddress("芝加哥");
emp1.setGender(1);
emp1.setBirthday(new Date());
//設置隊員與球隊之間的關系
emp1.setTeam(team);
//保存隊員
session.save(emp1);
emp2.setAddress("芝加哥");
emp2.setBirthday(new Date());
emp2.setEname("菲爾");
emp2.setGender(1);
emp2.setTeam(team);
session.save(emp2);
//提交事務
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
hibernate發出sql語句:
數據庫結果:
下面講解一個知識點:
級聯: 在"多的一端"設置cascade屬性
直接貼代碼吧:
<?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.rl.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
<!-- 指定多對一的關聯映射
name: 多的一端中定義的一的一端的屬性, 也就是team
column: 多的一端中的外鍵, 也就是一的一端中的主鍵, t_id
cascade: delete(刪除多的一端會直接上一的一端也刪除, 即 刪除隊員也會把球隊給刪掉), 在多的一端不建議使用
save-update(保存或者更新多的一端時, 一的一端也會自動先做保存或更新, 即 不需要先保存球隊), 建議使用
all:包含以上兩種
none: 沒有級聯(默認狀態)
-->
<many-to-one name="team" column="t_id" cascade="save-update">
</many-to-one>
</class>
</hibernate-mapping>
測試級聯狀態為save-update代碼:
package com.rl.hiber.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Team;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
/**
* 將級聯狀態設置為save-update時不需要先保存球隊(一的一端)
*/
@Test
public void test2() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Team team = new Team();
team.settName("小牛隊");
team.setLoc("達拉斯");
Emp emp1 = new Emp();
Emp emp2 = new Emp();
emp1.setEname("庫班");
emp1.setAddress("達拉斯");
emp1.setGender(1);
emp1.setBirthday(new Date());
//設置隊員與球隊之間的關系
emp1.setTeam(team);
//保存隊員
session.save(emp1);
emp2.setAddress("達拉斯");
emp2.setBirthday(new Date());
emp2.setEname("諾維斯基");
emp2.setGender(1);
emp2.setTeam(team);
session.save(emp2);
//提交事務
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
hibernate發出sql語句:
數據庫結果:
一對一單端關聯映射:
映射文件:
<?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.rl.hiber.model">
<class name="IDCard" table="t_id_card">
<!--
指定idcard的主鍵名稱, 建議跟emp端的主鍵名稱相同
-->
<id name="cardId" column="emp_no">
<!--
使用外鍵的方式來生成主鍵
-->
<generator class="foreign">
<!--
指定idcard這一端的emp屬性
-->
<param name="property">emp</param>
</generator>
</id>
<property name="cardNo" column="card_no"></property>
<!-- 一對一關聯映射
name: 指定idcard這一端中定義的另一個一的一端的屬性(即emp)
constrained: true(即建表外鍵約束), 當要刪除隊員信息時必須先刪除idcard
-->
<one-to-one name="emp" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.IDCard;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testAdd() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Emp emp = new Emp();
emp.setAddress("廣州");
emp.setBirthday(new Date());
emp.setEname("張三");
emp.setGender(1);
IDCard card = new IDCard();
card.setCardNo("111");
card.setEmp(emp);
//此時并沒有設置級聯, 但hibernate會自動在保存idcard時先保存emp
//因為如果不保存emp則無法返回主鍵, 它們倆是共用主鍵的以保證一對一關系
session.save(card);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
數據庫結果:
一對一雙向映射
Emp表的配置文件:
<?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.rl.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
<!-- 指定一對一關聯映射關系 -->
<one-to-one name="card"></one-to-one>
</class>
</hibernate-mapping>
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.IDCard;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testAdd() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Emp emp = new Emp();
emp.setAddress("北京");
emp.setBirthday(new Date());
emp.setEname("李四");
emp.setGender(1);
IDCard card = new IDCard();
card.setCardNo("123");
emp.setCard(card);
card.setEmp(emp);
session.save(emp);
session.save(card);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
數據庫結果同上的一對一單端映射
一對多單向關聯映射:
在多對一的基礎上修改:
Emp配置文件:
<?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.rl.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
</class>
</hibernate-mapping>
Team配置文件:
<?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.rl.hiber.model">
<class name="Team" table="t_team">
<id name="tId" column="t_id">
<generator class="native"></generator>
</id>
<property name="tName" column="t_name"></property>
<property name="loc"></property>
<!-- 指定一對多關聯映射
name: 在一的一端指定一個多的一端的集合屬性emps
key:->column: 多的一端里面有一個一的一端的外鍵t_id
one-to-many:->class: 多的一端所在的位置(默認已經指定了com.rl.hiber.model)
-->
<set name="emps">
<key column="t_id"></key>
<one-to-many class="Emp"/>
</set>
</class>
</hibernate-mapping>
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Team;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testAdd() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Emp emp = new Emp();
emp.setAddress("芝加哥");
emp.setBirthday(new Date());
emp.setEname("喬丹");
emp.setGender(1);
//保存隊員
session.save(emp);
Emp emp1 = new Emp();
emp1.setAddress("芝加哥");
emp1.setBirthday(new Date());
emp1.setEname("菲爾");
emp1.setGender(1);
//
session.save(emp1);
Set<Emp> emps = new HashSet<Emp>();
emps.add(emp);
emps.add(emp1);
Team team = new Team();
team.setLoc("芝加哥");
team.settName("公牛隊");
//指定一對多的關系
team.setEmps(emps);
//保存球隊
session.save(team);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
數據庫結果:
設置級聯:
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Team;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testAdd() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Emp emp = new Emp();
emp.setAddress("達拉斯");
emp.setBirthday(new Date());
emp.setEname("庫班");
emp.setGender(1);
Emp emp1 = new Emp();
emp1.setAddress("達拉斯");
emp1.setBirthday(new Date());
emp1.setEname("諾維斯基");
emp1.setGender(1);
Set<Emp> emps = new HashSet<Emp>();
emps.add(emp);
emps.add(emp1);
Team team = new Team();
team.setLoc("達拉斯");
team.settName("小牛隊");
team.setEmps(emps);
//保存球隊時就會自動保存隊員
session.save(team);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
數據庫結果:
一對多雙向映射:
一對多是有缺陷的, 保存的時候如果多的一端的外鍵是非空字段, 那么保存就會出錯.
跟多對一類似, 有點小區別:
需要在一對多的基礎上再在多的一端指定多對一的關系, 就不貼代碼了
Emp.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.rl.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
<!-- 指定多對一的關聯映射
name: 多的一端中定義的一的一端的屬性, 也就是team
column: 多的一端中的外鍵, 也就是一的一端中的主鍵, t_id
這個外鍵必須跟team.hbm.xml指定的外鍵一樣, 如果兩個column的名稱不一樣則相當于有兩個外鍵就沖突了
-->
<many-to-one name="team" column="t_id" />
</class>
</hibernate-mapping>
Team.hbm.xml同上
測試代碼同多對一.
真正的解決非空字段的方法, 如果真的有需求需要在一的一端進行保存的話, 可以在Team.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.rl.hiber.model">
<class name="Team" table="t_team">
<id name="tId" column="t_id">
<generator class="native"></generator>
</id>
<property name="tName" column="t_name"></property>
<property name="loc"></property>
<!-- 指定一對多關聯映射
name: 在一的一端指定一個多的一端的集合屬性emps
key:->column: 多的一端里面有一個一的一端的外鍵t_id
one-to-many:->class: 多的一端所在的位置(默認已經指定了com.rl.hiber.model)
inverser: 設置反轉, 表面上用一的一端進行保存, 實際上反轉給多的一端進行保存
-->
<set name="emps" cascade="save-update" inverse="true">
<key column="t_id"></key>
<one-to-many class="Emp"/>
</set>
</class>
</hibernate-mapping>
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Team;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testAdd2() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Team team = new Team();
team.setLoc("達拉斯");
team.settName("小牛隊");
Emp emp = new Emp();
emp.setAddress("達拉斯");
emp.setBirthday(new Date());
emp.setEname("庫班");
emp.setGender(1);
//利用隊員指定多對一
emp.setTeam(team);
Emp emp1 = new Emp();
emp1.setAddress("達拉斯");
emp1.setBirthday(new Date());
emp1.setEname("諾維斯基");
emp1.setGender(1);
emp1.setTeam(team);
Set<Emp> emps = new HashSet<Emp>();
emps.add(emp);
emps.add(emp1);
team.setEmps(emps);
//只保存球隊, 實際上會反轉給多的一端進行保存
session.save(team);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
結果相同
單端多對多關聯映射:
Emp類需要加上另一端的屬性, 并提供set跟get方法, 就不貼代碼了
配置文件:
Emp.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.rl.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
<!-- 指定多對多關系
table: 中間表
-->
<set name="roles" table="emp_role">
<!-- emp端的外鍵, 也就是emp_no主鍵 -->
<key column="emp_no"></key>
<!--
class: 另一端的路徑
column: 另一端的外鍵, 也就是role_id主鍵
-->
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.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.rl.hiber.model">
<class name="Role" table="t_role">
<id name="roleId" column="role_id">
<generator class="native"></generator>
</id>
<property name="roleName" column="role_name"></property>
<property name="roleDesc" column="role_desc"></property>
</class>
</hibernate-mapping>
生成數據庫表:
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Role;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testAdd() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Emp emp = new Emp();
emp.setAddress("上海");
emp.setBirthday(new Date());
emp.setEname("田七");
emp.setGender(1);
Role role1 = new Role();
role1.setRoleDesc("講課");
role1.setRoleName("老師");
session.save(role1);
Role role2 = new Role();
role2.setRoleDesc("管理");
role2.setRoleName("總監");
session.save(role2);
Set<Role> roles = new HashSet<Role>();
roles.add(role1);
roles.add(role2);
emp.setRoles(roles);
session.save(emp);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
數據庫結果:
同樣也可以設置級聯, 就不舉例了.
多對多的雙向關聯:
Role類需要加上另一端的屬性, 并提供set跟get方法
在原來的基礎上修改Role.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.rl.hiber.model">
<class name="Role" table="t_role">
<id name="roleId" column="role_id">
<generator class="native"></generator>
</id>
<property name="roleName" column="role_name"></property>
<property name="roleDesc" column="role_desc"></property>
<!-- 指定多對多關系(需中間表) -->
<set name="emps" table="emp_role" cascade="save-update">
<!-- key:->column: role端的外鍵, role_id -->
<key column="role_id"></key>
<!-- class: 另一端的路徑 column: 另一端的外鍵emp_no -->
<many-to-many class="Emp" column="emp_no"></many-to-many>
</set>
</class>
</hibernate-mapping>
測試代碼:
package com.rl.hiber.test;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.rl.hiber.model.Emp;
import com.rl.hiber.model.Role;
import com.rl.hiber.utils.HibernateUtil;
public class TestHibernate {
/**
* 采用級聯的方式
*/
@Test
public void testAdd2() {
Session session = HibernateUtil.getSessoion();
Transaction tx = session.beginTransaction();
try {
Emp emp = new Emp();
emp.setAddress("上海");
emp.setBirthday(new Date());
emp.setEname("田七");
emp.setGender(1);
Emp emp2 = new Emp();
emp2.setAddress("天津");
emp2.setBirthday(new Date());
emp2.setEname("周八");
emp2.setGender(2);
Set<Emp> emps = new HashSet<Emp>();
emps.add(emp);
emps.add(emp2);
Role role1 = new Role();
role1.setRoleDesc("講課");
role1.setRoleName("老師");
role1.setEmps(emps);
session.save(role1);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtil.closeResource(session);
}
}
}
數據庫結果:
智能推薦
Hibernate框架
Hibernate是一個開放源代碼的對象關系映射框架(ORM),它對JDBC進行了非常輕量級的對象封裝,簡化了java應用程序與數據庫交互的開發。簡化了數據創建,數據處理和數據訪問。 ①面向對象操作:將對數據庫的操作轉換為對Java對象的操作。 ②數據庫獨立查詢:通過配置對應的數據庫“方言”,就可以根據不同類型的數據庫生成適合的SQL語句。 ③非侵入式:Hibernate不...
Hibernate框架
Hibernate框架 1、簡介 Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在S...
MyBatis簡介和Hibernate簡介
MyBatis簡介 MyBatis的前身是Apache的開源項目iBatis。iBatis一次來源于internet,和abatis的組合,是一個基于Java持久層架構。2010年這個項目由Apache software foundation遷移到Google code,并更名為MyBatis。2013年11月,MyBatis遷移到Github上,目前由Github提供維護。 MyBatis的優勢...
Hibernate配置和簡介
Hibernate構架 Hibernate 什么是hibernate? 在了解hibernate之前我們先來了解一下什么是ORM: ORM是怎么工作的? hibernate概念: hibernate的優點: Hibernate環境配置 在eclipse上配置Hibernate 在IDEA上配置Hibernate Hibernate配置步驟: Hibernate的核心接口 1.Configurati...
Hibernate 框架學習——Hibernate注解
前言 在Hibernate中我們一般都會使用注解,這樣可以幫助我們大大簡化hbm映射文件的配置。下面我就來為大家詳細介紹。 PO類注解配置 首先肯定是搭建好Hibernate的開發環境啦,我在此也不過多贅述,讀者自行實踐。接著在src目錄下創建一個cn.itheima.domain包,并在該包下創建一個Book實體類,由于Book實體類中寫有注解配置,所以就不用編寫那個映射配置文件啦! 下面我就來...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...