1、IOC:控制反转,Spring容器可以完成对象的创建,属性的注入,对象管理等工作
2、Aop:面向切面,在不修改代码业务逻辑的情况下,实现原有的业务的增强
1、Spring-Ioc可以为mybatis完成DataSource、SqlSessionFactory、SqlSession以及Dao对象的创建
2、Spring-Aop可以提供事物管理切面类完成对mybatis数据库中的事务管理。
将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以,该整合,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
扫描的 Mapper 动态代理 Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插上 mybatis,两个框架就是一个整体。 使用mybatis,需要创建mybatis框架中的某些对象,使用这些对象,就可以使用mybatis提供的功能了。
SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。
dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。
数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource
drop table if exists t_user;
create table t_user (
uid int(11) primary key not null AUTO_INCREMENT,
username varchar(20),
birthday varchar(20),
sex varchar(5),
address varchar(50)
);
insert into t_user values (1, '张三', '2022-05-03', '男', '北京');
insert into t_user values (2, '李四', '2022-05-19', '男', '广州');
insert into t_user values (3, '小红', '2022-05-19', '女', '郑州');
insert into t_user values (4, '小美', '2022-05-20', '女', '郑州');
select * from t_user;
package com.su.bean;
public class User {
private Integer uid;
private String username;
private String birthday;
private String sex;
private String address;
package com.su.dao;
import com.su.bean.User;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDao {
@Select("select * from t_user")
List selectAll();
}
package com.su.service;
import com.su.bean.User;
import java.util.List;
public interface UserService {
List findAll();
}
package com.su.service.impl;
import com.su.bean.User;
import com.su.dao.UserDao;
import com.su.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserSeviceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List findAll() {
return userDao.selectAll();
}
}
关于Spring配置的说明:
Spring没有内置的提供对MyBatis的支持,配置sqlSessionFactory和userMapper所需要的class是来自于mybatis-spring-1.1.1.jar。
package com.su.servlet;
import com.su.bean.User;
import com.su.service.UserService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Test01 {
UserService userService;
@Test
public void findAllTest(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
userService=context.getBean(UserService.class);
List userList =userService.findAll();
for (User user : userList) {
System.out.println(user);
}
}
}
(主要作用就是在spring容器中声明一个Bean,同xml中的Bean节点作用相同,用在类上):
@Repository(标识DAO层)
@Service(标识Service层)
@Conmpent(用在其他组件上)
隐式注入:
@Autowired:根据类型注入
@Qualifier:更具名字注入,但是需要和Autowired连用
@Resource:jdk提供,默认根据名字注入,如果没找到名字则根据类型注入
Aop注解()
@Aspect(作用在类上,标识这是一个切面)
@Before(作用在方法上,前置增强)
@AfterReturing(作用在方法上,后置增强)
@AfterThrowing(作用在方法上,异常抛出增强)
@After(作用在方法上,最终增强)
其他注解
@Configuration:标识作用,表示这个类是一个核心配置类
@MapperScan:扫描Mapper接口,为dao层生成动态代理
@ComponentScan:扫描有注解的类所在的包
@EnableTransactionManagement:开启事务的注解
@EnableAspectJAutoProxy:开启aop的注解
@Transactional表示开启事务,作用在类上为该类所有方法都开启一个事务,也可以作用在方法上,表示当前方法开启一个事务
原始注解的局限:
上面的原始注解不能完全替代xml,如非自定义对象dataSource:
新注解:
@Bean用法:
想把某个第三方对象管理到spring容器中,就定义一个类,类里定义一个返回该对象的方法,在方法上加@Bean,如果后面要注入这个资源,就七起个名称@Bean("XXX"),如果只是交给spring管理,就不需要起名。
drop table if exists t_user;
create table t_user (
uid int(11) primary key not null AUTO_INCREMENT,
username varchar(20),
birthday varchar(20),
sex varchar(5),
address varchar(50)
);
insert into t_user values (1, '张三', '2022-05-03', '男', '北京');
insert into t_user values (2, '李四', '2022-05-19', '男', '广州');
insert into t_user values (3, '小红', '2022-05-19', '女', '郑州');
insert into t_user values (4, '小美', '2022-05-20', '女', '郑州');
select * from t_user;
public class User {
private Integer uid;
private String username;
private String birthday;
private String sex;
private String address;
调用get set方法和tostring方法
package com.su.dao;
import com.su.bean.User;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDao {
@Select("select * from t_user")
List selectAll();
}
package com.su.service;
import com.su.bean.User;
import org.springframework.stereotype.Component;
import java.util.List;
public interface UserService {
List findAll();
}
package com.su.service.impl;
import com.su.bean.User;
import com.su.dao.UserDao;
import com.su.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserSeviceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List findAll() {
return userDao.selectAll();
}
}
package com.su.config;
import com.mchange.v2.c3p0.DriverManagerDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
//@Configuration:告诉系统该类为配置类
@Configuration
//@ComponentScan("com.su"):扫描器扫描
@ComponentScan("com.su")
public class SpringConfig {
//定义一个方法 创建对应的对象 然后给对象的属性赋值 最后使用@Bean交给IOC管理该对象
@Bean
public DataSource getDataSource(){
DriverManagerDataSource dataSource=new DriverManagerDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mysql");
dataSource.setUser("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean;
}
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer scannerConfigurer =new MapperScannerConfigurer();
scannerConfigurer.setBasePackage("com.su.dao");
return scannerConfigurer;
}
}
package com.su.servlet;
import com.su.bean.User;
import com.su.config.SpringConfig;
import com.su.service.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Test01 {
UserService userService;
@Test
public void findAllTest(){
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
userService=context.getBean(UserService.class);
List userList =userService.findAll();
for (User user : userList) {
System.out.println(user);
}
}
}