学习java得学习一个java数据库存持久层,这样对于操作数据库会有非常一效率的提升。选一个大家熟知的Hibernate吧。精通hibernate3.0那个书,指导我开始了一个Hibernate的程序的实验。
1. 环境:
jdk1.6, myeclipse, mysql, hibernate3.0及相关的包。
2. 建表:
CREATE TABLE `login` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) default '', `password` varchar(100) default '', PRIMARY KEY (`id`) ) TYPE=MyISAM;
3. 文件结构
6. UserInfo类
package com.lr; public class UserInfo { private Integer id ; private String userName ; private String password ; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
7.UserInfo.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> <!--类和表之间的关联--> <class name="com.lr.UserInfo" table="login"> <!--类对象的主键和表的主键的关联--> <id name="id" type="integer"> <column name="id" /> <!--指明主键的自增长类型--> <generator class="identity" /> </id> <!--以下为普通字段的关联--> <property name="userName" type="string"> <column name="name" length="100" /> </property> <property name="password" type="string"> <column name="password" length="100" /> </property> </class> </hibernate-mapping>
8.hibernate.cfg.xml文件
<?xml version='1.0' encoding='gb2312'?> <!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.mysql.jdbc.Driver</property> <!--配置数据库网络连接的url--> <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate</property> <!--配置数据库网络连接的用户名,默认一般为root--> <property name="hibernate.connection.username">root</property> <!--配置数据库网络连接的密码--> <property name="hibernate.connection.password"></property> <!--配置数据库网络连接池的大小--> <property name="hibernate.connection.pool.size">20</property> <!--后台是否显示sql,开发时为true,运行时为false--> <property name="hibernate.show_sql">true</property> <!-- 设置JDBC的隔离级别--> <property name="hibernate.connection.isolation">2</property> <property name="hibernate.format_sql">true</property> <property name="jdbc.fetch_size">50</property> <property name="jdbc.batch_size">25</property> <property name="jdbc.use_scrollable_resultset">false</property> <property name="connection.useUnicode">true</property> <!--编码方式--> <property name="connection.characterEncoding">gbk</property> <!--数据库方言,每个数据库都有方言,hibernate已经为大多数数据库指明了方言--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <mapping resource="com/lr/UserInfo.hbm.xml" /> <!-- mapping resource="com.lr.UserInfo.java" --> </session-factory> </hibernate-configuration>
9.HibernateTest.java
package com.lr; import java.util.Iterator; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class HibernateTest { public static void main(String[] args) { Configuration conf = new Configuration().configure() ; SessionFactory sessions = conf.buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = null; try { // 开始事务 tx = session.beginTransaction(); // //给对象设定值 UserInfo u = new UserInfo(); u.setUserName("李四"); u.setPassword("123456"); System.out.println("start..."); //保存数据到数据库 session.save(u); // 从持久化类UserInfo中读取数据 UserInfo user = (UserInfo) session.get(UserInfo.class, new Integer(1)) ; System.out.println("UserName:"+user.getUserName()); //load前提是存在指定的数据,用get数据库中可没有指定的记录 //删除记录 String hqld = "delete UserInfo where id=9" ; Query queryd = session.createQuery(hqld) ; queryd.executeUpdate() ; //使用hql语句 String hqls = "from UserInfo userInfo where userInfo.userName like ?"; Query querys = session.createQuery(hqls); querys.setParameter(0, "l%"); List list = querys.list(); // 结束事务 tx.commit(); Iterator<?> it = list.iterator(); while (it.hasNext()) { UserInfo userInfo = (UserInfo) it.next(); System.out.println(userInfo.getUserName()); } System.out.println("it is successful!"); } catch (HibernateException e) { System.out.println(e.getMessage()); //e.printStackTrace(); if (tx != null) { tx.rollback(); } } finally { session.close(); } } }
12.可能会遇到的问题
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. start... Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException at org.hibernate.hql.ast.ASTQueryTranslatorFactory.createQueryTranslator(ASTQueryTranslatorFactory.java:27) at org.hibernate.impl.SessionFactoryImpl.createQueryTranslators(SessionFactoryImpl.java:357) at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:423) at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884) at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:865) at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:89) at com.lr.HibernateTest.main(HibernateTest.java:41) Caused by: java.lang.ClassNotFoundException: antlr.ANTLRException at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) ... 7 more |