Spring JDBC Annotation
思想:去掉配置文件,实现注解开发。
@Transactional 是声明式事务管理 编程中使用的注解。三个属性分别是事物的隔离级别、只读、事物的传播行为。
- 新建com.config包,创建两个配置类,代替applicationContext.xml
package com.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
@Configuration//用于定义配置类,可替换xml配置文件
@ComponentScan("com")//自动扫描组件
@PropertySource("classpath:db.properties")
@Import({DaoConfig.class})
public class AppConfig {
}
package com.config;
import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.service.UserServiceImpl;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
@Configuration
public class DaoConfig {
@Value("com.mysql.jdbc.Driver")
private String driverClass;
@Bean(name = "dataSource")
@Scope("singleton")
public DataSource createDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driverClass);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/spring");
dataSource.setUser("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public UserDao createUserDao(@Qualifier("dataSource") DataSource ds){
UserDaoImpl dao = new UserDaoImpl();
dao.setDataSource(ds);
return dao;
}
@Bean
public DataSourceTransactionManager createTransactionManager(DataSource dataSource){
DataSourceTransactionManager m = new DataSourceTransactionManager();
m.setDataSource(dataSource);
return m;
}
}
- UserServiceImpl
package com.service;
import com.dao.UserDao;
import com.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
@Service
@Transactional(isolation = Isolation.REPEATABLE_READ,readOnly = false,propagation = Propagation.REQUIRED)
public class UserServiceImpl implements UserService{
@Autowired
private UserDao dao;
@Override
public void addUser(User user) {
dao.addUser(user);
}
@Override
@Transactional(readOnly = false)//覆盖属性
public User findUserByName(String name) {
return dao.findUserByName(name);
}
@Override
public void updateUser(User user) {
dao.updateUser(user);
}
@Override
public void deleteUser(String name) {
dao.deleteUser(name);
}
}
- 测试类
package com.test;
import com.entity.User;
import com.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)//创建容器
@ContextConfiguration(classes = com.config.AppConfig.class)//指定配置文件路径
public class Test3 {
@Autowired
private UserService us;
@Test
public void t(){
User user = new User();
user.setName("rose");
us.addUser(user);
}
}