myeclipse数据库连接测试失败
之前habernate找不到
先用其它的mysql客户端去连接数据库服务正常吗?比如用navicat等,借此排除数据库的服务异常问题。
不知道你这个问题是否已经解决, 如果还没有解决的话:本人最近在学习j2ee框架,学到Hibernate框架开发,花了一天时间弄懂,觉得有必要贴出来大家分享,为初学者提供一些思路。
一、创建Hibernate框架所需环境
①搭建Hibernate框架
Hibernate所需的框架只需要别忘了还有个mysql驱动也就是mysql-connector-java-5.1.18-bin.jar;这个很重要,可以自己到网上去下载,很多的啦,我在这就不赘余了。
②创建数据库,在本地创建一个测试数据库mysqldb,并创建一张User表。
③创建HibernateDemo项目
在myeclipse中(我使用的IDE是myeclipse,很好用,很多框架都直接集成的)新建一个Web Project,名称为HibernateDemo,右键直接—>Myeclipse—>Add Hibernate Capabilities—>next—>next—>选择一个数据库驱动(数据库驱动的建立稍后再后文说)—>next—>创建一个放SessionFactory类文件的包(HibernateConf)—>finish。然后右键—>build path—>Configure build path将下载的框架放进来,还有WEB-INF下lib中的数据库驱动也放进来,这样才能加载到类路径下。至此项目创建完成。
④创建持久化类和设计映射文件,使用Hibernate映射文件将POJO对象映射到数据库。
项目建好了之后,将数据库中的关系与程序中的映射关系建立好,也就是ORM(Object Relationship Mapping)映射关系。即通过POJOs(Plain Old Java Objects)类的编程模式来进行持久化,通过面向对象的方式将关系型数据库中的数据表以更为清晰的、可操作的模式展现出来。
具体操作方法:在myeclipse中可以直接切换到DB Browser模式中,双击数据库驱动找到你创建的数据库下的User表,右键—>Hibernate Reverse Engineering—>选择存放持久化对象和映射文件的位置—>finish。
⑤编写hibernate.cfg.xml配置文件
在创建项目的时候我们的hibernate.cfg.xml配置文件是自动生成的,所以该有的数据库或者映射文件列表都自动生成好了,所以改动的不多,不过比如你如果想看到操作数据库时的sql语句是否正确,你可以在配置文件中加<property name="show_sql">true</property>
等等配置
⑥编写HibernateUtil.java工具类
HibernateUtil.java工具类主要的作用是负责Hibernate的启动和负责完成存储和访问SessionFactory的工作。HibernateUtil可以很轻松的访问获取到Session,从而实现对数据的存储与获取等操作。
主要用的一些类的方式:
Configuration:用于创建SessionFactory
SessionFactory:用于创建Session
ThreadLocal:用于存储Session变量
具体代码:
package com.hibernate.entity;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*Hibernate:辅助工具类,既负责Hibernate的启动,也负责完成存储和访问SessionFactory的工作。
* 使用Hibernate类来处理java应用程序中的Hibernate的启动是一种常见的模式
*/
public class HibernateUtil {
private static SessionFactory sessionfactory;
// 创建线程局部变量threadLocal,用来保存Hibernate中的Session
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
// 使用静态代码块来初始化Hibernate
static {
try {
Configuration cfg = new Configuration().configure("/HibernateConf/hibernate.cfg.xml");// 读取配置文件hibernate.cfg.xml
sessionfactory = cfg.buildSessionFactory(); // 创建SessionFactory
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
// 获得SessionFactory的实例
public static SessionFactory getSessionFactory() {
return sessionfactory;
}
// 获得ThreadLocal对象管理的Session实例
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
// 通过sessionfactory创建session
if (sessionfactory == null) {
rebuildSessionFactory();
}
session = (sessionfactory != null) ? sessionfactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
// 关闭Session实例
public static void closeSession() throws HibernateException {
Session session = threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
// 关闭缓存和连接池
public static void shutdown() {
sessionfactory = getSessionFactory();
if (sessionfactory != null) {
sessionfactory.close();
}
}
// 重建SessionFactory
private static void rebuildSessionFactory() {
try {
Configuration cfg = new Configuration()
.configure("/HibernateConf/hibernate.cfg.xml");
sessionfactory = cfg.buildSessionFactory();
} catch (Exception e) {
System.out.println("SessionFactory build error");
e.printStackTrace();
}
}
}
注:Configuration在创建SessionFactory之前需要先通过configure()方法读取配置文件hibernate.cfg.xml,如果你直接将配置文件放在类加载路径下(也就是src)那么直接调用configure(“/hibernate.cfg.xml”)方法就可以了,但是如果你是放在比如包HibernateConf下面的那么Configuration实例就会根据参数去找了,所以这是你要将你的路径作为参数即configure(“/HibernateConf/hibernate.cfg.xml”)。
⑦编写DAO接口UserDAO
package com.hibernate.DAO;
import com.hibernate.entity.User;
public interface UserDAO {
void save(User user); // 添加用户
User findById(int id); // 查找用户
void delete(User user); // 删除用户
void update(User user); // 修改用户信息
}
⑧编写DAO层实现类UserDAOImpl
package com.hibernate.DAO;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.entity.HibernateUtil;
import com.hibernate.entity.User;
public class UserDAOImpl implements UserDAO{
//新增用户
public void save(User user) {
Session session = HibernateUtil.getSession(); //获取session
Transaction tx = session.beginTransaction(); //创建事务
try{
session.save(user);
tx.commit(); //提交事务
}catch(Exception e){
System.out.println("保存失败!");
e.printStackTrace();
tx.rollback(); //事务回滚
}finally{
HibernateUtil.closeSession(); //关闭Session资源
}
}
public User findById(int id) {
User user = null;
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
try{
user = session.get(User.class, id);
tx.commit(); //提交事务
}catch(Exception e){
System.out.println("查找失败");
e.printStackTrace();
tx.rollback(); //回滚事务
}finally{
HibernateUtil.closeSession(); //关闭Session资源
}
return user;
}
public void delete(User user) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
try{
session.delete(user);
tx.commit();
}catch(Exception e){
System.out.println("删除用户失败");
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
}
public void update(User user) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
try{
session.update(user);
tx.commit();
}catch(Exception e){
System.out.println("用户信息更新失败");
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
}
}
⑨编写测试类UserTest
package com.hibernate.DAO;
import org.junit.Test;
import com.hibernate.entity.User;
//测试用例
public class UserTest {
@Test
public void UserSave(){
UserDAO userdao = new UserDAOImpl();
try{
User user = new User();
user.setName("test1");
user.setPassword("123456");
user.setType(1);
user.setUserId(1);
userdao.save(user);
}catch(Exception e){
System.out.println("这出错了,添加失败");
e.printStackTrace();
}
}
}
程序运行结果:
备注:
建数据库驱动
切换到DB Browser视图,右键new—>填写驱动信息,导入数据库驱动包就可以了