Controller(接收参数调用业务层)–>Service(调用持久层,处理业务逻辑)–>Dao(与数据库交互)
DI(依赖注入):是IOC思想的一种技术实现
IOC容器是Spring提供的保存Bean对象的容器
1.Xml + 注解
2.javaConfig + 注解
通过xml配置Bean:TODO:
通过javaConfig 配置Bean:TODO:
通过注解配置Bean:TODO:
面向切面的程序设计思想。横向的调用。
eg:一个日志的功能,很多的功能模块都需要去使用,可以写一个切面去做这个事情。
使用@Aspect
来标记一个普通类为切面。
连接点:比如说日志需要作用的方法。
目标对象:日志需要使用的对象。
org.springframework
spring-aop
5.3.8
org.aspectj
aspectjweaver
1.9.7
runtime
需求:SpringIOC + JDBCTemplate实现简单的数据库操作
org.springframework
spring-context
5.3.1
org.springframework
spring-core
5.3.1
org.springframework
spring-beans
5.3.1
org.springframework
spring-expression
5.3.1
jdbc依赖
org.springframework
spring-jdbc
5.3.6
mysql
mysql-connector-java
5.1.47
junit5
org.junit.jupiter
junit-jupiter-api
5.3.2
test
创建SpringConfig
类,添加@Configuration
标记为配置类。
配置数据源和JDBCTemplate
的Bean
。
/**
* @author YonC
* @date 2021/9/2
*/
@Configuration
public class SpringConfig {
@Bean
public DataSource dataSource() {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=ture&charactorEncoding=utf-8&serverTimezone=UTC");
dataSource.setUser("root");
dataSource.setPassword("123456");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
实体类:StudentPO
public class StudentPO {
private Long id;
private String name;
private String age;
public StudentPO() {
}
public StudentPO(String name, String age) {
this.name = name;
this.age = age;
}
public StudentPO(Long id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "StudentPO{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
面向接口编程,首先定义Dao层的规范接口,定义了增删改查4种方法
/**
* @author YonC
* @date 2021/9/2
*/
public interface StudentDao {
void addStudent(StudentPO student);
void delStudentById(Long id);
void updateStudent(StudentPO student);
List selectStudent();
}
接口的实现
@Repository
注解将StudentDao
注入IOC容器
@Autowired
自动装配JdbcTemplate
对象,JdbcTemplate
对象已经在SpringConfig
文件中实例化
/**
* @author YonC
* @date 2021/9/2
*/
@Repository
public class StudentDaoImpl implements StudentDao {
@Autowired
JdbcTemplate jdbcTemplate;
/*
* 增加Student
* */
@Override
public void addStudent(StudentPO student) {
jdbcTemplate.update("insert into student (name,age) values (?,?)", student.getName(), student.getAge());
}
/*
* 删除Student
* */
@Override
public void delStudentById(Long id) {
jdbcTemplate.update("delete from student where id=?", id);
}
/*
* 修改Student
* */
@Override
public void updateStudent(StudentPO student) {
String sql = "UPDATE student SET name=?,age=? where id = ? ";
Object[] args = {student.getName(), student.getAge(), student.getId()};
jdbcTemplate.update(sql, args);
}
/*
* 查询
* */
@Override
public List selectStudent() {
String sql = "select id,name,age from student";
return this.jdbcTemplate.query(sql, (rs, index) -> {
StudentPO student = new StudentPO();
student.setId(rs.getLong("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getString("age"));
return student;
});
}
}
首先定义Service层的接口
/**
* @author YonC
* @date 2021/9/2
*/
public interface StudentService {
void addStudent(StudentPO student);
void delStudentById(Long id);
void updateStudent(StudentPO student);
List selectStudent();
}
接口实现
@Service
将对象声明IOC容器中
@Autowired
自动装配IOC容器中的StudentDao
将StudentDao
对象初始化
/**
* @author YonC
* @date 2021/9/2
*/
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
@Override
public void addStudent(StudentPO student) {
studentDao.addStudent(student);
}
@Override
public void delStudentById(Long id) {
studentDao.delStudentById(id);
}
@Override
public void updateStudent(StudentPO student) {
studentDao.updateStudent(student);
}
@Override
public List selectStudent() {
return studentDao.selectStudent();
}
}
首先通过IOC容器拿到StudentService对象
private AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
// 通过Spring的IOC容器
private StudentService studentService = applicationContext.getBean(StudentService.class);
测试
/**
* @author YonC
* @date 2021/9/2
*/
class StudentServiceImplTest {
private AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
// 通过Spring的IOC容器
private StudentService studentService = applicationContext.getBean(StudentService.class);
@Test
public void testAddStudent() {
studentService.addStudent(new StudentPO("zahngsna", "999"));
System.out.println("添加成功!");
}
@Test
public void testDelStudent() {
studentService.delStudentById(3L);
System.out.println("删除成功!");
}
@Test
public void testUpdateStudent() {
//将id为3的Student的name修改为"wang",age修改为21
studentService.updateStudent(new StudentPO(1L,"wang","28"));
System.out.println("修改成功!");
}
@Test
public void testSelectStudent() {
studentService.selectStudent().forEach(System.out::println);
}
}