对象关系模型框架 (OSportageM),澳门真人网上娱乐网址对象关系模型框架 (OENVISIONM)

一 、Hibernate – 核心接口

① 、Hibernate – 大旨接口

它是  JBoss Community team (社区组织) 开发的。Hibernate
是一个开源的,对象关联模型框架 (O路虎极光M),它对JDBC举行了轻量的包裹,
使java程序员能够面对象的艺术开始展览数据库操作。Hibernate
一共有五个着力接口   

它是  JBoss Community team (社区公司) 开发的。Hibernate
是三个开源的,对象关系模型框架 (O讴歌MDXM),它对JDBC进行了轻量的包裹,
使java程序员能够面对象的章程开始展览数据库操作。Hibernate
一共有五个宗旨接口   

1.Session 

1.Session 

用于连接数据库,也正是 jdbc 中的 Connection (它和 servlet 中 的Session 
一点涉及也从不),负责实施对象的CRUD操作 ,它是非线程安全的。

用来连接数据库,也就是 jdbc 中的 Connection (它和 servlet 中 的Session 
一点事关也绝非),负责履行对象的CRUD操作 ,它是非线程安全的。

2.SessionFactory //用于得到 Session ,约等于jdbc中 DriverManager

2.SessionFactory //用于获得 Session ,相当于jdbc中 DriverManager

3.Transaction //用于事务管理

3.Transaction //用来事务管理

4.Query 和 Criteria //首要用于查询数据

4.Query 和 Criteria //主要用于查询数据

5.Configuration //用于获得布置消息

5.Configuration //用于得到陈设新闻

二 、Hibernate – 类库简介

二 、Hibernate – 类库简介

Hibernate3.jar

Hibernate3.jar

antlr-2.7.6.jar(必需):Hibernate使用ANTL讴歌RDX来发出查询分析器,那么些类库在运维环境下时也是必需的。

antlr-2.7.6.jar(必需):Hibernate使用ANTL凯雷德来发出查询分析器,那个类库在运转环境下时也是必需的。

dom4j(必需):Hibernate使用dom4j解析XML配置文件和XML映射元文件。

dom4j(必需):Hibernate使用dom4j解析XML配置文件和XML映射元文件。

commons-collections-3.1,康芒斯Logging(必需):Hibernat使用ApacheJakartaCommons项目提供的五个工具类库。

commons-collections-3.1,康芒斯Logging(必需):Hibernat使用ApacheJakartaCommons项目提供的四个工具类库。

dom4j-1.6.1(可选):Hibernate使用CommonsLoggingAPI,它也足以依次使用Log4j作为底层实施log的编写制定。

dom4j-1.6.1(可选):Hibernate使用CommonsLoggingAPI,它也得以依次使用Log4j作为底层实施log的体制。

假设前后文类目录中存在Log4j库,则CommonsLogging使用Log4j和并它在左右文类路径中追寻的log4j.properties文件。

万一前后文类目录中存在Log4j库,则CommonsLogging使用Log4j和并它在上下文类路径中摸索的log4j.properties文件。

您能够运用在Hibernate发行李包裹中包蕴中的这几个示例Log4j的布局文件。那样,把log4j.jar和它的布署文件(位于src/目录中)拷贝到你的光景文类路径下,就能够在后台看到底程序怎样运作的。

你能够动用在Hibernate发行李包裹中涵盖中的那1个示例Log4j的安插文件。那样,把log4j.jar和它的布局文件(位于src/目录中)拷贝到你的前后文类路径下,就能够在后台看到底程序怎样运行的。

javassist-3.12.0.GA 二个开源的分析、编辑和开创Java字节码的类库

javassist-3.12.0.GA 三个开源的解析、编辑和开创Java字节码的类库

slf4j-api-1.6.1
为java提供的总结日志Facade。Facade:门面,更底层一点说正是接口

slf4j-api-1.6.1
为java提供的简要日志Facade。Facade:门面,更底层一点说正是接口

jta-1.1.jar  Java事务API( Java Transaction API )

jta-1.1.jar  Java事务API( Java Transaction API )

此外文件是还是不是必需的:请察看Hibernate发行李包裹中的lib/README.txt文件,那是二个Hibernate发行李包裹中附带的第1方类库的列表,他们延续保持最新的。你能够在那里找到全数须要或然可选的类库(注意:其中的
“buildtimerequired”
指的是编写翻译Hibernate时所须要而非编译你本人的次第所必备的类库)。

别的文件是还是不是少不了的:请察看Hibernate发行李包裹中的lib/README.txt文件,那是三个Hibernate发行李包裹中附带的第壹方类库的列表,他们总是保持最新的。你能够在那边找到全数要求可能可选的类库(注意:个中的
“buildtimerequired”
指的是编译Hibernate时所急需而非编写翻译你协调的先后所要求的类库)。

三、第一个Hibernate 程序

三、第一个Hibernate 程序

1) 导包

1) 导包

2) 配置文件

2) 配置文件

1)Hibernate 的主配置文件

1)Hibernate 的主配置文件

 <?xml version='1.0' encoding='UTF-8'?>
       <!DOCTYPE Hibernate-configuration PUBLIC
                 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                 "http://Hibernate.sourceforge.net/Hibernate-configuration-3.0.dtd">

       <Hibernate-configuration>

           <session-factory>
                    <property name="show_sql">true</property>  //把生成的sql显示出来
                    <property name="dialect">org.Hibernate.dialect.MySQLDialect</property>   //指定数据库用的方言
                    <property name="connection.url">jdbc:mysql://localhost:3306/shop</property>
                    <property name="connection.username">root</property>
                    <property name="connection.password">root</property>
                    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
                    <property name="myeclipse.connection.profile">mysql_cat</property>

                    <mapping resource="cat/beans/AdminInfo.hbm.xml" /> //引入一个映射文件

           </session-factory>

</Hibernate-configuration>
 <?xml version='1.0' encoding='UTF-8'?>
       <!DOCTYPE Hibernate-configuration PUBLIC
                 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                 "http://Hibernate.sourceforge.net/Hibernate-configuration-3.0.dtd">

       <Hibernate-configuration>

           <session-factory>
                    <property name="show_sql">true</property>  //把生成的sql显示出来
                    <property name="dialect">org.Hibernate.dialect.MySQLDialect</property>   //指定数据库用的方言
                    <property name="connection.url">jdbc:mysql://localhost:3306/shop</property>
                    <property name="connection.username">root</property>
                    <property name="connection.password">root</property>
                    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
                    <property name="myeclipse.connection.profile">mysql_cat</property>

                    <mapping resource="cat/beans/AdminInfo.hbm.xml" /> //引入一个映射文件

           </session-factory>

</Hibernate-configuration>

能够搜寻 Hibernate-3.6.10.Final\project\etc\Hibernate.properties 
这么些文件,找到相应的布署项和内容。

能够查找 Hibernate-3.6.10.Final\project\etc\Hibernate.properties 
那几个文件,找到呼应的陈设项和剧情。

2) 实体类

2) 实体类

public class AdminInfo {
                    private int id;
                    private String adminName;
                    private String password;
                    private String note;
                    ... get   set 方法
                }
public class AdminInfo {
                    private int id;
                    private String adminName;
                    private String password;
                    private String note;
                    ... get   set 方法
                }

3) 生成实体类的炫耀文件  AdminInfo.hbm.xml

3) 生成实体类的映射文件  AdminInfo.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 package="cat.beans">
                <class name="AdminInfo">

                       <id name="id" >
                           <generator class="native"/>  <!-- 指明主键的生成策略 -->
                       </id>

                            <property name="adminName" />
                            <property name="password" />
                            <property name="note" />

                </class>
</Hibernate-mapping>
<?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 package="cat.beans">
                <class name="AdminInfo">

                       <id name="id" >
                           <generator class="native"/>  <!-- 指明主键的生成策略 -->
                       </id>

                            <property name="adminName" />
                            <property name="password" />
                            <property name="note" />

                </class>
</Hibernate-mapping>

3)测试

3)测试

public class Test {
            public static void main(String[] args) {
                test(); 
            }
            //可能出现的问题
            //1  Unknown entity: cat.beans.AdminInfo 原因是没有把映射文件引入到主配置文件
            //2  为什么没有真正的添到数据库中呢,因为没有开启事务
            public static void test(){
                //读配置文件
                Configuration cxf=new Configuration(); 
                cxf.configure(); //会去读配置文件,扩号中可以写上配置文件的名称,也可以不写,如果不写,默认读  Hibernate.cfg.xml 这个文件

                //创建SessionFactory对象        
                SessionFactory sessionFactory=cxf.buildSessionFactory();

                //创建Session对象
                Session session= sessionFactory.openSession();  

                //开启事务
                Transaction tx= session.beginTransaction();
                AdminInfo admin=new AdminInfo();
                admin.setAdminName("管理员Hibernate");
                admin.setPassword("adminaaa");
                admin.setNote("这是第一个用户用Hibernate添加的");
                session.save(admin);

                //提交事务
                tx.commit();                
                session.close();

                System.out.println("操作成功");
                System.out.println(admin.getId());  //它居然能得到id

            }
        }
public class Test {
            public static void main(String[] args) {
                test(); 
            }
            //可能出现的问题
            //1  Unknown entity: cat.beans.AdminInfo 原因是没有把映射文件引入到主配置文件
            //2  为什么没有真正的添到数据库中呢,因为没有开启事务
            public static void test(){
                //读配置文件
                Configuration cxf=new Configuration(); 
                cxf.configure(); //会去读配置文件,扩号中可以写上配置文件的名称,也可以不写,如果不写,默认读  Hibernate.cfg.xml 这个文件

                //创建SessionFactory对象        
                SessionFactory sessionFactory=cxf.buildSessionFactory();

                //创建Session对象
                Session session= sessionFactory.openSession();  

                //开启事务
                Transaction tx= session.beginTransaction();
                AdminInfo admin=new AdminInfo();
                admin.setAdminName("管理员Hibernate");
                admin.setPassword("adminaaa");
                admin.setNote("这是第一个用户用Hibernate添加的");
                session.save(admin);

                //提交事务
                tx.commit();                
                session.close();

                System.out.println("操作成功");
                System.out.println(admin.getId());  //它居然能得到id

            }
        }

注脚: 对于 beans 中的 实体类(AdminInfo)
,没有何尤其的供给(但必必要有get 和set 
),但必须有3个无参的构造方法,最好不用注解为 final 的,
对懒加载有影响。对映射文件的须求和总结说。

申明: 对于 beans 中的 实体类(AdminInfo)
,没有何尤其的渴求(但必须求有get 和set 
),但无法不有三个无参的构造方法,最好不要证明为 final 的,
对懒加载有影响。对映射文件的渴求和精炼说。

1) 通常,命名是 类名.hbm.xml => AdminInfo.hbm.xml

1) 通常,命名是 类名.hbm.xml => AdminInfo.hbm.xml

2) 能够在贰个炫耀文件中,映射五个类,但常见不推荐这么做

2) 能够在二个炫耀文件中,映射三个类,但日常不引进这么做

3)

3)

<Hibernate-mapping package="cat.beans">  //这里的package可以不写,但如果不写,下面的 要写成全类名
      <class name="AdminInfo" >  如果上面的package不写,这里要写成      <class name="cat.beans.AdminInfo" > 
      ....
<Hibernate-mapping package="cat.beans">  //这里的package可以不写,但如果不写,下面的 要写成全类名
      <class name="AdminInfo" >  如果上面的package不写,这里要写成      <class name="cat.beans.AdminInfo" > 
      ....

4) 一些属性是有暗中认可值的,能够一目精晓的钦点值,也能够选择暗中同意值

4) 一些属性是有暗中认可值的,能够一目掌握的钦赐值,也足以应用暗许值

<class name="AdminInfo" table="adminInfo" >
       <id name="id" >
           <generator class="native" />   //native 主键生成器,会根据不同的数据库选择不同的主键生成方式
       </id>

            <property name="adminName" column="aminName"  type="string"/>
            <property name="password" />
            <property name="note" />            
</class>
<class name="AdminInfo" table="adminInfo" >
       <id name="id" >
           <generator class="native" />   //native 主键生成器,会根据不同的数据库选择不同的主键生成方式
       </id>

            <property name="adminName" column="aminName"  type="string"/>
            <property name="password" />
            <property name="note" />            
</class>

四 、工具类和行业内部的代码
工具类代码实例

四 、工具类和规范的代码
工具类代码实例

package cat.hibutils;

import org.Hibernate.Session;
import org.Hibernate.SessionFactory;
import org.Hibernate.cfg.Configuration;

            public class HibUtil {
                private HibUtil(){}  //防止别人创建本类的实例
                private static SessionFactory _factory;

                static{
                    Configuration cxf=new Configuration();
                    cxf.configure();
                    _factory=cxf.buildSessionFactory();
                }

                //得到Session
                //Session 对象是线程不安全的
                public static Session getSession(){
                    return _factory.openSession();
                }

                //得到 SessionFactory
                public SessionFactory getSessionFactory(){
                    return _factory;
                }

                //关闭连接
                public static void close(Session s){
                    if(s!=null){
                        s.close();
                    }
                }

            }

            //标准的添加方法
            public static void main(String[] args) {
                AdminInfo admin=new AdminInfo();
                admin.setAdminName("标准方法添的用户");
                admin.setPassword("123");
                add(admin);

                System.out.println("用户添加成功");
            }

            //标准的add方法
            public static void add(AdminInfo admin){
                Session s=null;
                Transaction tx=null;
                try{
                    s=HibUtil.getSession();
                    tx=s.beginTransaction();
                    s.save(admin); 
                    tx.commit();
                }
                catch(Exception ex){
                    if(tx!=null){
                        tx.rollback();
                    }
                    ex.printStackTrace();
                }finally{
                    HibUtil.close(s);
                }    
            }

            //精简的写法
            public static void simpleAdd(AdminInfo admin){
                Session s=null;
                Transaction tx=null;
                try {
                    s=HibUtil.getSession();
                    tx=s.beginTransaction();
                    s.save(admin);
                    tx.commit();
                }
                finally{
                    HibUtil.close(s);
                }
            }
package cat.hibutils;

import org.Hibernate.Session;
import org.Hibernate.SessionFactory;
import org.Hibernate.cfg.Configuration;

            public class HibUtil {
                private HibUtil(){}  //防止别人创建本类的实例
                private static SessionFactory _factory;

                static{
                    Configuration cxf=new Configuration();
                    cxf.configure();
                    _factory=cxf.buildSessionFactory();
                }

                //得到Session
                //Session 对象是线程不安全的
                public static Session getSession(){
                    return _factory.openSession();
                }

                //得到 SessionFactory
                public SessionFactory getSessionFactory(){
                    return _factory;
                }

                //关闭连接
                public static void close(Session s){
                    if(s!=null){
                        s.close();
                    }
                }

            }

            //标准的添加方法
            public static void main(String[] args) {
                AdminInfo admin=new AdminInfo();
                admin.setAdminName("标准方法添的用户");
                admin.setPassword("123");
                add(admin);

                System.out.println("用户添加成功");
            }

            //标准的add方法
            public static void add(AdminInfo admin){
                Session s=null;
                Transaction tx=null;
                try{
                    s=HibUtil.getSession();
                    tx=s.beginTransaction();
                    s.save(admin); 
                    tx.commit();
                }
                catch(Exception ex){
                    if(tx!=null){
                        tx.rollback();
                    }
                    ex.printStackTrace();
                }finally{
                    HibUtil.close(s);
                }    
            }

            //精简的写法
            public static void simpleAdd(AdminInfo admin){
                Session s=null;
                Transaction tx=null;
                try {
                    s=HibUtil.getSession();
                    tx=s.beginTransaction();
                    s.save(admin);
                    tx.commit();
                }
                finally{
                    HibUtil.close(s);
                }
            }

五、使用 threadLocal

五、使用 threadLocal

public class HibUtil {
                private HibUtil(){}  //防止别人创建本类的实例
                private static SessionFactory _factory;
                private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

                static{
                    Configuration cxf=new Configuration();
                    cxf.configure();
                    _factory=cxf.buildSessionFactory();
                }

                //得到Session
                //Session 对象是线程不安全的
                public static Session getSession(){
                    //return _factory.openSession();
                    Session s=threadLocal.get();
                    if(s == null){
                         s=_factory.openSession();
                         threadLocal.set(s);
                    }    
                    return s;
                }

                //得到 SessionFactory
                public SessionFactory getSessionFactory(){
                    return _factory;
                }

                //关闭连接
                public static void closeSession(){
                    Session s=threadLocal.get();
                    threadLocal.set(null);

                    if(s!=null){
                        s.close();
                    }
                }
            }

            public static void simpleAdd(AdminInfo admin){
                Session s=null;
                Transaction tx=null;
                try {
                    s=HibUtil.getSession();
                    tx=s.beginTransaction();
                    s.save(admin);
                    tx.commit();
                }
                finally{
                    HibUtil.closeSession();  //关连接的时候,可以这样关
                }
            }
public class HibUtil {
                private HibUtil(){}  //防止别人创建本类的实例
                private static SessionFactory _factory;
                private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

                static{
                    Configuration cxf=new Configuration();
                    cxf.configure();
                    _factory=cxf.buildSessionFactory();
                }

                //得到Session
                //Session 对象是线程不安全的
                public static Session getSession(){
                    //return _factory.openSession();
                    Session s=threadLocal.get();
                    if(s == null){
                         s=_factory.openSession();
                         threadLocal.set(s);
                    }    
                    return s;
                }

                //得到 SessionFactory
                public SessionFactory getSessionFactory(){
                    return _factory;
                }

                //关闭连接
                public static void closeSession(){
                    Session s=threadLocal.get();
                    threadLocal.set(null);

                    if(s!=null){
                        s.close();
                    }
                }
            }

            public static void simpleAdd(AdminInfo admin){
                Session s=null;
                Transaction tx=null;
                try {
                    s=HibUtil.getSession();
                    tx=s.beginTransaction();
                    s.save(admin);
                    tx.commit();
                }
                finally{
                    HibUtil.closeSession();  //关连接的时候,可以这样关
                }
            }

六、Session接口

六、Session接口

多少个常用的章程

几个常用的法门

1) save , persist 保存数据,  persist 在事情外不会发出insert语句

1) save , persist 保存数据,  persist 在业务外不会时有产生insert语句

2) delete 删除对象

2) delete 删除对象

3) update 更新二个指标,要是数据库中绝非相应的记录,将出错

3) update 更新3个对象,假若数据库中尚无对应的笔录,将出错

4) get 依照ID查询对象,会登时访问数据库

4) get 根据ID查询对象,会立时访问数据库

5) load 依照ID查询对象 (重返的是代理对象,不会及时访问数据库,懒加载)

5) load 遵照ID查询对象 (重临的是代理对象,不会即时访问数据库,懒加载)

6) saveOrUpdate (依据ID和version来支配是要封存恐怕要翻新) , merge (调用
merge 你的靶子照旧脱管的)

6) saveOrUpdate (依据ID和version来决定是要封存或然要创新) , merge (调用
merge 你的靶子依旧脱管的)

7) lock 把对象变成持久对象,但不会一起对象的情况

7) lock 把目的变成持久对象,但不会共同对象的状态

 //例子,使用get查询用户

public static void main(String[] args) {
                    AdminInfo admin=getAdmin(89);
                    System.out.println(admin);
                }

public static AdminInfo getAdmin(int id){    
                    try{
                        Session s=HibUtil.getSession();
                        return (AdminInfo)s.get(AdminInfo.class, id);

                    }finally{
                        HibUtil.closeSession();
                    }
                }

//例子,使用load方法进行查询
public static AdminInfo loadAdmin(int id){    
                try{
                    Session s=HibUtil.getSession();
                    AdminInfo admin= (AdminInfo)s.load(AdminInfo.class, id);        
                    return admin;   //如果这里不直接访问 admin 对象,则返回的是代理,并不是真正查询出来的数据

                }finally{
                    HibUtil.closeSession();
                }
            }

public static void main(String[] args) {
                    AdminInfo admin=loadAdmin(89);
                    System.out.println(admin.getAdminName()); //could not initialize proxy - no Session 不能初始化代理对象,因为没有session了
            }
 //例子,使用get查询用户

public static void main(String[] args) {
                    AdminInfo admin=getAdmin(89);
                    System.out.println(admin);
                }

public static AdminInfo getAdmin(int id){    
                    try{
                        Session s=HibUtil.getSession();
                        return (AdminInfo)s.get(AdminInfo.class, id);

                    }finally{
                        HibUtil.closeSession();
                    }
                }

//例子,使用load方法进行查询
public static AdminInfo loadAdmin(int id){    
                try{
                    Session s=HibUtil.getSession();
                    AdminInfo admin= (AdminInfo)s.load(AdminInfo.class, id);        
                    return admin;   //如果这里不直接访问 admin 对象,则返回的是代理,并不是真正查询出来的数据

                }finally{
                    HibUtil.closeSession();
                }
            }

public static void main(String[] args) {
                    AdminInfo admin=loadAdmin(89);
                    System.out.println(admin.getAdminName()); //could not initialize proxy - no Session 不能初始化代理对象,因为没有session了
            }

柒 、对象情形   

七 、对象处境   

1.须臾时 (transien) :
数据库中绝非数据与之相应,超越成效域就失效,会被垃圾回收器回收。一般的 new
出来的靶子,且与session非亲非故

1.瞬时 (transien) :
数据库中尚无数据与之相应,超越功效域就失效,会被垃圾回收器回收。一般的 new
出来的目的,且与session毫无干系

2.持久 (persistent): 数据库中有多少与之相应,与
Session有关联,而且有关的Session没有停歇,事务还没有提交,
持久对象的情状发生变更, 在作业提交的时候,会保留到多少库
(Hibernate会检查和测试到)

2.持久 (persistent): 数据库中有数据与之相应,与
Session有关联,而且有关的Session没有停歇,事务还不曾付诸,
持久对象的动静发生转移, 在事情提交的时候,会保留到数量库
(Hibernate会检查和测试到)

3.脱管 (detached) ,数据库中有数据与之相应, 但当前没有Session与之提到,
脱管对象处境产生转移也不会潜移默化到数据库

3.脱管 (detached) ,数据库中有数量与之对应, 但当前并未Session与之提到,
脱管对象意况发生变动也不会潜移默化到数据库

瞬时: 自由人

瞬时: 自由人

善始善终: 法庭上被审讯中的人,有案底 , 全体的话都是呈堂证据与供词

慎始而敬终: 法庭上被讯问中的人,有案底 , 全数的话都以呈堂证据与供词

脱管: 审完了,放了的人 , 有案底,但言论自由

脱管: 审完了,放了的人 , 有案底,但言论自由

捌 、封装简单的操作到HibUtil

八 、封装简单的操作到HibUtil

//增加 
        public static  void add(Object obj){
            Session s=null;
            Transaction tx=null;
            try{
                s=getSession();
                tx=s.beginTransaction();
                s.save(obj);
                tx.commit();

            }finally{
                closeSession();
            }
        }

        //删除
        public static void del(Object obj){
            try{
                Session s=getSession();
                Transaction tx=s.beginTransaction();
                s.delete(obj);
                tx.commit();

            }finally{
                closeSession();
            }
        }

        //修改
        public static void  update(Object  obj){
            Session s=null;
            Transaction  tx=null;
            try{
                s=getSession();
                tx=s.beginTransaction();
                s.update(obj);
                tx.commit();

            }finally{
                closeSession();
            }
        }

        //查询 
        public static Object get(Class  clazz, Serializable id){
            try{
                Session s=getSession();
                return s.get(clazz, id);
            }finally{
                closeSession();
            }    
        }
//增加 
        public static  void add(Object obj){
            Session s=null;
            Transaction tx=null;
            try{
                s=getSession();
                tx=s.beginTransaction();
                s.save(obj);
                tx.commit();

            }finally{
                closeSession();
            }
        }

        //删除
        public static void del(Object obj){
            try{
                Session s=getSession();
                Transaction tx=s.beginTransaction();
                s.delete(obj);
                tx.commit();

            }finally{
                closeSession();
            }
        }

        //修改
        public static void  update(Object  obj){
            Session s=null;
            Transaction  tx=null;
            try{
                s=getSession();
                tx=s.beginTransaction();
                s.update(obj);
                tx.commit();

            }finally{
                closeSession();
            }
        }

        //查询 
        public static Object get(Class  clazz, Serializable id){
            try{
                Session s=getSession();
                return s.get(clazz, id);
            }finally{
                closeSession();
            }    
        }

九、HQL

九、HQL

public class AdminDao {        
            //根据用户名和密码查询用户
            public AdminInfo getLoginAdmin(String adminName,String password){
                try{
                    Session s=HibUtil.getSession();
                    String hql="from AdminInfo a where a.adminName= ? and a.password= ?";   //AdminInfo 必须是对象名,不能是表名
                    Query q=s.createQuery(hql);
                    q.setString(0, adminName);   //注意,它是从0开始的
                    q.setString(1, password);

                    AdminInfo admin= (AdminInfo)q.uniqueResult();  //只返回一对象,如果返回的不是一条数据,将出现异常 query did not return a unique result 54
                    return admin;

                }finally{
                    HibUtil.closeSession();
                }
            }

            //查询所有用户
            @SuppressWarnings("unchecked")
            public List<AdminInfo> getAllAdmin(){
                try{
                    Session s=HibUtil.getSession();
                 /* Query q =s.createQuery("from AdminInfo");
                    return  q.list();  //返回一个列表
                  */    
                    return s.createQuery("from AdminInfo").list();

                }finally{
                    HibUtil.closeSession();
                }
            }
        }
public class AdminDao {        
            //根据用户名和密码查询用户
            public AdminInfo getLoginAdmin(String adminName,String password){
                try{
                    Session s=HibUtil.getSession();
                    String hql="from AdminInfo a where a.adminName= ? and a.password= ?";   //AdminInfo 必须是对象名,不能是表名
                    Query q=s.createQuery(hql);
                    q.setString(0, adminName);   //注意,它是从0开始的
                    q.setString(1, password);

                    AdminInfo admin= (AdminInfo)q.uniqueResult();  //只返回一对象,如果返回的不是一条数据,将出现异常 query did not return a unique result 54
                    return admin;

                }finally{
                    HibUtil.closeSession();
                }
            }

            //查询所有用户
            @SuppressWarnings("unchecked")
            public List<AdminInfo> getAllAdmin(){
                try{
                    Session s=HibUtil.getSession();
                 /* Query q =s.createQuery("from AdminInfo");
                    return  q.list();  //返回一个列表
                  */    
                    return s.createQuery("from AdminInfo").list();

                }finally{
                    HibUtil.closeSession();
                }
            }
        }

转变测试用例 :

浮动测试用例 :

在类上,右键, new 输入 other , 搜索 junit 然后一步步抬高即可。

在类上,右键, new 输入 other , 搜索 junit 然后一步步加上即可。

public class AdminDaoTest {    
                private AdminDao dao;

                @BeforeClass  //注解
                public static void setUpBeforeClass() throws Exception {
                    //主要用于对静态成员进行初始化
                }

                @AfterClass
                public static void tearDownAfterClass() throws Exception {
                }

                @Before  //表示在执行之前做的处理
                public void setUp() throws Exception {
                    dao=new AdminDao();
                }

                @After  //执行之后做的处理
                public void tearDown() throws Exception {
                    System.out.println("测试完毕");  //在每个方法执行完后都会调用
                }

                @Test
                public void testGetLoginAdmin() {
                    AdminInfo admin=dao.getLoginAdmin("aaaaaaa", "aaa");

                    if(admin==null){
                        System.out.println("没查到");
                    }
                    else{
                        System.out.println(admin);
                    }    
                }

                @Test
                public void testGetAllAdmin() {
                    List<AdminInfo> list=dao.getAllAdmin();

                    for (AdminInfo a:list) {
                        System.out.println(a);
                    }
                }
            }
public class AdminDaoTest {    
                private AdminDao dao;

                @BeforeClass  //注解
                public static void setUpBeforeClass() throws Exception {
                    //主要用于对静态成员进行初始化
                }

                @AfterClass
                public static void tearDownAfterClass() throws Exception {
                }

                @Before  //表示在执行之前做的处理
                public void setUp() throws Exception {
                    dao=new AdminDao();
                }

                @After  //执行之后做的处理
                public void tearDown() throws Exception {
                    System.out.println("测试完毕");  //在每个方法执行完后都会调用
                }

                @Test
                public void testGetLoginAdmin() {
                    AdminInfo admin=dao.getLoginAdmin("aaaaaaa", "aaa");

                    if(admin==null){
                        System.out.println("没查到");
                    }
                    else{
                        System.out.println(admin);
                    }    
                }

                @Test
                public void testGetAllAdmin() {
                    List<AdminInfo> list=dao.getAllAdmin();

                    for (AdminInfo a:list) {
                        System.out.println(a);
                    }
                }
            }

HQL 的互补表达

HQL 的补充表明

1)下面的写法

1)下面的写法

String hql="from AdminInfo a where a.adminName= ? and a.password= ?";
String hql="from AdminInfo a where a.adminName= ? and a.password= ?";

也得以不用外号,如下:

也得以不用外号,如下:

String hql="from AdminInfo  where adminName= ? and password= ?"
String hql="from AdminInfo  where adminName= ? and password= ?"

2) 能够利用命名参数

2) 可以行义务名参数

String hql="from AdminInfo a where a.adminName=:aname and a.password= :pwd ";   //AdminInfo 必须是对象名,不能是表名
                    Query q=s.createQuery(hql);
                    q.setString("aname", adminName);   //注意,它是从0开始的
                    q.setString("pwd", password);
String hql="from AdminInfo a where a.adminName=:aname and a.password= :pwd ";   //AdminInfo 必须是对象名,不能是表名
                    Query q=s.createQuery(hql);
                    q.setString("aname", adminName);   //注意,它是从0开始的
                    q.setString("pwd", password);

3) Query 接口有个种set 方法, 可以对点名项指标参数实行传播

3) Query 接口有个种set 方法, 可以对点名项目标参数实行传播

4) 能够采纳  setFirstResult  和  set马克斯Results
举行理并了结果集过滤,完成分页查询

4) 能够选拔  setFirstResult  和  set马克斯Results
举办结果集过滤,达成分页查询

public List<AdminInfo> getAdminList(int beginRow,int pageSize){
                    try{
                            Session s=HibUtil.getSession();
                            Query q=s.createQuery("from AdminInfo");
                            q.setFirstResult(beginRow);
                            q.setMaxResults(pageSize);

                            return q.list();

                        }finally{
                            HibUtil.closeSession();
                        }
                    }
public List<AdminInfo> getAdminList(int beginRow,int pageSize){
                    try{
                            Session s=HibUtil.getSession();
                            Query q=s.createQuery("from AdminInfo");
                            q.setFirstResult(beginRow);
                            q.setMaxResults(pageSize);

                            return q.list();

                        }finally{
                            HibUtil.closeSession();
                        }
                    }

5) 查询数据行数

5) 查询数据行数

public int getAdminCount(){
                    try{
                        Session s=HibUtil.getSession();
                        Query q=s.createQuery("select count(*) from AdminInfo");  //后面是对象名,
                        long count=(Long)q.uniqueResult();
                        return new Integer(count+"");

                    }finally{
                        HibUtil.closeSession();
                    }
                }
public int getAdminCount(){
                    try{
                        Session s=HibUtil.getSession();
                        Query q=s.createQuery("select count(*) from AdminInfo");  //后面是对象名,
                        long count=(Long)q.uniqueResult();
                        return new Integer(count+"");

                    }finally{
                        HibUtil.closeSession();
                    }
                }

补给:HQL 常见的询问

增加补充:HQL 常见的询问

// 使where 
        Query q=s.createQuery("from AdminInfo where id not between 10 and 20");  //查询id不在10 到20之间的

// 使用in 
      Query q=s.createQuery("from AdminInfo where AdminName in('张三','李四','王五')"); //只要在这个('张三','李四','王五')集合中含有的,就查出来

// 使用 like 
        Query q=s.createQuery("from AdminInfo where AdminName like %赵%");    // 查询名字中含有赵的所有用户

// 使用 null 
        Query q=s.createQuery("from AdminInfo where note is null");     //查询所有备注为null的用户        

// 使用 and 
          Query q=s.createQuery("from AdminInfo where note is null and id<5");       //查询备注信息是null而且id<5的用户

// 执行删除
        Query q=s.createQuery("from AdminInfo where password is null");

// 批量删除:
        public void delAdmins(String password){
                try{
                    Session s=HibUtil.getSession();
                    Transaction tx=s.beginTransaction();
                    Query q=s.createQuery("delete from AdminInfo where password= :pwd");
                    q.setString("pwd", password);
                    q.executeUpdate();  //执行删除

                    tx.commit();

                }finally{
                    HibUtil.closeSession();
                }        
            }
// 使where 
        Query q=s.createQuery("from AdminInfo where id not between 10 and 20");  //查询id不在10 到20之间的

// 使用in 
      Query q=s.createQuery("from AdminInfo where AdminName in('张三','李四','王五')"); //只要在这个('张三','李四','王五')集合中含有的,就查出来

// 使用 like 
        Query q=s.createQuery("from AdminInfo where AdminName like %赵%");    // 查询名字中含有赵的所有用户

// 使用 null 
        Query q=s.createQuery("from AdminInfo where note is null");     //查询所有备注为null的用户        

// 使用 and 
          Query q=s.createQuery("from AdminInfo where note is null and id<5");       //查询备注信息是null而且id<5的用户

// 执行删除
        Query q=s.createQuery("from AdminInfo where password is null");

// 批量删除:
        public void delAdmins(String password){
                try{
                    Session s=HibUtil.getSession();
                    Transaction tx=s.beginTransaction();
                    Query q=s.createQuery("delete from AdminInfo where password= :pwd");
                    q.setString("pwd", password);
                    q.executeUpdate();  //执行删除

                    tx.commit();

                }finally{
                    HibUtil.closeSession();
                }        
            }