spring注解开发(Spring整合MyBatis——Mapper署理开发模式、(Spring、MyBa ...

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
  一、纯MyBatis独立开发程序。
  (1)数据库与数据表。
  (2)实体类。
  (3)dao层接口。(Mapper署理模式、无SQL映射文件——注解配置映射关系)
  (4)MyBatis焦点配置文件。
  (5)应用测试程序。(类App)
  二、Spring整合MyBatis的思路分析。(Spring管理哪个bean?)
  (1)MyBatis运行程序分析。
  <1>初始化SqlSessionFactory。
  <2>获取连接(SqlSession)。获取xxxMapper接口。
  <3>调用数据层方法完成操作。
  <4>关闭连接。
  (2)MyBatis焦点配置文件分析。
  <1>初始属性、加载外部资源文件。
  <2>初始化范例别名。
  <3>配置数据源连接信息。
  <4>初始化映射配置。
  (3)分析小结。
  三、Spring整合MyBatis。(实操)
  (1)导入Spring整合Mybatis焦点依靠坐标。
  <1>spring-context。(基础焦点)
  <2>druid。(阿里数据源)
  <3>mybatis。(基础焦点)
  <4>mysql-connector-java。(mysql焦点jar)
  <5>spring-jdbc。(spring操作数据库焦点jar)
  <6>mybatis-spring。(spring整合mybatis焦点jar)
  <7>lombok。(快速开发)
  (2)service层。
  <1>AccountService接口。
  <2>AccountServiceImpl实现类。
  (3)dao层。(Mapper署理模式开发)
  (4)Jdbc配置类。(配置数据源信息)
  (5)MyBatis配置类。(取代MyBatis焦点配置文件)
  <1>SqlSessionFactoryBean、MapperScannerConfigurer对象。
  (6)Spring配置类。
  (7)测试程序。(类App02)
  
  
  一、纯MyBatis独立开发程序。

   (1)数据库与数据表。

  

  • 数据库:hyl。数据表:tb_account。
  

  
  (2)实体类。

  

  • pom文件引入Lombok依靠。(帮助快速开发:无需手动提供getter、setter方法、构造器、toString()方法等...)
  1. <!--Lombok依赖坐标-->
  2.         <dependency>
  3.             <groupId>org.projectlombok</groupId>
  4.             <artifactId>lombok</artifactId>
  5.             <version>1.18.30</version>
  6.             <scope>provided</scope>
  7. </dependency>
复制代码

  

  • 在包(domain)下创建对应数据库字段的实体类用于封装。
  • 实体类上使用注解@Data使Lombok生效。
  1. package com.hyl.domain;
  2. import lombok.Data;
  3. @Data
  4. public class Account {
  5.     private Integer id;
  6.     private String name;
  7.     private Double money;
  8. }
复制代码

  (3)dao层接口。(Mapper署理模式、无SQL映射文件——注解配置映射关系)

  

  • 只有接口无实现类。使用Mapper署理模式这一套开发模式。
  • 无SQL映射文件。使用注解情势(@Select、@Insert、@Delete、@Update)配置其映射关系并完成SQL语句的书写。
  1. package com.hyl.dao;
  2. import com.hyl.domain.Account;
  3. import org.apache.ibatis.annotations.Delete;
  4. import org.apache.ibatis.annotations.Insert;
  5. import org.apache.ibatis.annotations.Select;
  6. import org.apache.ibatis.annotations.Update;
  7. import java.util.List;
  8. /**
  9. * 数据层的操作接口
  10. */
  11. public interface AccountDao {
  12.     /**
  13.      * 新增
  14.      */
  15.     @Insert("insert into tb_account (name,money) values (#{name},#{money})")
  16.     void save(Account account);
  17.     /**
  18.      * 根据id删除
  19.      */
  20.     @Delete("delete from tb_account where id = #{id}")
  21.     void delete(Integer id);
  22.     /**
  23.      * 更新
  24.      * @param account
  25.      */
  26.     @Update("update tb_account set name = #{name} , money = #{money} where id = #{id}")
  27.     void update(Account account);
  28.     /**
  29.      * 查询所有
  30.      * @return
  31.      */
  32.     @Select("select * from tb_account ")
  33.     List<Account> selectAll();
  34.     /**
  35.      * 根据id查询
  36.      * @param id
  37.      * @return
  38.      */
  39.     @Select("select * from tb_account where id = #{id}")
  40.     Account selectById(Integer id);
  41. }
复制代码

  (4)MyBatis焦点配置文件。

  

  • pom文件引入mybatis焦点依靠与Java连接数据库焦点依靠。
  1. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  2. <!--mybatis依赖-->
  3. <dependency>
  4.             <groupId>org.mybatis</groupId>
  5.             <artifactId>mybatis</artifactId>
  6.             <version>3.5.6</version>
  7. </dependency>
  8. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  9. <!--mysql驱动-->
  10. <dependency>
  11.             <groupId>mysql</groupId>
  12.             <artifactId>mysql-connector-java</artifactId>
  13.             <version>8.0.28</version>
  14. </dependency>
复制代码

  

  • <properties>加载外部properties配置文件。
  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/hyl
  3. jdbc.username=root
  4. jdbc.password=root123
复制代码

  

  • 加载JDBC连接MySQL的数据源连接信息。
  • <mappers>中的<package>注册指定包下的全部mapper接口。
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.     <properties resource="db.properties"></properties>
  7.     <settings>
  8.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  9.     </settings>
  10.    
  11.     <typeAliases>
  12.         <package name="com.hyl.domain"/>
  13.     </typeAliases>
  14.     <environments default="development">
  15.         <environment id="development">
  16.             <!--配置JDBC事务管理-->
  17.             <transactionManager type="JDBC"></transactionManager>
  18.             <dataSource type="POOLED">
  19.                 <property name="driver" value="${jdbc.driver}"/>
  20.                 <property name="url" value="${jdbc.url}"/>
  21.                 <property name="username" value="${jdbc.username}"/>
  22.                 <property name="password" value="${jdbc.password}"/>
  23.             </dataSource>
  24.         </environment>
  25.     </environments>
  26.     <mappers>
  27.         <package name="com.hyl.dao"/>
  28.     </mappers>
  29. </configuration>
复制代码

  (5)应用测试程序。(类App)

  

  • 获得SqlSessionFactory对象。
  • 获得SqlSession对象。
  • 通过SqlSession对象调用getMapper("实验业务的接口.class")获取真正实验业务操作的xxxMapper接口。
  • 通过调用对应的方法实验查询操作即可。
  • 末了开释SqlSession对象资源。
  1. package com.hyl;
  2. import com.hyl.dao.AccountDao;
  3. import com.hyl.domain.Account;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. public class App {
  11.     public static void main(String[] args) throws IOException {
  12.         //1.创建sqlSessionFactoryBuilder对象
  13.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  14.         //加载mybatis主配置文件
  15.         InputStream resourceAsStream = Resources.getResourceAsStream("mybatisConfig.xml");
  16.         //3.创建SqlSessionFactory对象
  17.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
  18.         //4.创建SqlSession对象
  19.         SqlSession sqlSession = sqlSessionFactory.openSession();
  20.         //5.执行SqlSession对象的getMapper方法获取执行业务的接口Mapper
  21.         AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
  22.         Account account = accountDao.selectById(1);
  23.         System.out.println("查询结果:"+account);
  24.         //6.释放SqlSession资源
  25.         sqlSession.close();
  26.     }
  27. }
复制代码

  

  • 测试类App程序运行结果如下。
  

  二、Spring整合MyBatis的思路分析。(Spring管理哪个bean?)

   (1)MyBatis运行程序分析。

  

  • 从上面的纯MyBatis开发项目标运行程序(App)分析。并将其拆分为几个紧张的模块。
  
  

  • 由于Spring是用来管理bean的,那么须要确定有哪些bean是须要交给Spring管理的!
  <1>初始化SqlSessionFactory。

  

  • 焦点对象SqlSessionFactory。(须要交给spring管理)
  

  
  <2>获取连接(SqlSession)。获取xxxMapper接口。

  

  • 无焦点须要被spring管理的对象。
  • SqlSession对象是由SqlSessionFactory初始化谁人阶段就已经造好。
  

  
  <3>调用数据层方法完成操作。

  

  • 无焦点须要被spring管理的对象。
  • 虽然accountDao是实验业务的对象,但仍旧不是根源的对象。而且随着业务的更换,造出的对象也会更新。
  

  
  <4>关闭连接。

  

  • 无焦点须要被spring管理的对象。
  

  
  (2)MyBatis焦点配置文件分析。

  

  • MyBatis焦点配置文件全部的配置都是围绕着SqlSessionFactory对象举行的。
  
  <1>初始属性、加载外部资源文件。

  

  • 读取外部文件的值。不是焦点关键所在。
  

  
  <2>初始化范例别名。

  

  • 操作数据库得到的数据结果举行封装到对应的实体类中。次要焦点。
  

  
  <3>配置数据源连接信息。

  

  • 配置数据源对象DataSource。焦点所在。
  • 造出SqlSession对象是操作对应的数据库的。而这些配置都是为焦点对象SqlSessionFactory服务的。
  

  
  <4>初始化映射配置。

  

  • 这部分主要关于业务的操作。
  • 初始化SqlSessionFactory对象后,再根据差异的配置、差异的接口,获得差异的xxxMapper,再去操作差异的库与表。所以也不是焦点关键所在。
  

  
  (3)分析小结。

  

  • 最终颠末分析:MyBatis焦点的对象SqlSessionFactory是须要交给Spring举行管理的。
  三、Spring整合MyBatis。(实操)



  • 注:数据库、数据表、实体类的代码与纯MyBatis开发程序同等。
   (1)导入Spring整合Mybatis焦点依靠坐标。

  <1>spring-context。(基础焦点)

  1.         <dependency>
  2.             <groupId>org.springframework</groupId>
  3.             <artifactId>spring-context</artifactId>
  4.             <version>5.3.18</version>
  5.         </dependency>
复制代码

  <2>druid。(阿里数据源)

  1. <!--阿里数据库连接池druid-->
  2.         <dependency>
  3.             <groupId>com.alibaba</groupId>
  4.             <artifactId>druid</artifactId>
  5.             <version>1.2.8</version>
  6.         </dependency>
复制代码

  <3>mybatis。(基础焦点)

  1. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  2.         <!--mybatis依赖-->
  3.         <dependency>
  4.             <groupId>org.mybatis</groupId>
  5.             <artifactId>mybatis</artifactId>
  6.             <version>3.5.6</version>
  7.         </dependency>
复制代码

  <4>mysql-connector-java。(mysql焦点jar)

  1. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  2.         <!--mysql驱动-->
  3.         <dependency>
  4.             <groupId>mysql</groupId>
  5.             <artifactId>mysql-connector-java</artifactId>
  6.             <version>8.0.28</version>
  7.         </dependency>
复制代码

  <5>spring-jdbc。(spring操作数据库焦点jar)

  1. <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
  2.         <dependency>
  3.             <groupId>org.springframework</groupId>
  4.             <artifactId>spring-jdbc</artifactId>
  5.             <version>5.3.18</version>
  6.         </dependency>
复制代码

  <6>mybatis-spring。(spring整合mybatis焦点jar)

  

  • 注意这个jar与mybatis的基础依靠的版本是有联系的。随着版本的更替都会更替。
  1. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
  2.         <dependency>
  3.             <groupId>org.mybatis</groupId>
  4.             <artifactId>mybatis-spring</artifactId>
  5.             <version>1.3.1</version>
  6.         </dependency>
复制代码

  <7>lombok。(快速开发)

  1. <!--Lombok依赖坐标-->
  2.         <dependency>
  3.             <groupId>org.projectlombok</groupId>
  4.             <artifactId>lombok</artifactId>
  5.             <version>1.18.30</version>
  6.             <scope>provided</scope>
  7.         </dependency>
复制代码

  (2)service层。

  <1>AccountService接口。

  1. package com.hyl.service;
  2. import com.hyl.domain.Account;
  3. import java.util.List;
  4. public interface AccountService {
  5.     /**
  6.      * 新增
  7.      * @param account
  8.      */
  9.     void save(Account account);
  10.     /**
  11.      * 更新
  12.      * @param account
  13.      */
  14.     void update(Account account);
  15.     /**
  16.      * 删除
  17.      * @param id
  18.      */
  19.     void delete(Integer id);
  20.     /**
  21.      * 根据id查询
  22.      * @param id
  23.      * @return
  24.      */
  25.     Account selectById(Integer id);
  26.     /**
  27.      * 查询所有
  28.      * @return
  29.      */
  30.     List<Account> selectAll();
  31. }
复制代码

  <2>AccountServiceImpl实现类。

  

  • 使用注解@Service将该实现类交给spring容器管理。
  • 使用注解@Autowired完成dao层AccountDao的主动装配。
  1. package com.hyl.service.impl;
  2. import com.hyl.dao.AccountDao;
  3. import com.hyl.domain.Account;
  4. import com.hyl.service.AccountService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class AccountServiceImpl implements AccountService {
  10.     @Autowired
  11.     private AccountDao accountDao;
  12.     @Override
  13.     public void save(Account account) {
  14.         accountDao.save(account);
  15.     }
  16.     @Override
  17.     public void update(Account account) {
  18.         accountDao.update(account);
  19.     }
  20.     @Override
  21.     public void delete(Integer id) {
  22.         accountDao.delete(id);
  23.     }
  24.     @Override
  25.     public Account selectById(Integer id) {
  26.         return accountDao.selectById(id);
  27.     }
  28.     @Override
  29.     public List<Account> selectAll() {
  30.         return accountDao.selectAll();
  31.     }
  32. }
复制代码

  (3)dao层。(Mapper署理模式开发)

  

  • AccountDao接口。
  • 无SQL映射文件。(使用注解@Selcet、@Insert、@Delete、@Update配置映射关系与SQL语句)
  1. package com.hyl.dao;
  2. import com.hyl.domain.Account;
  3. import org.apache.ibatis.annotations.Delete;
  4. import org.apache.ibatis.annotations.Insert;
  5. import org.apache.ibatis.annotations.Select;
  6. import org.apache.ibatis.annotations.Update;
  7. import java.util.List;
  8. /**
  9. * 数据层的操作接口
  10. */
  11. public interface AccountDao {
  12.     /**
  13.      * 新增
  14.      */
  15.     @Insert("insert into tb_account (name,money) values (#{name},#{money})")
  16.     void save(Account account);
  17.     /**
  18.      * 根据id删除
  19.      */
  20.     @Delete("delete from tb_account where id = #{id}")
  21.     void delete(Integer id);
  22.     /**
  23.      * 更新
  24.      * @param account
  25.      */
  26.     @Update("update tb_account set name = #{name} , money = #{money} where id = #{id}")
  27.     void update(Account account);
  28.     /**
  29.      * 查询所有
  30.      * @return
  31.      */
  32.     @Select("select * from tb_account ")
  33.     List<Account> selectAll();
  34.     /**
  35.      * 根据id查询
  36.      * @param id
  37.      * @return
  38.      */
  39.     @Select("select * from tb_account where id = #{id}")
  40.     Account selectById(Integer id);
  41. }
复制代码

  (4)Jdbc配置类。(配置数据源信息)

  

  • 使用注解@Bean标明返回数据源对象的方法。这样Spring会主动将DataSource对象交给Spring容器管理。别的的组件(bean)都可以使用。
  1. package com.hyl.config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import javax.sql.DataSource;
  6. public class JdbcConfig {
  7.     @Value("${jdbc.driver}")
  8.     private String driver;
  9.     @Value("${jdbc.url}")
  10.     private String url;
  11.     @Value("${jdbc.username}")
  12.     private String userName;
  13.     @Value("${jdbc.password}")
  14.     private String password;
  15.     /**
  16.      * 1、定义方法,返回需要管理的bean(这里使用阿里提供的第三方数据源druid)
  17.      * 2、使用注解@Bean 将方法的返回值声明为一个Spring管理的Bean。
  18.      * 这意味着Spring会调用这个方法,并将方法的返回值(bean)存储到Spring容器中,供其他组件使用。
  19.      */
  20.     @Bean
  21.     public DataSource dataSource(){
  22.         DruidDataSource druidDataSource = new DruidDataSource();
  23.         druidDataSource.setDriverClassName(driver);
  24.         druidDataSource.setUrl(url);
  25.         druidDataSource.setUsername(userName);
  26.         druidDataSource.setPassword(password);
  27.         return druidDataSource;
  28.     }
  29. }
复制代码

  (5)MyBatis配置类。(取代MyBatis焦点配置文件)

  

  • 使用注解@Bean标明返回SqlSessionFactory对象的方法。这样Spring会主动将SqlSessionFactory对象交给Spring容器管理。别的的组件(bean)都可以使用。
  
  

  • 由于根据上方分析:SqlSessionFactory对象的初始化都与MyBatis焦点配置文件有关,所以在返回SqlSessionFactory的方法内里要设置很多东西!
  <1>SqlSessionFactoryBean、MapperScannerConfigurer对象。

  

  • 为了简化开发,spring整合mybatis中提供了类SqlSessionFactoryBean制造bean。
  

  
  

  • 最终的Mybatis配置类的代码如下。
  1. package com.hyl.config;
  2. import org.mybatis.spring.SqlSessionFactoryBean;
  3. import org.mybatis.spring.mapper.MapperScannerConfigurer;
  4. import org.springframework.context.annotation.Bean;
  5. import javax.sql.DataSource;
  6. public class MyBatisConfig {
  7.     @Bean
  8.     public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
  9.         SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
  10.         //代替Mybatis核心配置文件标签<typeAliases>
  11.         ssfb.setTypeAliasesPackage("com.hyl.domain");
  12.         //因为Jdbc配置类的方法使用了@Bean注解生产DataSource对象的方法。
  13.         // 则可以使用形参注入DataSource。再通过方法设置使DataSource
  14.         ssfb.setDataSource(dataSource);
  15.         //jdbc事务管理默认有spring-jdbc依赖处理
  16.         return ssfb;
  17.     }
  18.     //单独方法代替Mybatis核心配置文件标签<Mappers>
  19.     //使用spring整合mybatis提供的类MapperScannerConfigurer完成映射文件的扫描
  20.     @Bean
  21.     public MapperScannerConfigurer mapperScannerConfigurer() {
  22.         MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  23.         //设置映射在哪些包下
  24.         mapperScannerConfigurer.setBasePackage("com.hyl.dao");
  25.         return mapperScannerConfigurer;
  26.     }
  27. }
复制代码

  

  • 加后缀.bak——>注释原来的MyBatis焦点配置文件。方便测试。
  

  
  (6)Spring配置类。

  

  • 为了快速的开发——所以选择纯注解的开发模式。而放弃使用XML配置文件开发模式。
  • 使用注解@Configuration标明这是spring的一个配置类。(平替spring配置文件)
  • 使用注解@ComponentScan扫描指定包下类的注解。
  • 使用注解@PropertySource加载外部properties配置文件。
  • 使用注解@Import引入别的的配置类(JdbcConfig、MyBatisConfig配置类)。
  1. package com.hyl.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.context.annotation.Import;
  5. import org.springframework.context.annotation.PropertySource;
  6. @Configuration
  7. @ComponentScan("com.hyl")
  8. @PropertySource("classpath:jdbc.properties")
  9. @Import({JdbcConfig.class,MyBatisConfig.class})
  10. public class SpringConfig {
  11. }
复制代码

  (7)测试程序。(类App02)

  

  • 通过类AnnotationConfigApplicationContext加载spring配置类。
  
  

  • spring配置类再通过注解完成别的配置类的扫描、包的注解扫描。
  
  

  • 配和注解@Service使用,用容器对象调用getBean()方法获取AccountServiceImpl对象。
  

  
  

  • 末了调用操作数据库的方法。(这里以测试根据id查询演示)。
  1. package com.hyl;
  2. import com.hyl.config.SpringConfig;
  3. import com.hyl.domain.Account;
  4. import com.hyl.service.AccountService;
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  6. public class App02 {
  7.     public static void main(String[] args) {
  8.         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
  9.         AccountService accountService = applicationContext.getBean(AccountService.class);
  10.         Account account = accountService.selectById(2);
  11.         System.out.println(account);
  12.         applicationContext.close();
  13.     }
  14. }
复制代码


  • 测试类App02程序运行结果如下。
  

  
  

  • 到这里就是就实现了Spring整合MyBatis的全部操作了!也是完成快速开发的紧张一步。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表