Spring jdbcのサポート
私は小さいテストを書いて、springのJDBCに対する支持と配置の過程を熟知します
エンティティークラス:
DAO層:
DAOの実装クラス:
スプリングのプライマリプロファイルで構成するには、次の手順に従います.
ここで私はトランザクション管理を構成し、ここで私のDAOの実装クラスではjdbcTemplateをdatasourceで初期化し、プロファイルにuserDaoImplにdatasourceを注入しました.もちろんextendsも直接
JdbcDaoSupport
私のテストクラスは次のとおりです.
結果:
ここには小さな詳細があります.デフォルトではspringのエージェントを使用しています.つまり、この文です.
この場合、cglibのエージェントを使用して実装されるので、テストクラスでは次のように書くことができます.
トランザクションが構成され、コメント機能がオンになっています.
このとき,DAO実装クラスのsave()で以下のように変更した.
このとき私のテストクラスを実行すると、データは挿入に成功せず、実装クラスの上のトランザクション注釈@Transactionalを削除し、テストクラスを実行します.これも異常ですが、データはデータベースに挿入されており、トランザクションの機能が見えます.
エンティティークラス:
public class User {
private int id;
private String name;
//setter & getter
}
DAO層:
package com.xll.jdbc.dao;
import java.util.List;
import com.xll.jdbc.bean.User;
public interface UserDao {
void save(User user);
void delete(User user);
User get(int id);
List<User> getUsers();
}
DAOの実装クラス:
package com.xll.jdbc.daoImpl;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Transactional;
import com.xll.jdbc.bean.User;
import com.xll.jdbc.dao.UserDao;
@Transactional
public class UserDaoImpl implements UserDao{
private JdbcTemplate jdbcTemplate;
public void setDatasouce(DataSource datasource) {
jdbcTemplate = new JdbcTemplate( datasource);
}
public void delete(User user) {
this.jdbcTemplate.update("delete from user where id=?", new Object[]{user.getId()});
System.out.println(" !");
}
public User get(int id) {
User user = (User)this.jdbcTemplate.queryForObject("select * from user where id=?", new Object[]{id},
new UserMapper());
return user;
}
@SuppressWarnings("unchecked")
public List<User> getUsers() {
return this.jdbcTemplate.query("select * from user", new UserMapper());
}
public void save(User user) {
this.jdbcTemplate.update("insert into user(id,name) values(?,?)",
new Object[]{user.getId(),user.getName()});
System.out.println(" !");
}
private static final class UserMapper implements RowMapper {
public Object mapRow(java.sql.ResultSet rs, int rowNum)
throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
}
}
スプリングのプライマリプロファイルで構成するには、次の手順に従います.
<?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: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-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="Datasource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydb" />
<property name="username" value="root" />
<property name="password" value="123" />
<property name="initialSize" value="2" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="2" />
<property name="minIdle" value="1" />
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="Datasource" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<bean id="userDaoImp" class="com.xll.jdbc.daoImpl.UserDaoImpl">
<property name="datasouce" ref="Datasource" />
</bean>
</beans>
ここで私はトランザクション管理を構成し、ここで私のDAOの実装クラスではjdbcTemplateをdatasourceで初期化し、プロファイルにuserDaoImplにdatasourceを注入しました.もちろんextendsも直接
JdbcDaoSupport
私のテストクラスは次のとおりです.
public void testGetAll(){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
UserDao ud = (UserDao)ctx.getBean("userDaoImp");
List list = ud.getUsers();
Iterator iter = list.iterator();
while(iter.hasNext()){
User user = (User)iter.next();
System.out.println(user);
}
}
結果:
name=xiaoliang,id=7
name=xiao,id=9
ここには小さな詳細があります.デフォルトではspringのエージェントを使用しています.つまり、この文です.
UserDao ud = (UserDao)ctx.getBean("userDaoImp");
インタフェースに書いて受信しなければなりません.そうしないと、エラーを報告します.もちろん、プロファイルにこの文を加えることができます.
<aop:config proxy-target-class="true"></aop:config>
この場合、cglibのエージェントを使用して実装されるので、テストクラスでは次のように書くことができます.
UserDaoImpl ud = (UserDaoImpl)ctx.getBean("userDaoImp");
トランザクションが構成され、コメント機能がオンになっています.
このとき,DAO実装クラスのsave()で以下のように変更した.
public void save(User user) {
this.jdbcTemplate.update("insert into user(id,name) values(?,?)",
new Object[]{user.getId(),user.getName()});
int i = 10/0;
System.out.println(" !");
}
このとき私のテストクラスを実行すると、データは挿入に成功せず、実装クラスの上のトランザクション注釈@Transactionalを削除し、テストクラスを実行します.これも異常ですが、データはデータベースに挿入されており、トランザクションの機能が見えます.