当前位置: 首页 > news >正文

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><!--    连接ServiceDao--><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);}
}
http://www.lqws.cn/news/188173.html

相关文章:

  • 二分算法
  • 【免杀】C2免杀技术(十六)反沙箱/反调试
  • 【Linux】sed 命令详解及使用样例:流式文本编辑器
  • LLMControlsArm开源程序是DeepSeek 控制熊猫机械臂
  • react public/index.html文件使用env里面的变量
  • for(;;) 和while(1) 的无限循环用法对比,优缺点说明
  • Gerrit+repo管理git仓库,如果本地有新分支不能执行repo sync来同步远程所有修改,会报错
  • 【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
  • (nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
  • 如何防止误删除rm (万恶之源)
  • 第二十九章 读写内部FLASH
  • 国产PC系统
  • S5P6818_驱动篇(24)UART驱动
  • 通过中脑刺激相关神经回路的纤维微解剖建立连接性
  • JavaSec-SPEL - 表达式注入
  • 山东大学《数据可视化》期末复习宝典
  • 怎么让大语言模型(LLMs)自动生成和优化提示词:APE
  • 在Markdown中使用MathType插入公式
  • next,react封装axios,http请求
  • Webhook 配置备忘
  • 浏览器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何变成页面的
  • 基于Selenium+Python的web自动化测试框架
  • C++.OpenGL (3/64)着色器(Shader)深入
  • ceph 脚本,用于计算 rbd 文件存放 OSD 方法
  • 在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
  • MySQL 索引优化(Explain执行计划) 详细讲解
  • 阿里140 补环境日志
  • JS-- for...in和for...of
  • IDEA 中 Undo Commit,Revert Commit,Drop Commit区别
  • 从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)