} } }

    Hibernate(2)-- 第一个Hibernate法度

    添加时间:2013-5-23 点击量:

    一、筹办工作


        1.1 开辟景象


               开辟对象:Eclipse


              数据库: sql server 2005


         1.2 测试景象


    二、开辟流程


      2.1 创建测试表


      2.2 编写实体类及映射文件


      2.3 设备Hibernate.cfg.xml 文件


      2.4 编写Dao文件


      2.5 编写Hibernate 的操纵对象类。


      2.5 应用Junit 进行单位测试



    三、法度开辟


    3.1 创建数据库测试表 Person


      在SqlServer数据中,对于Hibernate和数据库的映射关系中,只有datetime和二进制斗劲特别。所以在表平分别创建了响应的字段
     




    CREATE TABLE person(
    
    id
    [int] IDENTITY11NOT NULL
    pname
    varchar20) ,
    pwd
    varchar20) ,
    registdate
    datetime--用于测试Datetime类型
    pfile image --用于测试二进制文件


    View Code


    3.2 创建实体类 和 映射文件 Person.java


        实体类




     1 package msj.system.model;
    
    2
    3 import java.sql.Date;
    4
    5 public class Person {
    6 private int id;
    7 private String name;
    8 private String pwd;
    9 private Date registDate;
    10 private byte pfile;
    11
    12 public int getId() {
    13 return id;
    14 }
    15 public void setId(int id) {
    16 this.id = id;
    17 }
    18 public String getName() {
    19 return name;
    20 }
    21 public void setName(String name) {
    22 this.name = name;
    23 }
    24 public String getPwd() {
    25 return pwd;
    26 }
    27 public void setPwd(String pwd) {
    28 this.pwd = pwd;
    29 }
    30 public Date getRegistDate() {
    31 return registDate;
    32 }
    33 public void setRegistDate(Date registDate) {
    34 this.registDate = registDate;
    35 }
    36 public byte getPfile()
    37 {
    38 return pfile;
    39 }
    40 public void setPfile(byte pfile)
    41 {
    42 this.pfile = pfile;
    43 }
    44
    45
    46 }


    View Code


        映射文件(person.hbm.xml)




    <?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>
    <class name=msj.system.model.Person table=person>
    <id name=id column=id type=int>
    <generator class=identity></generator>
    </id>
    <property name=name column=pname type=string/>
    <property name=pwd column=pwd type=string/>
    <property name=registDate column=registDate type=date/>
    <property name=pfile column=pfile type=binary></property>
    </class>
    </hibernate-mapping>


    View Code


      注释:


      3.2.1:  <class name=msj.system.model.Person table=person>


           本文件把实体类 msj.system.model.Person 数据库中的表person 接洽关系。


            3.2.1.1: Name=”msj.system.model.Person”


            问:本xml文件映射的是哪个实体对象?


        答:此处必须是包名+类名(msj.system.model.Person)


            3.2.1.2: Table=”person”


            问:映射的实体对象对应数据库中哪个表?


            答:数据库中的person表


      3.2.2: <id name=id column=id type=int>


          实体类中的id属性 对应数据库主键字段id,其类型为int


            3.2.2.1 : name=id


            问:主键对应实体类中的那个属性?


            答:对应实体类Person中的id属性


      3.2.2.2column=id type=int


       问:实体类中属性对应数据库那个字段?


      答:对应数据库字段 id 其类型为int


    3.2.3 : <generator class=identity>


        主键的生陈规矩为自增长类型


        可以参考mapping 文件具体映射关系表


    3.2.4 <property name=name column=pname type=string/>


        实体对象Person中的name属性 对应数据库中的pname属性,类型为字符串。


    3.3 设备hibernate.cfg.mxl 中增长数据连接


       把方才建树的person.hbm.xml 参加到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=hibernate.connection.driver_class>com.microsoft.sqlserver.jdbc.SQLServerDriver </property>
    <property name=hibernate.connection.url>jdbc:sqlserver://localhost:1433;databaseName=hibernate</property>
    <property name=hibernate.connection.username>sa </property>
    <property name=hibernate.connection.password>zz</property>
    <property name=hibernate.dialect>org.hibernate.dialect.SQLServerDialect</property>
    <property name=hibernate.show_sql>true </property>
    <mapping resource=Person.hbm.xml/>
    </session-factory>
    </hibernate-configuration>


    View Code


    3.4 建树Dao文件


       注:


      1 遵守分层原则,Dao文件处于数据库操纵层,其首要完成数据库的增删改操纵。


      2 遵守架构设计原则,我们这里采取接口设计原则。


      (若是仅仅为了进修,你可以直接建树dao操纵类,而无需进行接口设计。)



    dao接口定义 PersonDao




     1 package msj.system.dao;
    
    2
    3 import java.util.List;
    4 import msj.system.model.Person;
    5
    6 public interface PersonDao {
    7 public Person GetSingle(int id); //获取单个文件
    8 public List<Person> GetAll(); //获取全部文件
    9 public void Save(Person person);
    10 public void Update(Person person);
    11 public void Delete(Person person);
    12 }


    View Code


    Dao 实现类 PersonDaoImpl




     1 package msj.system.dao.impl;
    
    2
    3 import java.util.ArrayList;
    4 import java.util.List;
    5
    6 import org.hibernate.Query;
    7 import org.hibernate.Session;
    8 import org.hibernate.Transaction;
    9
    10 import msj.system.dao.PersonDao;
    11 import msj.system.model.Person;
    12 import msj.util.HibernateUtil;
    13
    14 public class PersonDaoImpl implements PersonDao {
    15
    16 @Override
    17 public Person GetSingle(int id) {
    18 Person t = null;
    19 Session session = HibernateUtil.OpenSession();
    20 try {
    21 t = (Person) session.get(Person.class, id);
    22 } catch (Exception Ex) {
    23 Ex.printStackTrace();
    24 } finally {
    25 HibernateUtil.CloseSession(session);
    26 }
    27
    28 return t;
    29 }
    30
    31 @Override
    32 public List<Person> GetAll() {
    33
    34 List<Person> list = new ArrayList<Person>();
    35 Session session = HibernateUtil.OpenSession();
    36 try {
    37 list = (List<Person>) session.createQuery( Person).list();
    38 } catch (Exception Ex) {
    39 Ex.printStackTrace();
    40 } finally {
    41 HibernateUtil.CloseSession(session);
    42 }
    43
    44 return list;
    45 }
    46
    47 @Override
    48 public void Save(Person person) {
    49
    50 Session session = HibernateUtil.OpenSession();
    51 Transaction tx = session.beginTransaction();
    52 try {
    53 session.save(person);
    54 tx.commit();
    55 } catch (Exception Ex) {
    56 tx.rollback();
    57 Ex.printStackTrace();
    58 } finally {
    59 HibernateUtil.CloseSession(session);
    60 }
    61 }
    62
    63 @Override
    64 public void Update(Person person) {
    65
    66 Session session = HibernateUtil.OpenSession();
    67 Transaction tx = session.beginTransaction();
    68 try {
    69 session.(person);
    70 tx.commit();
    71 } catch (Exception Ex) {
    72 tx.rollback();
    73 Ex.printStackTrace();
    74 } finally {
    75 HibernateUtil.CloseSession(session);
    76 }
    77 }
    78
    79 @Override
    80 public void Delete(Person person) {
    81
    82 Session session = HibernateUtil.OpenSession();
    83 Transaction tx = session.beginTransaction();
    84 try {
    85 session.(person);
    86 tx.commit();
    87 } catch (Exception Ex) {
    88 tx.rollback();
    89 Ex.printStackTrace();
    90 } finally {
    91 HibernateUtil.CloseSession(session);
    92 }
    93 }
    94
    95 }


    View Code


    3.5 编写Hibernate 的操纵对象 HibernateUtil




     1 package msj.util;
    
    2
    3 import org.hibernate.Session;
    4 import org.hibernate.SessionFactory;
    5 import org.hibernate.cfg.Configuration;
    6
    7 public class HibernateUtil {
    8 private static SessionFactory sessionfactory = null ;
    9
    10 static{
    11 try{
    12 sessionfactory = new Configuration().configure().buildSessionFactory();
    13 }catch(Exception Ex)
    14 {
    15 Ex.printStackTrace();
    16 }
    17 }
    18
    19 public static Session OpenSession()
    20 {
    21 return sessionfactory.openSession();
    22 }
    23
    24 public static void CloseSession(Session session)
    25 {
    26 session.close();
    27 }
    28 }


    View Code


    3.6 编写测试类




      1 package msj.system.dao;
    
    2
    3 import java.io.FileInputStream;
    4 import java.io.InputStream;
    5 import java.util.List;
    6
    7 import msj.system.dao.impl.PersonDaoImpl;
    8 import msj.system.model.Person;
    9
    10 import org.junit.AfterClass;
    11 import org.junit.Assert;
    12 import org.junit.BeforeClass;
    13 import org.junit.Test;
    14
    15 /
    16 PersonDao 测试类
    17
    18 /
    19 public class PersonDaoTest {
    20
    21 private static PersonDao dao = null;
    22 private Person t = null;
    23
    24 @BeforeClass
    25 public static void setUpBeforeClass() throws Exception {
    26 try {
    27 dao = new PersonDaoImpl();
    28
    29 } catch (Exception Ex) {
    30 Ex.printStackTrace();
    31 }
    32 }
    33
    34 /
    35 @throws java.lang.Exception
    36 /
    37 @AfterClass
    38 public static void tearDownAfterClass() throws Exception {
    39 try {
    40 dao = null;
    41 } catch (Exception Ex) {
    42 Ex.printStackTrace();
    43 }
    44 }
    45
    46 /
    47 获取单个对象测试
    48 /
    49 @Test
    50 public void testGetSingle() {
    51 try {
    52 List<Person> tList = dao.GetAll();
    53 PersonDao dao = new PersonDaoImpl();
    54 Person tOld = null;
    55 if (tList.size() <= 0
    56 {
    57 Assert.fail(数据库中没有记录);
    58 }
    59 else
    60 {
    61 tOld = tList.get(0);
    62 t = dao.GetSingle(tOld.getId());
    63
    64 //测出仅供打印出文件的存取是否正确,真正测试中可以不存在
    65 byte[] b = new byte[t.getPfile().length];
    66 b = t.getPfile();
    67
    68 String str = new String(b,gbk);
    69 System.out.print(str);
    70 }
    71 } catch (Exception Ex) {
    72 Ex.printStackTrace();
    73 Assert.fail(Ex.getMessage());
    74 }
    75
    76 Assert.assertNotNull(t);
    77 }
    78
    79 /
    80 获取全部测试
    81 /
    82 @Test
    83 public void testGetAll() {
    84 List<Person> list = null;
    85 try {
    86 list = dao.GetAll();
    87 } catch (Exception Ex) {
    88 Ex.printStackTrace();
    89 Assert.fail(Ex.getMessage());
    90 }
    91
    92 Assert.assertNotNull(list);
    93 }
    94
    95 /
    96 新增测试
    97 /
    98 @Test
    99 public void testSave() {
    100
    101 try {
    102 Person p = new Person();
    103 p.setName(001);
    104 p.setPwd(001);
    105 p.setRegistDate(new java.sql.Date(new java.util.Date().getTime()));
    106
    107 InputStream is = new FileInputStream(c:/test.txt);
    108 int count = is.available();
    109 byte[] b = new byte[count];
    110 is.read(b);
    111 p.setPfile(b);
    112 is.close();
    113
    114 dao.Save(p);
    115 } catch (Exception Ex) {
    116 Ex.printStackTrace();
    117 Assert.fail(Ex.getMessage());
    118 }
    119 }
    120
    121 /
    122 批改测试
    123 /
    124 @Test
    125 public void testUpdate() {
    126 try {
    127 List<Person> tList = dao.GetAll();
    128 PersonDao dao = new PersonDaoImpl();
    129 Person pOld = null;
    130 String test = ;
    131 if (tList.size() <= 0
    132 {
    133 Assert.fail(数据库中没有记录);
    134 }
    135 else
    136 {
    137 pOld = tList.get(0);
    138 Person p = dao.GetSingle(pOld.getId());
    139
    140 test = p.getName() + 批改;
    141 p.setName(test);
    142 dao.Update(p);
    143
    144 p = dao.GetSingle(pOld.getId());
    145
    146 Assert.assertNotSame(没有批改成功, test, p.getName());
    147 }
    148
    149 } catch (Exception Ex) {
    150 Ex.printStackTrace();
    151 Assert.fail(Ex.getMessage());
    152 }
    153
    154 }
    155
    156 /
    157 删除测试
    158 /
    159 @Test
    160 public void testDelete() {
    161
    162 try {
    163 List<Person> tList = dao.GetAll();
    164 PersonDao dao = new PersonDaoImpl();
    165 Person pOld = null;
    166 String test = ;
    167 if (tList.size() <= 0
    168 {
    169 Assert.fail(数据库中没有记录);
    170 }
    171 else
    172 {
    173 pOld = tList.get(0);
    174 Person p = dao.GetSingle(pOld.getId());
    175 dao.Delete(p);
    176 p = dao.GetSingle(pOld.getId());
    177 Assert.assertTrue(数据没有删除对象, p == null);
    178 }
    179
    180 } catch (Exception Ex) {
    181 Ex.printStackTrace();
    182 Assert.fail(Ex.getMessage());
    183 }
    184
    185 }
    186
    187 }


    View Code


     


    至此、本实例停止。


    第一个hibernate法度 源码  


    参考:景象设备篇  http://www.cnblogs.com/msjqd/articles/3085704.html

    分享到: