a.Spring对数据库访问支持
在数据库数据的访问方面,Spring本质上希望以统一的方式整合底层的持久化技术,以统一的方式进行调用以及事务管理, 避免让具体的实现侵入到业务层的代码中。Spring提供了统一的异常体系,使不同异常体系的阻抗得以消除;Spring为支持各种持久化技术都提供了简化操作的模版和回调,如下:
而所有的持久化技术都需要数据源的支持,需要在Spring核心配置文件中配置。Spring可以通过Apache的1. 使用DBCP配置数据源,如下:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destory-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3309/sampledb"
p:username="root"
p:password="1234"/>
2.获取JNDI数据源,如下:
如果应用配置在高性能服务器上,可以使用应用本身提供的数据源。下面是个简单的配置:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" p:jndiName="java:comp/env/jdbc/bbt"/>
通过jndiName指定引用的JNDI数据源名称。
b.Spring配置文件中配置Dao的4个步骤:
1.定义DataSource
2.定义JdbcTemplate
3.声明一个抽象的<bean>,以便Dao使用JdbcTemplate的配置
4.配置具体的Dao
b1.Spring使用JdbcTemplate进行数据库操作
在spring的核心配置文件中配置
<!--扫描包以注册注解声明的bean-->
<context:component-scan base-package="com.baobaotao"/>
<!--配置数据源-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destory-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3309/sampledb"
p:username="root"
p:password="1234"/>
<!--声明JdbcTemplateBean-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource"/>
在Dao中注入
package com.baobaotao.dao;
//声明一个DAO
public class ForumDao {
//注入JdbcTemplate实例
@Autowired
private JdbcTemplate jdbcTemplate;
public void initDb() {
String sql="create table t_user(userId int(20));
jdbcTemplate.execute(sql);
}
}
b2.Spring使用hibernate进行数据库操作
<!--配置数据源-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destory-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3309/sampledb"
p:username="root"
p:password="1234"/>
<!--hibernate配置-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<!--指定Hibernate实体映射文件-->
<property name="mappingLocations">
<list>
<value>classpath*:/com/baobaotao/domain/Forum.hbm.xml</value>
</list>
</property>
<!--制定hibernate配置属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
</bean>
Forum.hbm.xml配置
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="com.baobaotao.domain.Forum" table="t_forum">
<property name="userId" column="user_id"/>
</class>
</hibernate-mapping>
Forum的domain
package com.baobaotao.domain;
public class Forum {
public String userId;
....get/set..
}
Forum相关的Dao操作
package com.baobaotao.dao.hibernate;
public class ForumHibernateDao {
@Autowired
private HibernateTemplate hibernateTemplate;
public void addForum(Forum forum) {
hibernateTemplate.save(forum);
}
}
b3.Spring使用Mybatis进行数据库操作
在spring核心配置文件中配置:
<!---配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/sampledb"
p:username="root"
p:password=""/>
<!--配置sessionFactory-->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:mybatisConfig.xml"/>
<!--配置sqlSessionTemplate-->
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
在mybatisConfig.xml中进行mybatis相关配置:
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--指定数据库domain中表的别名-->
<typeAlias alias="User" type="com.baobaotao.domain.MybatisUser"/>
</typeAliases>
<mappers>
<!--指定Dao相关的映射操作文件,此文件放在java文件中的com.baobaotao.dao这个包中-->
<mapper resource="com/baobaotao/dao/MybatisUser.xml"/>
</mappers>
</configuration>
MybatisUser.xml相关的操作配置
<!--指定映射文件唯一的命名空间-->
<mapper namespace="com.baobaotao.dao.MybatisUser">
<!--指定Dao中实现的各个函数以及输入输出-->
<select id="getMatchCount" resultType="long" parameterType="User">
select
count(*)
from
t_user where user_name=#{userName} and password=#{password}
</select>
<select id="findUserByUserName" resultType="User" parameterType="String">
select
*
from
t_user where user_name=#{userName}
</select>
<update id="updateLoginInfo" parameterType="User">
update
t_user
set
credits=#{credits} where user_id=#{userId}
</update>
</mapper>
Dao的实现类:
@Repository
public class MybatisUserDao {
@Autowired
private SqlSessionTemplate sessionTemplate;
public long getMatchCount(String userName, String password) {
MybatisUser user = new MybatisUser();
user.setUserName(userName);
user.setPassword(password);
return (Long)sessionTemplate.selectOne("com.baobaotao.dao.MybatisUser.getMatchCount", user);
}
public MybatisUser findUserByUserName(final String userName) {
List<MybatisUser> users = sessionTemplate.selectList("com.baobaotao.dao.MybatisUser.findUserByUserName", userName);
if (users == null || users.size() == 0) {
return null;
}
return users.get(0);
}
public void updateLoginInfo(MybatisUser user) {
sessionTemplate.update("com.baobaotao.dao.MybatisUser.updateLoginInfo", user);
}
}
User表对应的domain
package com.baobaotao.domain;
import java.util.Date;
public class MybatisUser {
// @Id
// @Column(name="user_id")
int userId;
// @Column(name="user_name")
String userName;
// @Column(name="credits")
int credits;
// @Column(name="password")
String password;
// @Column(name="last_visit")
Date lastVisit;
String lastIp;
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return this.userName;
}
public void setCredits(int credits) {
this.credits = credits;
}
public int getCredits() {
return this.credits;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return this.password;
}
public void setLastVisit(Date lastVisit) {
this.lastVisit = lastVisit;
}
public Date getLastVisit() {
return this.lastVisit;
}
public void setLastIp(String lastIp) {
this.lastIp = lastIp;
}
public String getLastIp() {
return this.lastIp;
}
}