spring提供两种方式操作数据库,一种就是jdbc另一种就是hibernate。
而Hibernate又分为两种方式 HibernateDaoSupport和HibernateTemplate(下文简写hds和ht)
- HibernateTemplate
没有HibernateDaoSupport的情况下,如果dao层想要操作数据库就需要dao类有HibernateTemplate成员对象和HibernateTemplate的setter方法,当然在变量上使用注解可以省略setter方法,然后在配置文件中向dao类注入ht,然而使用ht前需要先向ht中注入sessionFactory。
/***
* hibernateTemplate的转配模式
*/
public class CustomerDaoImpl implements CustomerDao {
// 设置hibernateTemplate属性
private HibernateTemplate hibernateTemplate;
// 必须设置set方法
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
// 插入方法
@Override
public void insert(Customer entity) {
hibernateTemplate.save(entity);
}
// 删除方法(删除实体对象)
@Override
public void delete(Customer entity) {
hibernateTemplate.delete(entity);
}
// 删除方法,按id删除
@Override
public void deleteById(Serializable id) {
hibernateTemplate.delete(this.selectById(id));
}
// 查询所有记录
@Override
public List<Customer> selectAll() {
// TODO Auto-generated method stub
List<Customer> entities = hibernateTemplate.find("from Customer");
return entities;
}
// 按照id查找记录
@Override
public Customer selectById(Serializable id) {
// TODO Auto-generated method stub
List<Customer> entitise = hibernateTemplate
.find("from Customer where id=" + id);
if (entitise.size() > 0) {
Customer entity = entitise.get(0);
return entity;
}
return null;
}
// 更新方法
@Override
public void update(Customer entity) {
// TODO Auto-generated method stub
hibernateTemplate.update(entity);
}
}
XML相关配置如下:
<context:property-placeholder location="jdbc.properties" />
<!-- c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 驱动程序 -->
<property name="driverClass">
<value>${jdbc.driverClass}</value>
</property>
<!-- 连接的url地址 -->
<property name="jdbcUrl">
<value>${jdbc.url}</value>
</property>
<!-- 连接的用户名 -->
<property name="user">
<value>${jdbc.user}</value>
</property>
<!-- 连接的密码 -->
<property name="password">
<value>${jdbc.password}</value>
</property>
<!-- 最大池数 -->
<property name="maxPoolSize">
<value>${c3p0.pool.max}</value>
</property>
<!-- 最小池数 -->
<property name="minPoolSize">
<value>${c3p0.pool.min}</value>
</property>
<!-- 默认初始化的池数 -->
<property name="initialPoolSize">
<value>${c3p0.pool.init}</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 设置数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 属性设置 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">${hibernate.show_sql}
</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
<!-- 映射文件配置 -->
<property name="mappingResources">
<list>
<value>cn/csdn/domain/Customer.hbm.xml</value>
</list>
</property>
</bean>
<!-- hibernate模板 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- dao的操作的bean -->
<bean id="customerDaoImpl" class="cn.csdn.dao.CustomerDaoImpl">
<!-- 注入依赖模板 -->
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
- HibernateDaoSupport
使用HibernateDaoSupport的情况:dao类继承HibernateDaoSupport后就只需向dao类中注入sessionFactory, hds会判断如何hibernateTemplate属性为空,就使用注入的sessionFactory创建一个HibernateTemplate 然后通过getHibernateTemplate()方法获取HibernamteTemplate,使用HibernaTemplate的方法操作数据库。
- JdbcTemplate
这种方法适合那些不喜欢hibernate的save,delete等方法,喜欢自己写。有时候jdbcTemplate查询的效率会很高。这可能是跟jdbc有关吧。
public class JdbcTemplateCreate {
//获取数据源(设置为static 是因为该jdbc多次被调用)
static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());
public static void main(String[] args) {
User user = new User();
user.setId(10);
user = query(8);
if (user == null) {
System.out.println("查询失败");
}else {
System.out.println("查询成功");
}
}
//插入,增加
public static void insert(User user) {
String sql = "insert into user(name,birthday,money)values(?,?,?)";
Object args[] = {user.getName(),user.getBirthday(),user.getMoney()};
int temp = jdbc.update(sql, args);
if (temp > 0) {
System.out.println("插入成功!");
}else{
System.out.println("插入失败");
}
}
//删除
public static void delete(int id) {
String sql = "delete from user where id = ?";
Object args[] = new Object[]{id};
int temp = jdbc.update(sql,args);
if (temp > 0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
//更新
public static void update(User user) {
String sql = "update user set name = ? where id = ?";
Object args[] = new Object[]{user.getName(),user.getId()};
int temp = jdbc.update(sql,args);
if (temp > 0) {
System.out.println("更新成功");
}else {
System.out.println("更新失败");
}
}
//查询
public static User query(int id) {
String sql = "select * from user where id = ?";
Object args[] = new Object[]{id};
//使用spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper。注意:自动绑定,需要列名称和Java实体类名字一致
Object user = jdbc.queryForObject(sql,args,new BeanPropertyRowMapper(User.class));
return (User)user;
}
}
XML配置如下:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
在类中set方法JdbTemplate就可以了,spring中的配置跟sessionFactory基本一样。个人来说还是喜欢JdbTemplate,原因一方面是能熟悉数据库语言,另一方面能快速注入配置。