• springboot 集成 mybatis


    引入依赖

    <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
    <!-- 用于事务 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
        <version>2.4.2</version>
    </dependency>
    
    <dependency>
                <groupId>org.mybatis.caches</groupId>
                <artifactId>mybatis-ehcache</artifactId>
                <version>1.1.0</version>
            </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j</artifactId>
      <version>1.3.8.RELEASE</version>
    </dependency>

     

    编写实体类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User implements Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private Integer id;
        private String name;
        private String address;
        private Date birth;
    }

    编写mapper

    package cn.taotao.demo.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Mapper;
    
    import cn.taotao.demo.domain.User;
    
    @Mapper                //指定扫描,或者在启动类加入扫描基类包的注解,见下面代码
    public interface UserMapper {
    
        int deleteUserById(Integer id);
        
        int insertUser(User user);
        
        User selectById(Integer id);
        
        int updateUserById(Integer id);
        
        List<User> queryAllUser();
    }

    编写mybatis的映射xml文件   /src/main/resources/mapper/UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.taotao.demo.mapper.UserMapper">  
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache> 
      <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete * from user where id = #{id,jdbcType=INTEGER}
      </delete>
      
      <select id="selectById"  resultType="cn.taotao.demo.domain.User">
          select * from user where id =#{id,jdbcType=INTEGER}
      </select>
      
      <insert id="insertUser" parameterType="java.lang.Integer">
          insert into user (name,address,birth) values (#{name},#{address},#{birth})
      </insert>
      
      <update id="updateUserById" parameterType="cn.taotao.demo.domain.User">
          update user set name = #{name} ,address=#{address},birth =#{birth}
      </update>
      
      <select id= "queryAllUser" resultType="cn.taotao.demo.domain.User">
          select * from user
      </select>
    </mapper>

    编写测试类

    @SpringBootTest
    class DruidApplicationTests {
    
        @Autowired
        private UserMapper mapper;
        
        
        @Test
        void contextLoads() {
            /*
             * List<User> queryAllUser = mapper.queryAllUser(); for (User user :
             * queryAllUser) {
             * System.out.println(user.getId()+user.getName()+user.getAddress()+user.
             * getBirth()); }
             */
            
            Page<Object> startPage = PageHelper.startPage(1, 5);
            List<User> queryAllUser = mapper.queryAllUser();
            System.out.println("total size:"+ startPage.getTotal() + "cur page:"+ startPage.getPageNum());
            for (User user : queryAllUser) {
                System.out.println(user.getId()+user.getName()+user.getAddress()+user.getBirth()); 
            }
        } 

    yml文件

    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: xxxx
          initial-size: 1
         
          min-idle: 2
          max-active: 50
          max-wait: 15000
          enable: true
          test-on-borrow: true
          test-on-return: true
          test-while-idle: true
          #validation-query: select 1
         # db-type: mysql
          #async-init: true
          #db-type: mysql
          #type:   com.alibaba.druid.pool.DruidDataSource  
          #监控配置
          filters: stat 
          #上面的filter是查看sql监控的。
          stat-view-servlet:
            allow: 112.38.46.177
            deny: 
            url-pattern: /druid/*
            enabled: true
            login-username: system
            login-password: 123456
          
    #      init-variants: true
    #      async-init: true
    #  cache:
    #    type: EHCACHE
        
    #    ehcache:
    #      config: classpath:ehcache.xml
    
    mybatis:
      mapper-locations:
      - classpath:mapper/*Mapper.xml
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        
    server:
      port: 80
            

    结论:

    ehcache的引入,不需要全局springboot做缓存,只要pom把类引入即可

    接口文件会自动诸如装配,只需要在接口上加入@autowire。

    ehcache.xml    /druid/src/main/resources/ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    updateCheck="false">
    <!-- xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" -->
        <!-- 磁盘保存路径 -->
        <diskStore path="D:55ehcache" />
    
        <defaultCache maxElementsInMemory="10000"
            maxElementsOnDisk="10000000" eternal="false" overflowToDisk="true"
            timeToIdleSeconds="120" timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
            
            
        </defaultCache>
         <cache name="passwordRetryCache" eternal="false"
               maxEntriesLocalHeap="2000"
               timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false"
               statistics="true">
        </cache>
        
        
    </ehcache>
    
    <!-- 属性说明: l diskStore:指定数据在磁盘中的存储位置。 l defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略 
        以下属性是必须的: l maxElementsInMemory - 在内存中缓存的element的最大数目 l maxElementsOnDisk 
        - 在磁盘上缓存的element的最大数目,若是0表示无穷大 l eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断 
        l overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上 以下属性是可选的: l timeToIdleSeconds 
        - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大 
        l timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大 diskSpoolBufferSizeMB 
        这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区. l diskPersistent 
        - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。 l diskExpiryThreadIntervalSeconds 
        - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作 l memoryStoreEvictionPolicy 
        - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出) -->

    log4j.properties  /druid/src/main/resources/log4j.properties

     ### u8BBEu7F6E###
    log4j.rootLogger = debug,stdout,D,E
    
    ### u8F93u51FAu4FE1u606Fu5230u63A7u5236u62AC ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ### u8F93u51FADEBUG u7EA7u522Bu4EE5u4E0Au7684u65E5u5FD7u5230=E://logs/error.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = E://logs/log.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ### u8F93u51FAERROR u7EA7u522Bu4EE5u4E0Au7684u65E5u5FD7u5230=E://logs/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =E://logs/error.log 
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

     -----------------------------------------------------------------------

    加入事务

    引入aop依赖,见前段pom

    新建service类

    /druid/src/main/java/cn/taotao/demo/service/UserService.java

    package cn.taotao.demo.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import cn.taotao.demo.domain.User;
    import cn.taotao.demo.mapper.UserMapper;
    
    @Service
    @Transactional      //标注开启事务
    public class UserService implements UserMapper {
    
        
        @Autowired
        private UserMapper userMapper;
        
        @Override
        public int deleteUserById(Integer id) {
            // TODO Auto-generated method stub
            return userMapper.deleteUserById(id);
        }
    
        @Override
        public int insertUser(User user) {
            // TODO Auto-generated method stub
            return userMapper.insertUser(user);
        }
    
        @Override
        @Transactional(readOnly = true)              //事务只读属性
        public User selectById(Integer id) {
            // TODO Auto-generated method stub
            return userMapper.selectById(id);
        }
    
        @Override
        public int updateUserById(Integer id) {
            // TODO Auto-generated method stub
            return userMapper.updateUserById(id);
        }
    
        @Override
        public List<User> queryAllUser() {
            // TODO Auto-generated method stub
            return userMapper.queryAllUser();
        }
    
    }

    启动类加入开启事务注解

    @SpringBootApplication
    @EnableTransactionManagement    //启用事务
    @MapperScan(basePackages = "cn.taotao.demo.mapper") //如果在mapper不指定@Mapper注解,可以在启动类配置mapper的默认扫描包。
    public class DruidApplication { public static void main(String[] args) { SpringApplication.run(DruidApplication.class, args); } }

    测试

    @RestController
    public class UserController {
    
        
        @Autowired
        private UserService userService;
        @RequestMapping("/hello")
        public List<User> getUser() {
            
            return userService.queryAllUser();
        }
    }

     测试2

    @RestController
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @RequestMapping("/hello")
        public List<User> getUser() {
            Page<Object> page = PageHelper.startPage(1, 5);
    
            List<User> queryAllUser = userService.queryAllUser();
            return queryAllUser;
        }
    }

    在测试的时候,

    @Autowire

    private UserMapper mapper             //接口

    需要改为 

    private UserService mapper            //服务类

    否则junit报告找不到合适的bean,因为注入2次。

  • 相关阅读:
    存储过程分页,前台应用范例repeater分页
    引用真正分页控件(与存储过程联合使用)页面
    分页存储过程repeater分页
    查找DetailsView1数据控件中的数据
    c#读取文件
    SQL触发器实例讲解
    TreeView节点选中问题
    C# 实现版本自动更新
    .Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档
    Linq学习笔记
  • 原文地址:https://www.cnblogs.com/sdgtxuyong/p/14407517.html
Copyright © 2020-2023  润新知