netty學習(三)springboot+netty+mybatis

迷戀著你微笑的人zz發表於2018-10-12

[TOC]

前言

前面寫到了springboot整合netty,只是使用netty將資料處理了,還沒有存入資料庫,現在就把mybatis加進去吧;剛好最近也有一位讀者問到了這個問題;

正文

首先引入pom依賴

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.29.Final</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- druid的starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
複製程式碼

配置

配置檔案配置:

spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/authority?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
      initial-size: 2
      max-active: 30
      min-idle: 2
      max-wait: 1234
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 5
#mybatis
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.demo.entity
複製程式碼

記住springboot的啟動類上要掃描mapper介面包

springboot中啟動netty

其實springboot中啟動netty的方式有很多種,前一篇netty文章中我通過實現CommandLineRunner介面來啟動netty服務,後面寫了一篇springbean生命週期,發現springboot可以用配置bean的方式啟動netty服務,在啟動方法上新增@PostConstruct註解,程式碼如下:

NettyStart

@Component
public class NettyStart {
    @Resource
    private ServerHandler serverHandler;
    
    private EventLoopGroup bossGroup = new NioEventLoopGroup();
    private EventLoopGroup workGroup = new NioEventLoopGroup();
    
    /**
     * 啟動netty服務
     * @throws InterruptedException
     */
    @PostConstruct
    public void start() throws InterruptedException {
        ServerBootstrap b=new ServerBootstrap();
        b.group(bossGroup,workGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG,128)
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline().addLast(serverHandler);
                    }
                });
        ChannelFuture future = b.bind(8080).sync();
        if (future.isSuccess()) {
            System.out.println("啟動 Netty 成功");
        }
    }
    /**
     * 銷燬
     */
    @PreDestroy
    public void destroy() {
        bossGroup.shutdownGracefully().syncUninterruptibly();
        workGroup.shutdownGracefully().syncUninterruptibly();
        System.out.println("關閉 Netty 成功");
    }
}

複製程式碼

其中的serverHandler是通過依賴注入的方式注入的,這是為了後面serverHandler類中可以直接依賴注入;

ServerHandler類:

@Component
@Sharable
public class ServerHandler extends ChannelInboundHandlerAdapter {
    @Resource
    private UserService userService;

    /**
     * 獲取資料
     * @param ctx 上下文
     * @param msg 獲取的資料
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg){
        ByteBuf readMessage= (ByteBuf) msg;
        System.out.println(readMessage.toString(CharsetUtil.UTF_8));
        List<User> users = userService.selectAll();
        users.forEach(user-> System.out.println(user.toString()));
    }
}
複製程式碼

這個類加了@Component@Sharable註解,前一個不用解釋了,後一個個人覺得:這個類被spring託管了,那麼這個類就是單例,相當於這個類是共享的,所以得加@Sharable註解,關於該註解,可以參考這篇文章:blog.csdn.net/supper10090… 這裡我注入了UserService類,這裡是運算元據庫的方法

UserService

public interface UserService {
    /**
     * 獲取所有資料
     * @return
     */
    List<User> selectAll();
}
複製程式碼

UserServiceImpl


@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public List<User> selectAll() {
        return userMapper.selectAll();
    }
}

複製程式碼

實體類

public class User implements Serializable {
    private static final long serialVersionUID = -7776017450107481817L;
    private int id;
    private String name;
    private String password;
    private int age;
    private Date birthday;
}
複製程式碼

set,get方法省略

mapper介面

@Repository
public interface UserMapper {
    List<User> selectAll();
}
複製程式碼

mapper的xml檔案就補貼上來了;

輸出結果

測試
User{id=1, name='admin', password='admin', age=10, birthday=Tue May 30 00:00:00 CST 2017}
User{id=2, name='teacher', password='teacher', age=30, birthday=null}
User{id=3, name='student', password='student', age=20, birthday=null}

複製程式碼

我的mapper中只是查詢資料庫操作,並沒有寫如資料,如果要寫入,修改mapper就行了;

總結

在很多關於netty的專案或部落格中都是通過new的方式新增pipeline的,而我這裡用了注入的方式;我是因為我所做的這個專案是單機版的,相當於就是所有的功能都在一個專案裡面,而且單個功能運算元據庫的頻率比較高,而且我做的這個專案處理不了高併發,併發高了就會gg;所以我所寫的這些文章都是從專案上所學來的; 如果通過new的方式新增pipeline,那麼在處理資料的方法中可以通過一個類實現ApplicationContextAware介面來獲取spring上下文;然後在呼叫bean,運算元據庫;下面是參考連結: 在非spring管理的類中,使用spring管理的類

  • springboot啟動netty的方式有很多:一種是實現CommandLineRunner介面;一種是配置bean,指定初始化方法;還有其他的

原始碼在GitHub上面

參考文章:crossoverjie.top/2018/05/24/…

相關文章