最近学习spring data所有又复习了一下hibernate
开发环境eclipse jdk1.7 Spring4.2.0 +Hibernate5.0.7
1.创建项目,导入jar包
(其中jaxb的三个jar包和javax.activation-api.jar不是必须的,我的没这三个包运行不了,不知道为什么,我的jdk才1.7啊)
然后右键add to build path
2.编写applicationContext.xml文件
jdbc.properties(数据库的驱动 url 、用户名、密码、连接池等)
jdbc.url=jdbc:mysql://localhost:3306/testhibernate?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.driver.class=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=200934652qwe
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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.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的SeesionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- hibernateProperties属性:配置与hibernate相关的内容,如显示sql语句,开启正向工程 -->
<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>per.czt.pojo</value>
</list>
</property>
</bean>
<!-- 配置hibernateTemplate对象 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></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="per.czt.dao,per.czt.dao.impl"/>
</beans>
环境搭建完成
3.在数据库中建一个t_users表,编写pojo对象Users
Users.java
package per.czt.pojo;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@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;
}
public Users() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Users [userid=" + userid + ", username=" + username + ", userage=" + userage + "]";
}
}
4.编写dao层和dao.impl层
UsersDao.java
package per.czt.dao;
import java.util.List;
import per.czt.pojo.Users;
public interface UsersDao {
void insertUsers(Users users);
void deleteUsers(Users users);
void updateUsers(Users users);
Users selectUsersById(Integer userid);
List<Users> selectUsersByName(String name);
List<Users> selectUsersByNameUseSQL(String name);
List<Users> selectUsersByNameUseCriteria(String name);
}
UsersDaoImpl.java
package per.czt.dao.impl;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;
import per.czt.dao.UsersDao;
import per.czt.pojo.Users;
@Repository
public class UsersDaoImpl implements UsersDao {
@Autowired(required=false)
private HibernateTemplate hibernateTemplate;
@Override
public void insertUsers(Users users) {
// TODO Auto-generated method stub
//System.out.println(hibernateTemplate);
this.hibernateTemplate.save(users);
}
@Override
public void deleteUsers(Users users) {
// TODO Auto-generated method stub
this.hibernateTemplate.delete(users);
}
@Override
public void updateUsers(Users users) {
// TODO Auto-generated method stub
this.hibernateTemplate.update(users);
}
@Override
public Users selectUsersById(Integer userid) {
// TODO Auto-generated method stub
return hibernateTemplate.get(Users.class, userid);
}
@Override
public List<Users> selectUsersByName(String name) {
// TODO Auto-generated method stub
/*
* getCurrentSession:当前session必须有事务边界,且只能处理一个事务,当事务回滚时session自动失效
* openSession:每次都会打开一个新的session,假如使用多次获得的是不同的session对象,每次使用完毕后需要手动调用close方法关闭session
*/
Session session=hibernateTemplate.getSessionFactory().getCurrentSession();
Query query=session.createQuery("from Users where username=:name");
Query queryTemp=query.setString("name", name);
return queryTemp.list();
}
@Override
public List<Users> selectUsersByNameUseSQL(String name) {
// TODO Auto-generated method stub
Session session=hibernateTemplate.getSessionFactory().getCurrentSession();
Query query=session.createSQLQuery("select * from t_users where username=?").addEntity(Users.class).setString(0, name);
return query.list();
}
@Override
public List<Users> selectUsersByNameUseCriteria(String name) {
// TODO Auto-generated method stub
Session session=hibernateTemplate.getSessionFactory().getCurrentSession();
Criteria criteria=session.createCriteria(Users.class);
criteria.add(Restrictions.eq("username", name));
return criteria.list();
}
}
5.这里就不写service层了,直接junit中测试
package per.czt.test;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import per.czt.dao.UsersDao;
import per.czt.pojo.Users;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoImplTest {
@Autowired
private UsersDao usersDao;
/*@Test
@Transactional//在测试类中对事务提交方式默认是回滚
@Rollback(value=false)//取消自动回滚
public void testInsertUsers() {
Users users=new Users();
users.setUserage(10);
users.setUsername("李四");
usersDao.insertUsers(users);
}*/
//更新用户
/*@Test
@Transactional
@Rollback(value=false)
public void testUpdateUsers() {
Users users=new Users();
users.setUserid(3);
users.setUserage(20);
users.setUsername("王五11");
usersDao.updateUsers(users);
}
@Test
public void testFindUserById() {
Users users=usersDao.selectUsersById(5);
System.out.println(users);
}
@Test
@Transactional
@Rollback(value=false)
public void deleteUser() {
Users users=usersDao.selectUsersById(5);
usersDao.deleteUsers(users);
}
@Test
@Transactional
public void testSelectUsersByName() {
String name="李四";
List<Users> usersList=usersDao.selectUsersByName(name);
for (Users users:usersList) {
System.out.println("user_id:"+users.getUserid());
}
}
@Test
@Transactional
public void testSelectUsersByNameUseSQL() {
List<Users> usersList=usersDao.selectUsersByNameUseSQL("李四");
for (Users users:usersList) {
System.out.println("user_id:"+users.getUserid());
}
}*/
@Test
@Transactional
public void testSelectUsersByNameUseCriteria() {
List<Users> usersList=usersDao.selectUsersByNameUseCriteria("李三");
for (Users users:usersList) {
System.out.println("user_id:"+users.getUserid());
}
}
}