Spring整合MyBatis的两种方式
Spring整合MyBatis的三种方式
文章目录
- Spring整合MyBatis的三种方式
- 1.简介
- 2.准备
- 【方法一--------接口代理】
- 对项目进行分层分包:
- UserDao接口(数据访问层):
- JavaBean对象:
- UserService接口(业务逻辑层):
- UserServiceImpl实现类:
- UserDaoMapper文件:
- jdbc配置文件:
- Spring配置文件:
- 通知(前置、后置、环绕):
- 测试类:
- 【方法二--------注解】
- 对项目进行分层分包:
- UserDao接口(数据访问层):
- JavaBean对象:
- UserService接口(业务逻辑层):
- UserServiceImpl实现类:
- Spring配置类:
- 测试类:
1.简介
Spring Boot是一个简化Spring开发的框架。用来监护spring应用开发,约定大于配置,去繁就简,just run 就能创建一个独立的,产品级的应用。
我们在使用Spring Boot时只需要配置相应的Spring Boot就可以用所有的Spring组件,简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。
2.准备
新建一个Maven项目,在pom文件中加入所需依赖,pom文件
如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>NewSpringMyBatiesTest</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.encoding>UTF-8</maven.compiler.encoding></properties><dependencies><!-- MyBatis 依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><!--德鲁伊连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.20</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- 添加lombok依赖 --><!--spring核心配置文件--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><!--Spring整合junit单元测试依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.2.RELEASE</version><scope>test</scope></dependency><!-- aop切面的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.1.6.RELEASE</version></dependency></dependencies>
</project>
【方法一--------接口代理】
对项目进行分层分包:
UserDao接口(数据访问层):
public interface UserDao {public List<UserMe> SelectAll();public int insert(UserMe user);public int update(UserMe user);public int delete(Integer id);public UserMe select(int id);
}
JavaBean对象:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserMe {private Integer id;private String username;private String password;private Integer age;private String email;
}
UserService接口(业务逻辑层):
public interface UserService {public List<UserMe> SelectAll();public int insert(UserMe user);public int update(UserMe user);public int delete(Integer id);public UserMe select(int id);
}
UserServiceImpl实现类:
public class UserServiceImpl implements UserService {private UserDao userDao;@Overridepublic List<UserMe> SelectAll() {return userDao.SelectAll();}@Overridepublic int insert(UserMe user) {return userDao.insert(user);}@Overridepublic int update(UserMe user) {return userDao.update(user);}@Overridepublic int delete(Integer id) {return userDao.delete(id);}@Overridepublic UserMe select(int id) {return userDao.select(id);}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}
}
UserDaoMapper文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.example.Dao.UserDao"><select id="SelectAll" resultType="org.example.JavaBean.UserMe">select *from userme</select><select id="select" resultType="org.example.JavaBean.UserMe">select *from usermewhere id = #{id}</select><update id="insert" >insert into usermevalues (null,#{username},#{password},#{age},#{email})</update><update id="update" >update usermeset username=#{username},password=#{password},age=#{age},email=#{email}where id = #{id}</update><delete id="delete" parameterType="int">deletefrom usermewhere id = #{id}</delete></mapper>
jdbc配置文件:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/tables3?serverTimezone=UTC&useSSL=true&allowPublicKeyRetrieval=true
user=root
password=123456
Spring配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--加载配置文件(locaiton:指定位置、classpath:从目录查找文件)--><context:property-placeholder location="classpath:SpringContext.properties"/><!-- 德鲁伊连接数据库--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></bean><!-- 创建工厂对象--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="mapperLocations" value="Mapper/UserDaoMapper.xml"/><property name="dataSource" ref="dataSource"/><property name="typeAliasesPackage" value="org.example.JavaBean.UserMe"/></bean><!-- 包扫描Mapper文件(即UserDaoMapper.xml)--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.example.Dao"/></bean><!-- 连接Service与Dao层--><bean class="org.example.Service.UserServiceImpl" id="userService"><property name="userDao" ref="userDao"/></bean><!-- 通知--><bean id="before" class="org.example.advice.MyBeforeAdvice"></bean><bean id="after" class="org.example.advice.MyAfterAdvice"></bean><!--环绕通知--><bean id="around" class="org.example.advice.MyMethodInterceptor"></bean><!-- 切入点--><aop:config><!-- 使用绝对路径(切入点表达式的实际匹配范围,切入点表达式过于模糊,匹配到了多次方法调用)...(切入点表达式的参数匹配错误,即参数不匹配,而..带代表任意参数数量和类型) --><aop:pointcut id="shine" expression="execution(* org.example.Service.UserService.SelectAll(..))"/><aop:pointcut id="shine02" expression="execution(* org.example.Service.UserService.insert(..))"/><aop:pointcut id="shine03" expression="execution(* org.example.Service.UserService.update(..))"/><aop:pointcut id="shine04" expression="execution(* org.example.Service.UserService.delete(..))"/><aop:pointcut id="shine05" expression="execution(* org.example.Service.UserService.select(..))"/><!-- 组装--><aop:advisor advice-ref="before" pointcut-ref="shine"/><aop:advisor advice-ref="after" pointcut-ref="shine"/><aop:advisor advice-ref="before" pointcut-ref="shine02"/><aop:advisor advice-ref="after" pointcut-ref="shine02"/><aop:advisor advice-ref="before" pointcut-ref="shine03"/><aop:advisor advice-ref="after" pointcut-ref="shine03"/><aop:advisor advice-ref="before" pointcut-ref="shine04"/><aop:advisor advice-ref="after" pointcut-ref="shine04"/><aop:advisor advice-ref="before" pointcut-ref="shine05"/><aop:advisor advice-ref="after" pointcut-ref="shine05"/><!-- 组装环绕通知--><aop:aspect ref="around"><aop:around method="aroundMethod" pointcut-ref="shine"/></aop:aspect></aop:config>
</beans>
通知(前置、后置、环绕):
/*** 后置通知**/
public class MyAfterAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {System.out.println("程序运行结束");}
}
/*** 前置通知*/
public class MyBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println("事务控制");System.out.println("日志打印");}
}
public class MyMethodInterceptor {public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {System.out.println("【前置方法】返回值"+pjp.getSignature().getName());try {Object result = pjp.proceed();System.out.println("【后置方法】"+pjp.getSignature().getName());return result;} catch (Throwable e) {System.out.println("【异常处理"+pjp.getSignature().getName());} finally {System.out.println("【最终方法】");}return null;}
}
测试类:
public class Main {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("SpringContext.xml");UserService userService = (UserService) context.getBean("userService");System.out.println("===============查找一条数据==================");UserMe select = userService.select(4);System.out.println("userMes = " + select);System.out.println("================插入一条数据=================");UserMe userMe = new UserMe(null,"赵六2","1234156",33,"33455956101@qq.com");int insert = userService.insert(userMe);System.out.println("insert = " + insert);System.out.println("=================更新一条数据================");UserMe userMe1 = new UserMe(1,"李四","33333",12,"1947643827@163.com");int update = userService.update(userMe1);System.out.println("update = " + update);
// System.out.println("=================删除一条数据================");
// int delete = userService.delete(2);
// System.out.println("delete = " + delete);System.out.println("===============查找所有数据==================");List<UserMe> userMes = userService.SelectAll();System.out.println("userMes = " + userMes);}
}
【方法二--------注解】
对项目进行分层分包:
UserDao接口(数据访问层):
@Mapper
//@Repository("UserDao")
public interface UserDao {// 查询所有数据@Select("Select * from userme")List<UserMe> SelectAll();// 查找一条数据@Select("Select * from userme where id=#{id}")UserMe SelectOne(Integer id);// 增加一条数据@Insert("Insert into userme values (null,#{username},#{password},#{age},#{email})")int InsertOne(UserMe userMe);//修改一条数据@Update("Update userme Set username=#{username},password=#{password},age=#{age},email=#{email} where id=#{id} ")int UpdateOne(UserMe userMe);// 删除一条数据@Delete("Delete from userme where id=#{id}")int DeleteOne(Integer id);
}
JavaBean对象:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserMe {private Integer id;private String username;private String password;private Integer age;private String email;public UserMe( String username, String password, Integer age, String email,Integer id) {this.id = id;this.username = username;this.password = password;this.age = age;this.email = email;}
}
UserService接口(业务逻辑层):
public interface UserService {public List<UserMe> SelectAll();public int InsertOne(UserMe user);public int UpdateOne(UserMe user);public int DeleteOne(Integer id);public UserMe SelectOne(Integer id);}
UserServiceImpl实现类:
@Service("UserService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic List<UserMe> SelectAll() {return userDao.SelectAll();}@Overridepublic int InsertOne(UserMe user) {return userDao.InsertOne(user);}@Overridepublic int UpdateOne(UserMe user) {return userDao.UpdateOne(user);}@Overridepublic int DeleteOne(Integer id) {return userDao.DeleteOne(id);}@Overridepublic UserMe SelectOne(Integer id) {return userDao.SelectOne(id);}}
Spring配置类:
@Configuration //声明该类是核心配置类
@EnableAspectJAutoProxy//代理
@ComponentScan("org.example") //开启spring注解扫描
@PropertySource("classpath:SpringContext.properties") //引入properties文件
@MapperScan("org.example.Dao")
@Aspect//切面编程
public class SpringSeting {//定义属性@Value("${driver}")private String driver;@Value("${url}")private String url;@Value("${user}")private String user;@Value("${password}")private String password;//创建数据源返回数据源,Spring会自动调用该方法,并将该对象交给IOC容器管理@Beanpublic DataSource dataSource() {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driver);druidDataSource.setUrl(url);druidDataSource.setUsername(user);druidDataSource.setPassword(password);return druidDataSource;}//创建SqlSessionFactoryBean对象,设置形参,Spring会自动去调用IOC容器中已有的数据源@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}// 定义通知类Bean@Beanpublic MyAfterAdvice after() {return new MyAfterAdvice();}@Beanpublic MyBeforeAdvice before() {return new MyBeforeAdvice();}@Beanpublic MyMethodInterceptor around() {return new MyMethodInterceptor();}// 定义切入点@Beanpublic JdkRegexpMethodPointcut point() {JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();pointcut.setPatterns("org.example.dao.*");return pointcut;}// 创建前置通知管理器@Beanpublic DefaultPointcutAdvisor beforeAdvisor() {return new DefaultPointcutAdvisor(point(), before());}// 创建后置通知管理器@Beanpublic DefaultPointcutAdvisor afterAdvisor() {return new DefaultPointcutAdvisor(point(), after());}// 创建环绕通知管理器、切入点@Pointcut("execution(* org.example.Service.*.*(..))")public void serviceMethods() {}@Around("serviceMethods()")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {MyMethodInterceptor around=around();return around.aroundMethod(pjp);}}
测试类:
@Controller
@RunWith(SpringJUnit4ClassRunner.class)//加载上下文
@ContextConfiguration(classes = SpringSeting.class)
public class Test01 {@Autowiredprivate UserService userService;/***查找一条*/@Testpublic void SelectOne() {UserMe userMe = userService.SelectOne(1);System.out.println(userMe);}/*** 查找所有*/@Testpublic void SelectAll() {List<UserMe> userMes = userService.SelectAll();for (UserMe userMe : userMes) {System.out.println(userMe);}}/*** 插入一条*/@Testpublic void InsertOne() {int i = userService.InsertOne(new UserMe(null,"苏七","55463653",21,"21424532@qq.com"));System.out.println(i);}/*** 更新一条数据*/@Testpublic void UpdateOne() {int i = userService.UpdateOne(new UserMe("早八", "123456", 29, "34325424@87j.com",1));System.out.println(i);}/*** 删除一条数据*/@Testpublic void DeleteOne() {int i = userService.DeleteOne(10);System.out.println(i);}
}
ctAll();for (UserMe userMe : userMes) {System.out.println(userMe);}}/*** 插入一条*/@Testpublic void InsertOne() {int i = userService.InsertOne(new UserMe(null,"苏七","55463653",21,"21424532@qq.com"));System.out.println(i);}/*** 更新一条数据*/@Testpublic void UpdateOne() {int i = userService.UpdateOne(new UserMe("早八", "123456", 29, "34325424@87j.com",1));System.out.println(i);}/*** 删除一条数据*/@Testpublic void DeleteOne() {int i = userService.DeleteOne(10);System.out.println(i);}
}