一、概述
- 需求描述:实现用户的增删改查功能
- 技术框架:spring,dbutils,c3p0,mysql
- 代码层级:controller(test) -> service -> dao -> db
二、XML配置版本
1. beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置service -->
<bean id="userService" class="com.lizza.service.impl.UserServiceImpl">
<!-- 注入Dao -->
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 配置dao -->
<bean id="userDao" class="com.lizza.dao.impl.UserDaoImpl">
<!-- 注入QueryRunner -->
<property name="queryRunner" ref="queryRunner"></property>
</bean>
<!-- 配置QueryRunner;QueryRunner需要配置成多例模式,避免发生线程安全问题 -->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!-- 注入数据源 -->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3360/spring"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
</beans>
2. dao层
public class UserDaoImpl implements UserDao {
private QueryRunner queryRunner;
public void setQueryRunner(QueryRunner queryRunner) {
this.queryRunner = queryRunner;
}
@Override
public int addOne(User user) {
try {
return queryRunner.update("insert into user (id, name, age) values (?, ?, ?)", user.getId(), user.getName(), user.getAge());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int deleteOne(int id) {
try {
return queryRunner.update("delete from user where id = ?", id);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int updateOne(User user) {
try {
return queryRunner.update("update user set name = ?, age = ? where id = ?", user.getName(), user.getAge(), user.getId());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public User findOne(int id) {
try {
return queryRunner.query("select * from user where id = ?", new BeanHandler<>(User.class), id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<User> findAll() {
try {
return queryRunner.query("select * from user", new BeanListHandler<>(User.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
3. service层
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 使用set注入dao
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public int addOne(User user) {
return userDao.addOne(user);
}
@Override
public int deleteOne(int id) {
return userDao.deleteOne(id);
}
@Override
public int updateOne(User user) {
return userDao.updateOne(user);
}
@Override
public User findOne(int id) {
return userDao.findOne(id);
}
@Override
public List<User> findAll() {
return userDao.findAll();
}
}
4. junit
public class UserServiceTest {
@Test
public void addOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = new User();
user.setId(4);
user.setName("test");
user.setAge(19);
Assert.assertEquals(1, userService.addOne(user));
}
@Test
public void deleteOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
Assert.assertEquals(1, userService.deleteOne(4));
}
@Test
public void updateOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = new User();
user.setId(4);
user.setName("test");
user.setAge(0);
Assert.assertEquals(0, userService.updateOne(user));
}
@Test
public void findOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = userService.findOne(1);
Assert.assertEquals(1, user.getId());
}
@Test
public void findAll() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
List<User> list = userService.findAll();
Assert.assertNotNull(list);
}
}
二、XML + Annotation 注解配置
1. beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- spring 容器创建时需要扫描的包 -->
<context:component-scan base-package="com.lizza"/>
<!-- 配置QueryRunner;QueryRunner需要配置成多例模式,避免发生线程安全问题 -->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!-- 注入数据源 -->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
</beans>
2. dao层
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private QueryRunner queryRunner;
@Override
public int addOne(User user) {
try {
return queryRunner.update("insert into user (id, name, age) values (?, ?, ?)", user.getId(), user.getName(), user.getAge());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int deleteOne(int id) {
try {
return queryRunner.update("delete from user where id = ?", id);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int updateOne(User user) {
try {
return queryRunner.update("update user set name = ?, age = ? where id = ?", user.getName(), user.getAge(), user.getId());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public User findOne(int id) {
try {
return queryRunner.query("select * from user where id = ?", new BeanHandler<>(User.class), id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<User> findAll() {
try {
return queryRunner.query("select * from user", new BeanListHandler<>(User.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
3. service层
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public int addOne(User user) {
return userDao.addOne(user);
}
@Override
public int deleteOne(int id) {
return userDao.deleteOne(id);
}
@Override
public int updateOne(User user) {
return userDao.updateOne(user);
}
@Override
public User findOne(int id) {
return userDao.findOne(id);
}
@Override
public List<User> findAll() {
return userDao.findAll();
}
}
4. junit
public class UserServiceTest {
@Test
public void addOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = new User();
user.setId(4);
user.setName("test");
user.setAge(19);
Assert.assertEquals(1, userService.addOne(user));
}
@Test
public void deleteOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
Assert.assertEquals(1, userService.deleteOne(4));
}
@Test
public void updateOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = new User();
user.setId(4);
user.setName("test");
user.setAge(0);
Assert.assertEquals(0, userService.updateOne(user));
}
@Test
public void findOne() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = userService.findOne(1);
Assert.assertEquals(1, user.getId());
}
@Test
public void findAll() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
List<User> list = userService.findAll();
Assert.assertNotNull(list);
}
}
三、Annotation 注解配置
1. annotation configuration
/**
* @Configuration
* 作用:指定当前的类是一个配置类
* @ComponentScan
* 作用:指定spring在创建容器时要扫描的包
* 属性:value,basePackages,用于指定创建容器时要扫描的包路径
* xml标签:<context:component-scan base-package="com.lizza"/>
* @Bean
* 作用:把当前方法的返回值作为bean对象存入spring容器中
* 属性:name,用于指定bean的id;默认值为方法名称
* 细节:当我们用@Bean去注解方法时,如果方法有参数,spring会按照@Autowired方式来注入参数
*/
@Configuration
@ComponentScan("com.lizza")
public class SpringConfig {
@Bean
public QueryRunner getQueryRunner(ComboPooledDataSource dataSource) {
return new QueryRunner(dataSource);
}
@Bean
public ComboPooledDataSource getDataSource() {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/spring");
dataSource.setUser("root");
dataSource.setPassword("root");
} catch (Exception e) {
e.printStackTrace();
}
return dataSource;
}
}
2. dao层
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private QueryRunner queryRunner;
@Override
public int addOne(User user) {
try {
return queryRunner.update("insert into user (id, name, age) values (?, ?, ?)", user.getId(), user.getName(), user.getAge());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int deleteOne(int id) {
try {
return queryRunner.update("delete from user where id = ?", id);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int updateOne(User user) {
try {
return queryRunner.update("update user set name = ?, age = ? where id = ?", user.getName(), user.getAge(), user.getId());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public User findOne(int id) {
try {
return queryRunner.query("select * from user where id = ?", new BeanHandler<>(User.class), id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<User> findAll() {
try {
return queryRunner.query("select * from user", new BeanListHandler<>(User.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
3. service层
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public int addOne(User user) {
return userDao.addOne(user);
}
@Override
public int deleteOne(int id) {
return userDao.deleteOne(id);
}
@Override
public int updateOne(User user) {
return userDao.updateOne(user);
}
@Override
public User findOne(int id) {
return userDao.findOne(id);
}
@Override
public List<User> findAll() {
return userDao.findAll();
}
}
4. junit
public class UserServiceTest {
@Test
public void addOne() {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
User user = new User();
user.setId(4);
user.setName("test");
user.setAge(19);
Assert.assertEquals(1, userService.addOne(user));
}
@Test
public void deleteOne() {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
Assert.assertEquals(1, userService.deleteOne(4));
}
@Test
public void updateOne() {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
User user = new User();
user.setId(4);
user.setName("test");
user.setAge(0);
Assert.assertEquals(0, userService.updateOne(user));
}
@Test
public void findOne() {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
User user = userService.findOne(1);
Assert.assertEquals(1, user.getId());
}
@Test
public void findAll() {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
List<User> list = userService.findAll();
System.out.println(list);
Assert.assertNotNull(list);
}
}
源码地址:https://github.com/KJGManGlory/spring-framework