Hibernate入门

1.核心配置文件位置放置src目录下,名称为hibernate.cxf.xml(位置和名称固定)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 1 数据库部分配置  必须-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 配置连接池 -->
        <!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
        
        <!-- 2 hibernate基本配置  可选 -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <!--
            创建数据库表,需要配置实现
            create-drop: 如果数据库存在相同的表,把表删除再创建
            create:如果数据库存在相同的表,再创建相同字段的表
            update:如果数据库存在相同的表,把表更新,如果没有表,创建表
            validate:如果数据库存在相同的表,把表更新,如果没有表,创建表;多个校验功能:数据库表字段必须和实体类属性完全一样
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!--
             配置数据库方言
             mysql做分页使用limit关键字,limit关键字只能使用在mysql里面
             oracle使用rownum,只能使用oracle里面
         -->

        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 与线程绑定 -->
        <property name="hibernate.current_session_context_class">thread</property>

        
        <!-- 3 引入映射文件 必须-->
        <mapping resource="cn/itcast/entity/User.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

2.映射配置文件:一般命名为   类名.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 完成类和表对应  
        name: 实体类全路径
        table: 数据库表名称
    -->
    <class name="cn.entity.User" table="t_user">
        <!-- 完成类里面属性和表里面字段对应 -->
        <!-- 配置实体类属性和表主键对应使用id标签
            name: 类里面属性名称
            column:表字段名称
         -->
        <id name="uid" column="uid">

            <generator class="native"></generator>
        </id>
        
        <!-- 其他属性和字段对应  
            name: 类里面属性名称
            column:表字段名称
        -->
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
        <property name="address" column="address"></property>
    </class>

</hibernate-mapping>



 配置细节问题
(1)name属性里面写实体类相关的部分
(2)column属性里面写表字段名称
(3)column属性可以省略,属性值和name属性值一样的
(4)length属性设置表字段长度,省略有默认值
(5)type属性设置字段类型
(6)双引号里面不能添加空格

3.添加测试:

@Test
	public void addUser() {
//		第一步 加载hibernate核心配置文件
		/*
		 * 到项目里面src下面找到名称是 hibernate.cfg.xml配置文件
		 * 把配置文件加载到cfg对象里面
		 * */
		Configuration cfg = new Configuration();
		cfg.configure();
		
//		第二步 创建SessionFactory对象
		/*
		 * 做很多事情:
		 * 创建sessionFactory过程中
		 * (1)找到核心文件中数据库部分,连接数据库
		 * (2)找是否需要hibernate帮创建表,
		 * ** 找到需要帮创建表,找到映射,根据映射关系在连接数据库把表创建
		 * ** 如果不需要创建表,直接返回sessionFactory对象
		 * */
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		
//		第三步 使用SessionFactory对象创建Session对象
		/*
		 * 类似于jdbc里面connection
		 * */
		Session session = sessionFactory.openSession();
		
//		第四步 开启事务
		/*
		 * hibernate建议手动控制事务
		 * */
		Transaction tx = session.beginTransaction();
		
//		第五步 调用session方法实现添加操作
		/*
		 * 不需要写sql语句
		 * 不是直接操作数据库表,操作表对应实体类对象就可以了
		 * */
		User user = new User();
		user.setUsername("东方不败");
		user.setPassword("1314520");
		user.setAddress("日本");
		
		//调用session方法实现
		session.save(user);
		
//		第六步 提交事务
		tx.commit();
		
//		第七步 关闭连接
		session.close();
		sessionFactory.close();
	}
因为创建SessionFactory过程中做很多事情,这个过程特别耗资源

解决sessionFactory耗资源问题:
(1)方案:让sessionFactory对象在一个项目里面只需要创建一次
* 类似于 ServletContext对象

(2)实现:
* 静态代码块,类加载时候执行,执行一次

public class HibernateUtils {
	static Configuration cfg = null;
	static SessionFactory sessionFactory = null;
	//静态代码块实现
	static {
		cfg = new Configuration();
		cfg.configure();
		sessionFactory = cfg.buildSessionFactory();
	}
	//提供返回sessionFactory对象的方法
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

4.根据id查询:

(1)第一个参数 实体类的Class
(2)第二个参数 id值
	//根据idc查询
	@Test
	public void getUserDemo() {
		//SessionFactory对象
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		//session对象
		Session session = sessionFactory.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		
		//根据id查询
		User user = session.get(User.class,2);
		
		System.out.println(user);
		
		//提交事务
		tx.commit();
		//关闭
		session.close();
		sessionFactory.close();
	}

5.修改操作:

@Test
	public void updateUser() {
		//SessionFactory对象
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		//session对象
		Session session = sessionFactory.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		
		//1 根据id查询
		User user = session.get(User.class, 1);
		//2 修改值,设置user对象里面值
		user.setPassword("9999");
		//3 调用方法实现修改
		/*
		 * 到user对象里面找到id值,根据id值修改对象里面其他数据
		 * */
		session.update(user);
		
		//提交事务
		tx.commit();
		//关闭
		session.close();
		sessionFactory.close();
	}

6.删除操作:

@Test
	public void deleteUser() {
		//SessionFactory对象
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		//session对象
		Session session = sessionFactory.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		
		//1 根据id查询对象
		User user = session.get(User.class, 2);
		/*
		 * 到传递user对象里面找到id值,根据id值进行删除
		 * */
		session.delete(user);
		
		//提交事务
		tx.commit();
		//关闭
		session.close();
		sessionFactory.close();
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
开始报错如下,需更换c3p0包 org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:261) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:225) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928) at test.UserTest01.save(UserTest01.java:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.hibernate.HibernateException: Could not instantiate connection provider [org.hibernate.connection.C3P0ConnectionProvider] at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:197) at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:120) at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:55) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:105) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:251) ... 34 more Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.connection.C3P0ConnectionProvider] as strategy [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:128) at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:194) ... 38 more

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值