1.创建一个maven项目Hibernate01,然后导入下面的依赖:
<dependencies> <!--Spring Ioc相关依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.18</version> </dependency> <!--Spring Aop的相关依赖--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.8.RC2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.18</version> </dependency> <!--Spring jdbc的相关依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.18</version> </dependency> <!--spring orm的相关依赖--> <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.18</version> </dependency> <!--单元测试用的依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.18</version> </dependency> <!--日志依赖--> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!--Hibernate的核心依赖,9个必须要导入--> <!-- https://mvnrepository.com/artifact/antlr/antlr --> <dependency> <groupId>antlr</groupId> <artifactId>antlr</artifactId> <version>2.7.7</version> </dependency> <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-jta_1.1_spec --> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jta_1.1_spec</artifactId> <version>1.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations --> <dependency> <groupId>org.hibernate.common</groupId> <artifactId>hibernate-commons-annotations</artifactId> <version>5.1.2.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.5.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api --> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jboss/jandex --> <dependency> <groupId>org.jboss</groupId> <artifactId>jandex</artifactId> <version>2.0.0.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.javassist/javassist --> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.28.0-GA</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging --> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.4.1.Final</version> </dependency> <!--mysql数据驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <!--连接池相关的依赖--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>5.6.7.Final</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>mchange-commons-java</artifactId> <version>0.2.19</version> </dependency> </dependencies>
在resources目录下创建一个applicationContext.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
2.然后在resources中创建一个jdbc.properties的jdbc配置文件:
jdbc.url=jdbc:mysql://localhost:3306/hibernate01 jdbc.driver.class=com.mysql.cj.jdbc.Driver jdbc.username=root jdbc.password=zc20020106
3.然后配置applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--配置读取properties文件的工具类--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置c3p0数据库连接池--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="driverClass" value="${jdbc.driver.class}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--配置Hibernate的SessionFactory--> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--hibernateProperties属性配置与Hibernate相关的内容--> <property name="hibernateProperties"> <props> <!--显示当前执行的sql语句--> <prop key="hibernate.show_sql">true</prop> <!--开启正向工程,根据实体创建表的字段--> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!--扫描实体所在的包--> <property name="packagesToScan"> <list> <value>com.haiexijun.pojo</value> </list> </property> </bean> <!--配置Hibernate的事务管理器--> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--开启注解事务处理--> <tx:annotation-driven transaction-manager="transactionManager"/> <!--配置springIOC的注解扫描--> <context:component-scan base-package="com.haiexijun"/> </beans>
通过hibernate进行CRUD的操作
1.创建数据库
创建数据库就好了,不用创建表,后面Hibernate会根据编写的实体类来自动生成数据表
2.编写实体类Users
package com.haiexijun.pojo; import javax.persistence.*; import java.io.Serializable; @Entity @Table(name = "t_users") public class Users implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)//自增 @Column(name = "userid") private Integer userId; @Column(name = "username") private String userName; @Column(name = "userage") private Integer userAge; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getUserAge() { return userAge; } public void setUserAge(Integer userAge) { this.userAge = userAge; } }
3.编写userDao接口与接口实现类
package com.haiexijun.dao; import com.haiexijun.pojo.Users; public interface userDao { void insertUsers(Users users); void updateUsers(Users users); void deleteUsers(Users users); Users selectUsersById(Integer userid); }
修改配置文件,添加HibernateTemplate对象:
<!--配置HibernateTemplate对象--> <bean id="HibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
编写userDao的实现类
package com.haiexijun.dao.impl; import com.haiexijun.dao.userDao; import com.haiexijun.pojo.Users; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Repository; @Repository public class userDaoImpl implements userDao { @Autowired private HibernateTemplate hibernateTemplate; @Override public void insertUsers(Users users) { hibernateTemplate.save(users); } @Override public void updateUsers(Users users) { hibernateTemplate.update(users); } @Override public void deleteUsers(Users users) { hibernateTemplate.delete(users); } @Override public Users selectUsersById(Integer userid) { return hibernateTemplate.get(Users.class,userid); } }
4.编写测试类
package com.haiexijun.dao.impl; import com.haiexijun.dao.userDao; import com.haiexijun.pojo.Users; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Repository; @Repository public class userDaoImpl implements userDao { @Autowired private HibernateTemplate hibernateTemplate; @Override public void insertUsers(Users users) { hibernateTemplate.save(users); } @Override public void updateUsers(Users users) { hibernateTemplate.update(users); } @Override public void deleteUsers(Users users) { hibernateTemplate.delete(users); } @Override public Users selectUsersById(Integer userid) { return hibernateTemplate.get(Users.class,userid); } }
5.HQL查询
Hibernate语言查询( Hibernate Query Language,HQL) :它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询。Hibernate查询语言(HQL)是面向对象的查询语言,其结构与SQL查询相似,不同的是,HQL查询的主体是持久化类而不是数据表。HQL提供了一种应用和数据库之间的抽象,提高了可移植性。HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写。
HQL的语法就是将原来sql语句中的表与字段名换成对象与属性的名称就可以了。
dao方法:
@Override public List<Users> selectUserByAge(Integer age){ // getCurrentSession方法返回的session,必须要有事务边界,名且只能处理唯一的一个事务。当前事务提交或者回滚后session自动失效 // openSession方法:每次都会打开一个新的session,加入每次使用多次,则获得的是不同的session对象。使用完毕后我们要手动调用close方法关闭session Session session = hibernateTemplate.getSessionFactory().getCurrentSession(); Query query=session.createQuery("from Users where userAge= :abc"); Query queryTemp=query.setInteger("abc",age); return queryTemp.list(); }
测试代码
@Test @Transactional public void testSelectUserByAge(){ List<Users> usersList= userDao.selectUserByAge(20); System.out.println(usersList); }
6.SQL查询
dao的方法
@Override public List<Users> selectUserByAgeUseSQL(Integer age){ Session session=hibernateTemplate.getSessionFactory().getCurrentSession(); Query query=session.createSQLQuery("select * from t_users where userage =?").addEntity(Users.class).setInteger(0,age); return query.list(); }
测试代码
@Test @Transactional public void testSelectByAgeUseSQL(){ List<Users> usersList=userDao.selectUserByAge(20); System.out.println(usersList); }
7.QBC查询
QBC是query by criteria的缩写。可以通过这个语法,彻底放弃掉sql语句。
dao代码:
@Override public List<Users> selectUserByAgeUseQBC(Integer age){ Session session=hibernateTemplate.getSessionFactory().getCurrentSession(); Criteria c=session.createCriteria(Users.class); c.add(Restrictions.eq("userAge",age)); return c.list(); }
测试代码:
@Test @Transactional public void testSelectUserByAgeUseQBC(){ List<Users> usersList=userDao.selectUserByAgeUseQBC(20); System.out.println(usersList); }
项目源代码GitHub地址:https://github.com/haiexijun/Hibernate01