JAVA操作数据库----- http://blog.sina.com.cn/andyfang

----摘自http://blog.sina.com.cn/andyfang
这次我们谈一谈JAVA操作数据库的另外一种方式,那就是Hibernate组件。
    Hibernate是中小型项目使用的最多的一种持久化技术。而它最重要的概念就是ORM(对象-关系映射)。对于这个概念,许多资料上的解释都不一样,比较大众化的解释是,将数据库中的记录映射到程序中,使其成为对象来操作,就象操作JAVA的普通类一样。除了这些,它还可以为我们管理连接对象,事务处理等操作。所以使用起来很方便。
    首先我们来看一下一个简单的Hibernate程序的结构。它有两个xml文件很重要,第一个就是*.cfg.xml文件。它描述了Hibernate和数据库之间的配置信息。比如连接池、数据源。
 
    这里不得不说到的一个类就是SessionFactory类,它是Hibernate里面最重要的一个类。基本上所有其他操作API都是从这个类获得实例的。而这个配置文件中,描述了SessionFactory的基本内容,也就是连接信息,和另外一个非常重要的内容,就是:*.hbm.xml文件。其实,如果你使用工具的话(比如MyEclipse,JBuilder),这些东西都可以自动生成。先还是讲一下这些东西都描述的是些什么内容吧。
    myeclipse.connection.profile  它描述的是一个连接的名字
    connection.url  它描述了连接字符串
    connection.username/connection.password  描述了用户名和密码
    connection.driver_class  描述了驱动类
    dialect  这个东西描述了Hibernate对Oracle9i提供支持的类
    在这个文件中还可以描述事务和其他的操作。
    另外一个重要的文件是*.hbm.xml文件,它描述了数据库中的表的信息。不过在说这个文件之前,我们先要用类来描述数据库中的记录。
    public class StuInfo
    {
      private Integer stuID;
      private String stuName;
      private void setStuID(Integer id){this.stuID=id;}
      public Integer getStuID(){return stuID;}
      public void setStuName(String name){this.stuName=name;)
      public String getStuName(){return stuName;}
    }
    需要注意的是:在JAVA中不能用基本数据类型去描述数据库中的类型。然后我们再来看看*.hbm.xml文件中是如何描述的吧。
    需要说明的是,这里使用了Oracle里面的序列来实现自动增长,而且让stuID字段的set方法是私有的。这是因为stuID字段是主键字段,而且又是自动增长的,所以不需要人工修改它的值。
    以上这些都只是使用Hibernate的准备工作,接下来就可以操作Hibernate来实现数据库的逻辑。
    首先必须创建一个Configuration对象来加载我们的*.cfg.xml文件。
    Configuration cfg = new Configuaration();
    cfg.configure("/cfg/hibernate.cfg.xml");//cfg包下面
    然后用这个对象来创建SessionFactory对象。这个对象很重要,它是用来创建Hibernate会话和其他类的重要类。
    SessionFactory factory = cfg.buildSessionFactory();
    Session session = factory.openSession();
    有了Session之后,我们就可以用它来创建各种操作数据库的类。先来说说查询吧。我们需要使用一种叫做HQL的查询语言,它是Hibernate特有的一中查询语言,和我们熟悉的SQL很象。当然Hibernate还提供了其他的查询方式,等下次有机会的时候再说吧。
    Query query = session.createQuery("from StuInfo");
    List list = query.list();//执行查询并获得集合
    //迭代数据
    Iterator it = list.iterator();
    while(it.hasNext()){
      StuInfo stu = (StuInfo)it.next();
      System.out.println(stu.getStuName());
    }
    这就是一个简单的查询。这里需要注意的是,查询语句中的表必须和StuInfo.hbm.xml中映射的表名一样,其他的字段也是。下面说说插入、更新和删除。
    想要修改和更新,或者删除,我们必须先得到要修改的对象。所以先要使用查询来获取对象。而且修改的过程当中有可能会报错,所以我们要使用事务处理。
    Transaction trans = session.beginTransaction();
    trans.begin();//开始事务
    Query query = session.createQuery("from StuInfo where stuID=1");
    List list = query.list();
    if (!list.isEmpty()) {
      Iterator it = list.iterator();
      StuInfo stu = (StuInfo) it.next();
      stu.setStuname("roddick");
      session.update(stu);//修改更新,删除是session.delete(stu);
      trans.commit();//提交事务
      session.close();//关闭会话
    }
    以上就是Hibernate的简单操作,是不是很容易。需要注意的是,这里的表映射是没有主外键关系的,如果表和其他表有主外键关系的话,在创建SessionFactory对象的时候是会报错的。要处理这种情况必须在建立映射关系的时候考虑一对多映射。这种情况我们下次有机会再说吧。
    可能有不正确的地方,欢迎大家指正!!!有事可以联系我的邮箱,或在博客留言,一定回复!!!
===============================================================================================
上次说到了JAVA操作数据库的连接方法,这次我们来谈如何操作数据库。
      操作数据库无非就是熟悉sql语句,只要你对sql语句比较熟的话,也就没有什么可难的了。操作数据库有三大接口,只要熟练掌握了这三大接口的用法,数据库的操作基本上就OK了。
      首先最基础的接口就是Statement接口。它提供了操作数据库的基本方法。通过Connection的createStatement()方法获得实例。
      Statement stmt = conn.createStatement();
      获得Statement接口的实例之后,如果你要执行查询,就需要使用到executeQuery()方法;如果你要执行插入或更新或者删除的话,就使用executeUpdate()方法。需要注意的是executeQuery()方法返回的是ResultSet类型,而executeUpdate()方法返回的是整型。
      ResultSet rs = stmt.executeQuery("select * from stuInfo");
      int i  =stmt.executeUpdate("insert into stuInfo values(1,'andy')");
      如果你执行的查询就用ResultSet来接收查询的结果。如果你执行的插入、删除或者修改的话,就用一个整型来接收。并且可以通过这个值来判断执行是否成功。
      第二个接口就是PreparedStatement接口,它继承自Statement接口,丰富了Statement接口的方法。与Statement不同的地方便是它可以预编译执行。执行的效率要比Statement接口高。它通过Connection对象的prepareStatement()来获得实例。
      PreparedStatement pstmt = conn.prepareStatement("select * from stuInfo where uid=?");
      //设置第一个参数的值为 9
      pstmt.setInt(1, 9);
      ResultSet rs = pstmt.executeQuery();
      在这里,我们使用了预编译参数的设置,然后执行查询,获得记录集。需要注意的是有一个东西不能设置成预编译的参数,那就是表的名字。也就是"select * from ?",这样会报错的,或者执行不成功。增、删、改操作同上。重要的地方就是定义和设置参数的值。
      第三个接口就是CallableStatement接口,这个接口最重要的地方就是调用存储过程或者函数,要知道在项目中使用存储过程或者函数是多么的重要。它继承自PreparedStatement接口,自然也能够预编译。
      CallableStatement cstmt = conn.prepareCall("{call myProcedure(?,?)}");
      //设置参数的值
      cstmt.setInt(1,2);
      cstmt.setString(2,"Andy");
      //返回布尔值,可以用来判断执行是否成功
      cstmt.execute();
      上面这段语句便是调用了存储过程myProcedure(),它有两个参数,分别是整型和字符串类型。调用execute()方法,返回一个布尔值,来判断是否执行成功。以oracle为例,如果调用的是函数,那么还可以用它来获得返回值。例如:
      int result = cstmt.getInt(3);
      这次就写到这里吧,有写的不正确的地方请指正,有不明白的地方可以发邮件给我,或者在博客里留言。下次我们会谈一谈使用轻量级组件来操作数据库。
===========================================================================================
最近很多朋友都发邮件问我关于JAVA操作数据库的问题。其实这些都没什么很难的问题,不过内容还是蛮多的,所以决定写个总结。
    由于内容很多,而且还需要整理,所以先从连接的问题开始吧。想要例子的朋友,可以发邮件给我,有写的不正确的地方也欢迎评论。
    总结了一下,由于数据库的种类很多,连接的字符串也不一样。所以我们只谈连接的方式,而且以Oracle为例。大概有两种连接方式是比较常用的:
    第一种是使用本地驱动连接,这种方式在学习的时候用的很多,但在实际的项目过程中很少会用到。首先当然是要有数据库的驱动包,也就是classes12.jar包。然后在类中注册驱动,并获取连接
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORAC","scott","tiger");
    它是以文本传值的方式注册驱动。它还有另外一种形式:
    DriverManager.registerDriver(new OracleDriver());
    DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORAC","scott","tiger");
    它是以匿名产生对象的方式来注册驱动,理论上速度要快一些。
    第二种方式是通过JNDI获取连接池中的连接对象。这种方式使用的也比较多。因为在实际的项目中,我们往往都是通过应用服务器来管理连接对象的创建和销毁。这样会提高资源的利用率。而且也不需要我们自己来管理,两个字--方便。
    以Weblogic为例,首先需要导入weblogic.jar包,当然肯定是要在服务器上配置连接池和数据源。
    //初始化信息,包括weblogic的工厂方法和url信息;
    Hashtable ht=new Hashtable();
    ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    ht.put(Context.PROVIDER_URL,"t3://localhost:7001");
    InitialContext ctx=new InitialContext(ht);
    //通过JNDI获得数据源
    DataSource obj=(DataSource)ctx.lookup("MyOracleJNDI");
    //从数据源获得连接对象
    Connection conn=obj.getConnection();
    其实在一些中小项目中,我们会使用到一些轻量级的组件,例如Hibernate,来操作数据库。利用它来管理一些例如事务处理,优化数据库操作之类的事情。
posted on 2007-08-01 13:09  kenty  阅读(838)  评论(0编辑  收藏  举报