目录
需求分析:
持久层(StudnetDao):获取数据库数据,进行数据操作
业务层(StudentService):调用持久层中的方法
表述层(StudentController):调用业务层中的方法
最终在测试环境中调用表述层的方法
一、基于XML方式整合三层架构组件
配置文件
Spring-01.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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置Druid数据源组件 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" >
<property name="url" value="${xiaowu.url}" />
<property name="username" value="${xiaowu.username}" />
<property name="password" value="${xiaowu.password}" />
<property name="driverClassName" value="${xiaowu.driver}" />
</bean>
<!-- 配置JdbcTemplate组件 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<!-- 注入数据源为上面组件dataSource -->
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="studentDao" class="com.xiaowu.dao.impl.StudentDaoImpl" >
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<bean id="serviceImpl" class="com.xiaowu.service.impl.ServiceImpl" >
<property name="studentDao" ref="studentDao" />
</bean>
<bean id="studentController" class="com.xiaowu.controller.StudentController" >
<property name="serviceImpl" ref="serviceImpl" />
</bean>
</beans>
jdbc.properties
xiaowu.url=jdbc:mysql://localhost:3306/studb
xiaowu.driver=com.mysql.cj.jdbc.Driver
xiaowu.username=root
xiaowu.password=123456
持久层
//接口
public interface StudentDao {
List queryAll();
}
public class StudentDaoImpl implements StudentDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public List queryAll() {
String sql = "select * from students";
List students = jdbcTemplate.queryForList(sql);
return students;
}
}
业务层
public interface Service {
List findAll();
}
public class ServiceImpl implements Service {
private StudentDao studentDao;
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
public List findAll() {
List students = studentDao.queryAll();
System.out.println("students:" + students);
return students;
}
}
表述层
public class StudentController {
private ServiceImpl serviceImpl;
public void setServiceImpl(ServiceImpl serviceImpl) {
this.serviceImpl = serviceImpl;
}
public void findAll() {
List students = serviceImpl.findAll();
System.out.println("最终成绩:" + students);
}
}
运行测试
public class StudentControllerTest {
@Test
public void tset() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-jdbc.xml");
StudentController studentController = applicationContext.getBean(StudentController.class);
studentController.findAll();
}
}
二、基于注解方式整合三层架构组件
配置文件
Spring-02.xml
使用注解的方式不需要将自己写的组件写入配置文件,只需要在组件上写注解后,在xml配置文件中配置组件扫描哪个包即可
不是自己所写的组件仍然需要在xml中正常配置,因为第三方jar包为只读模式
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 导入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.xiaowu.dao,com.xiaowu.service,com.xiaowu.controller" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" >
<property name="url" value="${xiaowu.url}" />
<property name="driverClassName" value="${xiaowu.driver}" />
<property name="username" value="${xiaowu.username}" />
<property name="password" value="${xiaowu.password}" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
jdbc.properties
xiaowu.url=jdbc:mysql://localhost:3306/studb
xiaowu.driver=com.mysql.cj.jdbc.Driver
xiaowu.username=root
xiaowu.password=123456
持久层
public interface StudentDao {
List quaryAll();
}
@Repository // 持久层组件注解
public class StudentDaoImpl implements StudentDao {
@Autowired // 自动进行依赖注入
private JdbcTemplate jdbcTemplate;
@Override
public List<Students> quaryAll() {
String sql = "select * from students";
List students = jdbcTemplate.queryForList(sql);
return students;
}
}
业务层
public interface StudentService {
List<Students> findAll();
}
@Service // 业务层组件注解
public class ServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
/* 这里的set方法没有意义,因为它已经被@Autowired注解代替了
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
*/
@Override
public List<Students> findAll() {
List students = studentDao.quaryAll();
System.out.println("成绩:" + students);
return students;
}
}
表述层
public interface StudentController {
List findAll();
}
@Controller // 控制层组件注解
public class StudentControllerImpl implements StudentController {
@Autowired
private StudentService service;
@Override
public List findAll() {
List students = service.findAll();
System.out.println(students);
return students;
}
}
运行测试
public class test {
@Test
public void test1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-01.xml");
StudentControllerImpl studentController = applicationContext.getBean(StudentControllerImpl.class);
studentController.findAll();
}
}
三、基于配置类方式整合三层架构组件
只需要将注解方式的xml配置转换成配置类即可
配置类
com.xiaowu.config.MyConfig
// 解读取外部配置,替代 <context:property-placeholder标签
@PropertySource("classpath:jdbc.properties")
// 配置扫描包,替代<context:component-scan标签
@ComponentScan({"com.xiaowu.dao","com.xiaowu.service","com.xiaowu.controller"})
// 标注当前类是配置类,替代application.xml
@Configuration
public class MyConfig {
/*
@Value("${xiaowu.url}")
private String url;
@Value("${xiaowu.driver}")
private String driver;
@Value("${xiaowu.username}")
private String userName;
@Value("${xiaowu.password}")
private String password;
*/
@Bean
// 如果这些属性只在这个方法中使用,可以使用形参列表引入
public DataSource dataSource(
@Value("${xiaowu.url}") String url,
@Value("${xiaowu.driver}") String driver,
@Value("${xiaowu.username}") String userName,
@Value("${xiaowu.password}") String password
) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driver);
dataSource.setUsername(userName);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate;
}
}
测试运行
public class test {
@Test
public void test1() {
// AnnotationConfigApplicationContext 根据配置类创建 IOC 容器对象
AnnotationConfigApplicationContext applicationContext
= new AnnotationConfigApplicationContext(MyConfig.class);
StudentControllerImpl studentController = applicationContext.getBean(StudentControllerImpl.class);
studentController.findAll();
}
}
其余于注解方式一致