一. Derby簡介
Derby是一個(gè)關(guān)系型數(shù)據(jù)庫。 Derby是一個(gè)用java實(shí)現(xiàn)的數(shù)據(jù)庫。 Derby是一個(gè)開源的數(shù)據(jù)庫。 Derby是一個(gè)嵌入式的數(shù)據(jù)庫。 Derby是一個(gè)JDK6內(nèi)置的數(shù)據(jù)庫。 1996年,一個(gè)叫做 Cloudscape, Inc 的新公司成立了,公司的目標(biāo)是構(gòu)建一個(gè)用 Java 語言編寫的數(shù)據(jù)庫服務(wù)器。公司的第一個(gè)發(fā)行版在一年之后推出,后來產(chǎn)品的名稱變成 Cloudscape。 1999年,Cloudscape, Inc. 被大型數(shù)據(jù)庫廠商 Informix Software, Inc. 收購。 2001年, Informix Software 又被 IBM 收購,然后 IBM Cloudscape™ 數(shù)據(jù)庫系統(tǒng)在許多 IBM 的產(chǎn)品中被用作內(nèi)嵌的數(shù)據(jù)庫引擎。 2004年4月,IBM 把 Cloudscape 數(shù)據(jù)庫軟件贈(zèng)送給 Apache 軟件基金會(huì)(ASF),從此 Apache Derby 項(xiàng)目誕生了。在 Apache 中這個(gè)項(xiàng)目叫做 Derby,它是一個(gè)孵化器項(xiàng)目。開發(fā)人員可以在 Apache 的許可下為 Derby 代碼作出貢獻(xiàn),或者下載 Derby 代碼。 二.Derby 在java6中的位置
打開JDK6的安裝目錄就會(huì)發(fā)現(xiàn)比JDK5的安裝目錄里多了一個(gè)叫DB的文件夾,
目錄結(jié)構(gòu) ├─demo--例子 │ ├─databases │ │ └─toursdb │ │ ├─log │ │ └─seg0 │ └─programs │ ├─nserverdemo │ ├─simple │ ├─toursdb │ └─workingwithderby ├─frameworks--框架 │ ├─embedded │ │ └─bin │ └─NetworkServer │ └─bin └─lib--類庫 使用該數(shù)據(jù)庫時(shí)會(huì)用到lib文件夾中的一些jar 三 .Derby使用的一個(gè)簡單例子
1 import java.sql.Connection;
2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.Statement; 5 6 public class TestDerbyBaisc { 7 public static void main(String[] args) { 8 try { 9 Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();//加載驅(qū)動(dòng) 10 Connection conn = DriverManager.getConnection("dbc:derby:TESTDB;create=true");//連接數(shù)據(jù)庫 11 Statement st = conn.createStatement(); 12 st.execute("create table USER_INFO (ID INT NOT NULL,NAME VARCHAR(10) NOT NULL)");//建表 13 st.executeUpdate("insert into USER_INFO(ID,NAME) values (1,‘hermit‘)");//插入數(shù)據(jù) 14 st.executeUpdate("insert into USER_INFO(ID,NAME) values (2,‘test‘)");//插入數(shù)據(jù) 15 ResultSet rs = st.executeQuery("select * from USER_INFO");//讀取剛插入的數(shù)據(jù) 16 while(rs.next()){ 17 int id = rs.getInt(1); 18 String name = rs.getString(2); 19 System.out.println("ID="+id); 20 System.out.println("NAME="+name); 21 } 22 } catch(Exception e){ 23 e.printStackTrace(); 24 } 25 } 26 } 運(yùn)行以后輸出 ID=1 NAME=hermit ID=2 NAME=test 在項(xiàng)目下會(huì)生成一個(gè)文件夾TESTDB 四 .Derby網(wǎng)絡(luò)版服務(wù)器端
1 import java.io.BufferedReader;
2 import java.io.InputStreamReader; 3 import java.io.PrintWriter; 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.Statement; 7 import org.apache.derby.drda.NetworkServerControl; 8 9 public class TestDerbyServer { 10 public static void main(String[] args) { 11 try { 12 NetworkServerControl dbserver = new NetworkServerControl();//啟動(dòng)服務(wù)器 13 14 PrintWriter pw = new PrintWriter(System.out);//獲取服務(wù)器輸出 15 dbserver.start(pw); 16 17 Connection conn = DriverManager.getConnection("jdbc:derby:TESTDB;create=true");//本地連接數(shù)據(jù)庫 18 19 Statement st = conn.createStatement(); 20 st.execute("create table USER_INFO (ID INT NOT NULL,NAME VARCHAR(10) NOT NULL)");//建表 21 st.executeUpdate("insert into USER_INFO(ID,NAME) values (1,‘hermit‘)");//插入數(shù)據(jù) 22 st.executeUpdate("insert into USER_INFO(ID,NAME) values (2,‘test‘)");//插入數(shù)據(jù) 23 24 /* 25 *等待用戶輸入,讓程序繼續(xù)運(yùn)行,不然程序會(huì)運(yùn)行結(jié)束,客戶端就連不上了 26 */ 27 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 28 System.out.println("Press [Enter] to stop Server"); 29 in.readLine(); 30 31 } catch (Exception ex) { 32 ex.printStackTrace(); 33 } 34 } 35 }運(yùn)行輸出: 服務(wù)器準(zhǔn)備在端口 1527 上接受連接。 Press [Enter] to stop Server 再強(qiáng)調(diào)一下,in.readLine();很重要,不然,程序運(yùn)行完畢,服務(wù)器也就停了 五.Derby網(wǎng)絡(luò)版客戶端 運(yùn)行這個(gè)客戶端之前要先運(yùn)行
學(xué)習(xí)Java6(六) 嵌入式數(shù)據(jù)庫Derby(4)網(wǎng)絡(luò)版服務(wù)端 中的服務(wù)端 1 import java.sql.Connection;
運(yùn)行輸出:2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.Statement; 5 6 public class TestDerbyClient { 7 public static void main(String[] args) { 8 String URL = "jdbc:derby://127.0.0.1:1527/TESTDB;create=true"; 9 try { 10 11 Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();//加載驅(qū)動(dòng) 12 Connection conn = DriverManager.getConnection(URL);//建立連接 13 14 Statement st = conn.createStatement(); 15 ResultSet rs = st.executeQuery("select * from USER_INFO");//讀取數(shù)據(jù) 16 while(rs.next()){ 17 int id = rs.getInt(1); 18 String name = rs.getString(2); 19 System.out.println("ID="+id); 20 System.out.println("NAME="+name); 21 } 22 23 } catch (Exception ex) { 24 ex.printStackTrace(); 25 } 26 } 27 } ID=1 NAME=hermit ID=2 NAME=test 六. Derby 用myeclipse網(wǎng)絡(luò)方式連接Derby
首先啟動(dòng)學(xué)習(xí)Java6(六) 嵌入式數(shù)據(jù)庫Derby(4)網(wǎng)絡(luò)版服務(wù)端一文中的服務(wù)端。
在打開myeclipse的首選項(xiàng),找到 ![]() 點(diǎn)擊“new...”。 如下圖所示配置: ![]() 打開DB BROWSER視圖,建立連接,如下圖: ![]() 用戶名密碼任意,但是不能為空,奇怪啊。 完成。 打開新建的連接,即可像一般數(shù)據(jù)庫一樣進(jìn)行操作了。 ![]() 七. Derby用myeclipse本地方式連接Derby
方式連Derby和網(wǎng)絡(luò)方式的配置有很大的區(qū)別:注意看下面兩個(gè)圖:
方式: ![]() 本地方式,注意紅圈處的不同: ![]() 首次連接時(shí)會(huì)在c盤下面創(chuàng)建TESTDB目錄。如果不寫絕對(duì)路徑,數(shù)據(jù)庫會(huì)被創(chuàng)建到eclipse的根目錄下面。 八 . Derby + Spring+hibernate的配置
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd"> 3 4 <beans> 5 6 7 <bean id="dataSource" 8 class="org.apache.commons.dbcp.BasicDataSource"> 9 <property name="driverClassName"> 10 <value>org.apache.derby.jdbc.EmbeddedDriver</value> 11 </property> 12 <property name="url"> 13 <value>jdbc:derby:c:/TESTDB;create=true</value> 14 </property> 15 <property name="username"> 16 <value>test</value> 17 </property> 18 <property name="password"> 19 <value>test</value> 20 </property> 21 </bean> 22 <bean id="sessionFactory" 23 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 24 <property name="dataSource"> 25 <ref bean="dataSource" /> 26 </property> 27 <property name="hibernateProperties"> 28 <props> 29 <prop key="hibernate.dialect"> org.hibernate.dialect.DerbyDialect </prop> 30 </props> 31 </property> 32 <property name="mappingResources"> 33 <list> 34 <value>UserInfo.hbm.xml</value></list> 35 </property></bean> 36 <bean id="UserInfoDAO" class="UserInfoDAO"> 37 <property name="sessionFactory"> 38 <ref bean="sessionFactory" /> 39 </property> 40 </bean></beans> UserInfo.java 1 // default package
2 3 4 5 /** 6 * UserInfo generated by MyEclipse - Hibernate Tools 7 */ 8 9 public class UserInfo implements java.io.Serializable { 10 11 12 // Fields 13 14 private Integer id; 15 private String name; 16 17 18 // Constructors 19 20 /** default constructor */ 21 public UserInfo() { 22 } 23 24 /** minimal constructor */ 25 public UserInfo(Integer id) { 26 this.id = id; 27 } 28 29 /** full constructor */ 30 public UserInfo(Integer id, String name) { 31 this.id = id; 32 this.name = name; 33 } 34 35 36 // Property accessors 37 38 public Integer getId() { 39 return this.id; 40 } 41 42 public void setId(Integer id) { 43 this.id = id; 44 } 45 46 public String getName() { 47 return this.name; 48 } 49 50 public void setName(String name) { 51 this.name = name; 52 } 53 54 55 56 57 58 59 60 61 62 } UserInfo.hbm.xml 1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate./hibernate-mapping-3.0.dtd"> 4 <!-- 5 Mapping file autogenerated by MyEclipse - Hibernate Tools 6 --> 7 <hibernate-mapping> 8 <class name="UserInfo" table="USER_INFO" schema="APP"> 9 <id name="id" type="java.lang.Integer"> 10 <column name="ID" /> 11 <generator class="assigned" /> 12 </id> 13 <property name="name" type="java.lang.String"> 14 <column name="NAME" length="10" /> 15 </property> 16 </class> 17 </hibernate-mapping> 18 UserInfoDAO.java 1 // default package
2 3 import java.util.List; 4 import org.apache.commons.logging.Log; 5 import org.apache.commons.logging.LogFactory; 6 import org.hibernate.LockMode; 7 import org.springframework.context.ApplicationContext; 8 import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 9 10 /** 11 * Data access object (DAO) for domain model class UserInfo. 12 * @see .UserInfo 13 * @author MyEclipse - Hibernate Tools 14 */ 15 public class UserInfoDAO extends HibernateDaoSupport { 16 17 private static final Log log = LogFactory.getLog(UserInfoDAO.class); 18 19 protected void initDao() { 20 //do nothing 21 } 22 23 public void save(UserInfo transientInstance) { 24 log.debug("saving UserInfo instance"); 25 try { 26 getHibernateTemplate().save(transientInstance); 27 log.debug("save successful"); 28 } catch (RuntimeException re) { 29 log.error("save failed", re); 30 throw re; 31 } 32 } 33 34 public void delete(UserInfo persistentInstance) { 35 log.debug("deleting UserInfo instance"); 36 try { 37 getHibernateTemplate().delete(persistentInstance); 38 log.debug("delete successful"); 39 } catch (RuntimeException re) { 40 log.error("delete failed", re); 41 throw re; 42 } 43 } 44 45 public UserInfo findById( java.lang.Integer id) { 46 log.debug("getting UserInfo instance with id: " + id); 47 try { 48 UserInfo instance = (UserInfo) getHibernateTemplate() 49 .get("UserInfo", id); 50 return instance; 51 } catch (RuntimeException re) { 52 log.error("get failed", re); 53 throw re; 54 } 55 } 56 57 58 public List findByExample(UserInfo instance) { 59 log.debug("finding UserInfo instance by example"); 60 try { 61 List results = getHibernateTemplate().findByExample(instance); 62 log.debug("find by example successful, result size: " + results.size()); 63 return results; 64 } catch (RuntimeException re) { 65 log.error("find by example failed", re); 66 throw re; 67 } 68 } 69 70 public List findByProperty(String propertyName, Object value) { 71 log.debug("finding UserInfo instance with property: " + propertyName 72 + ", value: " + value); 73 try { 74 String queryString = "from UserInfo as model where model." 75 + propertyName + "= ?"; 76 return getHibernateTemplate().find(queryString, value); 77 } catch (RuntimeException re) { 78 log.error("find by property name failed", re); 79 throw re; 80 } 81 } 82 83 public UserInfo merge(UserInfo detachedInstance) { 84 log.debug("merging UserInfo instance"); 85 try { 86 UserInfo result = (UserInfo) getHibernateTemplate() 87 .merge(detachedInstance); 88 log.debug("merge successful"); 89 return result; 90 } catch (RuntimeException re) { 91 log.error("merge failed", re); 92 throw re; 93 } 94 } 95 96 public void attachDirty(UserInfo instance) { 97 log.debug("attaching dirty UserInfo instance"); 98 try { 99 getHibernateTemplate().saveOrUpdate(instance); 100 log.debug("attach successful"); 101 } catch (RuntimeException re) { 102 log.error("attach failed", re); 103 throw re; 104 } 105 } 106 107 public void attachClean(UserInfo instance) { 108 log.debug("attaching clean UserInfo instance"); 109 try { 110 getHibernateTemplate().lock(instance, LockMode.NONE); 111 log.debug("attach successful"); 112 } catch (RuntimeException re) { 113 log.error("attach failed", re); 114 throw re; 115 } 116 } 117 118 public static UserInfoDAO getFromApplicationContext(ApplicationContext ctx) { 119 return (UserInfoDAO) ctx.getBean("UserInfoDAO"); 120 } 121 } |
|