Hibernate入門教程
阿新 • • 發佈:2018-06-14
wid gre pre 入門 arr 無需 框架 lib 連接池
Hibernate
隨心所欲的使用面向對象思想操縱數據庫.
Table of contents
- 介紹
- 搭建開發環境
- 半sql半面向對象寫法
- 完全的sql寫法
- 完全的面向對象寫法
Hibernate
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫,從而無需顧及數據庫的實現究竟是SQLServer還是Mysql還是Oracle
搭建環境
搭建在一般工程中
- jar下載
- 配置文件
jar下載
官網Hibernate進入後看到hibenate ORM,點擊more,左側邊欄選擇releases中的一個版本,頁面最下方,選擇download下載即可
官方jar包:lib文件:requeired文件裏的所有jar拷貝到自己的新建工程中去,然後在加上連接數據庫相關的包,mysql-connector
配置文件
Hibernate.cfg.xml
放置在src下,需要修改url,username和password
<?xmlversion='1.0'encoding='utf-8'?> <!DOCTYPEhibernate-configurationPUBLIC "-//Hibernate/HibernateConfigurationDTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <propertyname="connection.url">jdbc:mysql://localhost:3306/mycms</property> <propertyname="connection.driver_class">com.mysql.jdbc.Driver</property> <propertyname="connection.username">root</property> <propertyname="connection.password">123456</property> <mappingresource="com/selton/Node.hbm.xml"></mapping> </session-factory> </hibernate-configuration> <mappingresource="com/selton/Node.hbm.xml"></mapping>
Node.hbm.xml
映射到具體的pojo,一個pojo配置一個映射的xml
名字和數據庫的名字即使一樣,也需要寫上property的映射
<?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.selton"> <class name="com.selton.Node" table="tree"> <id name="id" column="id"> <generator class="native"></generator> <!--可以實現自動增長,也就是將實體類存儲到數據庫的時候,少set一個主鍵 比較疑惑,反正有沒有這句話,數據庫那兒都需要自動增長--> </id> <property name="nodeId" column="nodeId"></property> <property name="pid" column="pid"></property> <property name="type" column="type"></property> <property name="url" column="url"></property> <property name="icon" column="icon"></property> <property name="description" column="description"></property> <property name="level" column="level"></property> <property name="name" column="name"></property> </class> </hibernate-mapping>
pojo的主鍵屬性名稱對應到數據庫實體的主鍵名稱寫在id中
,其他的寫在property中
半sql半面向對象寫法
- 單個數據(對象)存儲到數據庫
- 查詢單個對象
- 更新單個對象
- 刪除對象
- 查詢整個表
- 查詢某個對象的某個屬性
- 查詢指定行數據
- 查詢指定數據傳回一個實體
- 分組聚合
- 排序
- limit
- 使用參數
- in
- 寫在配置文件裏
在一個入口方法或者測試類方法中,加入
//構建上下文換肩加配置連接池,開啟事務
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//這裏填寫測試代碼
//提交事務並關閉各種流
transaction.commit();
session.close();
sessionFactory.close();
以下的測試代碼,分別放在上面代碼的`這裏填寫測試代碼
處
單個數據存儲到數據庫
Node node = new Node();;
node.setNodeId("testNodeId1");
node.setPid("testPid1");
node.setType((byte)1);
node.setLevel((short)1);
node.setName("testName1");
session.save(node);
查詢單個對象
Node node=(Node)session.get(Node.class,1);
System.out.println(node);
//Node.class後面的1是數據庫中的主鍵值
更新單個對象
Node node=(Node)session.get(Node.class,10);
node.setName("updateName");
session.update(node);
刪除對象
Node node = (Node) session.get(Node.class, 10);
session.delete(node);
查詢整個表
這裏需要註意,如果你的pojo叫 myuser,而數據庫中對應的表叫user,所有使用createQuery的地方,涉及到了表,就該填myuser
Query query = session.createQuery("FROM Node");
List list = query.list();
System.out.println("list = " + list);
查詢某個對象的某個屬性
Query query = session.createQuery("SELECT nodeId FROM Node");
List list = query.list();
System.out.println("list = " + list);
查詢指定行數據
Query query = session.createQuery("FROM Node WHERE type=?");
query.setParameter(0,10);
List list = query.list();
System.out.println("list = " + list);
查詢指定數據傳回一個實體
//需要pojo有相應的構造器
Query query = session.createQuery("SELECT new Node(id,name,nodeId) FROM Node");
List<Node> list = query.list();
System.out.println("list = " + list);
分組聚合
Query query = session.createQuery("SELECT type,SUM(id) FROM Node GROUP BY type");
List list = query.list();
for (Object o : list) {
Object[] result = (Object[]) o;
System.out.println(Arrays.toString(result));
}
排序
Query query = session.createQuery("FROM Node ORDER BY id DESC");
List list = query.list();
System.out.println("list = " + list);
limit
Query query = session.createQuery("FROM Node ORDER BY id DESC");
query.setFirstResult(2);
query.setMaxResults(3);
List list = query.list();
System.out.println("list = " + list);
使用參數
String colName = "id";
String sql = "FROM Node WHERE " + colName + "=?";
Query query = session.createQuery(sql);
query.setParameter(0,6);
Node node = (Node) query.uniqueResult();
System.out.println("node = " + node);
或者這種
Query query = session.createQuery("FROM Node WHERE id:id");
query.setParameter("id",7);
List list = query.list();
System.out.println("list = " + list);
in
Query query = session.createQuery("FROM Node WHERE id IN(:ids)");
query.setParameterList("ids",new Object[]{4,6,7});
List list = query.list();
System.out.println("list = " + list);
//In 的效率很低
寫在配置文件裏
User.hbm.xml
<hibernate-mapping>
...
<query name="getUserByAge">
FROM Node WHERE id between ? AND ?
</query>
...
</hibernate-mapping>
代碼部分
Query query = session.getNamedQuery("getUserByAge");
query.setParameter(0,6);
query.setParameter(1,8);
List list = query.list();
System.out.println("list = " + list);
完全的sql寫法
仿照第一種半sql寫法,格式變化就可以
1.原生sql寫法
SQLQuery query = session.createSQLQuery("SELECT * FROM tree");
query.addEntity(Node.class);
List list = query.list();
System.out.println("list = " + list);
完全的面向對象寫法
仿照第一種半sql寫法,格式變化就可以
Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.eq("id",6));
List list = criteria.list();
System.out.println("list = " + list);
相當於查出來了所有的放在criteria裏面
- 不等於
- 排序
- 添加分頁
- 分組聚合
不等於
Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.ne("id",1));
List list = criteria.list();
System.out.println("list = " + list);
排序
Criteria criteria = session.createCriteria(Node.class);
criteria.addOrder(Order.desc("id"));
List list = criteria.list();
System.out.println("list = " + list);
添加分頁
Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.ne("id",1));
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List list = criteria.list();
System.out.println("list = " + list);
分組聚合
Criteria criteria = session.createCriteria(Node.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.sum("id"));
projectionList.add(Projections.groupProperty("type"));
criteria.setProjection(projectionList);
List list = criteria.list();
for (Object o : list) {
Object[] result = (Object[]) o;
System.out.println(Arrays.toString(result));
}
Hibernate入門教程