Kotlin+SpringBoot服務端restful框架搭建(2)集成mybatis

搭建完成簡單的kotlin集成SpringBoot的框架,咱們再來嘗試把mybatis也集成進去,數據庫咱們採用mysql。java

要求

  • mybatis
  • mysql

快速搭建

  1. 建立一張表,表名ca_order
  • ID int
  • 訂單編號 order_no varchar(10)
  • 訂單金額 order_amount double
  • 訂單建立時間 create_time datetime
  • 訂單建立人 create_user varchar(10)
  • 支付方式 pay_type varchar(10)
  • 商品名稱 commodity_name varchar(30)
  • 商品數量 commodity_num int
DROP TABLE IF EXISTS `ca_order`;
CREATE TABLE `ca_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_no` varchar(20) DEFAULT NULL,
  `order_amount` double(10,2) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `create_user` varchar(20) DEFAULT NULL,
  `pay_type` varchar(10) DEFAULT NULL,
  `commodity_name` varchar(20) DEFAULT NULL,
  `commodity_num` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1001', 1000, NOW(), '張三', '支付寶', '手機', 1);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1002', 2799.00, NOW(), '張小凡', '支付寶','榮耀v10',1); 
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1003', 16863.00, NOW(), '郭靖', '銀聯', 'iPhoneX', 2);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1004', 2677.00, NOW(), '張三風', '支付寶', 'vivoX21',1);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1005', 4325.78, NOW(), '謝遜', '微信', '諾基亞', 3);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1006', 2001, NOW(), '楊過', '支付寶', '小米mix', 2);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1007', 4399.00, NOW(), '張無忌', '微信', '華爲P20',1);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1008', 2999, NOW(), '陳震', '支付寶', '榮耀v9', 3);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1009', 1999, NOW(), '李狗蛋', '信用卡', '小米6',1);
INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES ('1010', 3200, NOW(), '郭德綱', '支付寶', 'iPhone6s', 1);
  1. 在application.yml添加datasource
spring:
  datasource:
     url: jdbc:mysql://127.0.0.1:3306/csdata?useUnicode=true&characterEncoding=utf-8
     username: root
     password: 123456
     driverClassName: com.mysql.jdbc.Driver

引入咱們須要的mybatis和mysqlmysql

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
 </dependency>
 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.34</version>
 </dependency>
  1. 建立實體類。kotlin建立實體類方式有兩種,一種是相似java的class,一種是kotlin的data class(數據類)。數據類(data class)必須知足如下要求:
  • 主構造函數至少有一個參數;
  • 主構造函數的全部參數需標記爲val 或 var;
  • 數據類不能是抽象、開放、密封或者內部的;
  • 自kotlin 1.1起,數據類能夠擴展其餘類;在1.1以前,數據類只能實現接口

編譯器會爲數據類(data class)自動生成如下函數:web

  • equals()/hashCode()
  • toString()
  • componentN()
  • copy()

lateinit只能用於非基本數據類型。Kotlin會使用null來對每個用lateinit修飾的屬性作初始化,而基礎類型是沒有null類型。spring

class

class CaOrder {
    var id:Int=0
    var orderNo:String=""
    var orderAmount:Double=0.00
    var createTime:String=""
    var createUser:String=""
    var payType:String=""
    var commodityName:String=""
    var commodityNum:Int=0
}

開始使用lateinit var定義屬性,可是運行的時候提示lateinit property has not been initialized,目前沒找到解決方法,就直接給屬性設置個默認值了sql

data class

data class CaOrder(
        var id:Int?,
        var orderNo:String,
        var orderAmount:Double?,
        var createTime:String,
        var createUser:String,
        var payType:String,
        var commodityName:String,
        var commodityNum:Int?
)

注意:Int後面的?號,若是不加這個問號,運行的時候會報No constructor found in void matching的錯誤。緣由是Int是kotlin的基礎數據類型不能爲null,會被映射成java中int,而實體類對應數據的時候某些字段會出現空值的,這就使kotlin在轉成實體類的時候不肯定轉成int仍是Integer,而加上問號以後是告訴它這個屬性爲空值的時候就返回null。具體能夠參考一下kotlin的?的使用方法。數據庫

  1. 建立Mapper,兩種方式來實現Mapper,一種是經過註解標籤@select,@insert,@update,@delete,另外一種經過xml配置文件,仍是推薦使用xml吧,使用起來相對方便,動態sql寫起來更容易。

第一種。apache

實體類CaOrderDao微信

package com.kotliner.demo.mapper

import com.kotliner.demo.entity.CaOrder
import org.apache.ibatis.annotations.*

@Mapper
interface CaOrderMapper{

    @Select("""
        select id,order_no as orderNo, order_amount, date_format(create_time,'%Y-%m-%d %H:%i:%s') as create_time, create_user, pay_type, commodity_name, commodity_num from ca_order
        """)
    fun findOrderList(order: CaOrder):List<CaOrder>;


    @Insert("""
        INSERT INTO ca_order (order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num) VALUES
        (#{orderNo},#{orderAmount},NOW(),#{createUser},#{payType},#{commodityName},#{commodityNum})
    """)
    fun saveOrder(order: CaOrder):Int;


    @Update("""
        update ca_order set order_amount=#{orderAmount} where id=#{id}
    """)
    fun updateOrder(order: CaOrder):Int;

    @Delete("""
        delete from ca_order where id=#{id}
    """)
    fun deleteOrder(id:Int)
}

第二種,若是使用這種須要再application.yml添加以下代碼用來指定xml位置mybatis

mybatis:
  type-aliases-package: com.kotliner.demo.entity
  mapper-locations: classpath:mapper/*.xml

這時候mapperr類就變得簡單了app

package com.kotliner.demo.mapper

import com.kotliner.demo.entity.CaOrder
import org.apache.ibatis.annotations.Mapper

@Mapper
interface CaOrderMapper{

    fun findOrderList(order: CaOrder):List<CaOrder>;
    fun saveOrder(order: CaOrder):Int;
    fun updateOrder(order: CaOrder):Int;
    fun deleteOrder(id:Int);
}

而後在resource下面建立Mapper文件,放入xml文件

<mapper namespace="com.kotliner.demo.mapper.OrderMapper">

    <!-- 實體類映射-->
    <resultMap type="com.kotliner.demo.entity.CaOrder"   id="OrderMap">
        <result column="id" property="id"/>
        <result column="order_no" property="orderNo"/>
        <result column="order_amount" property="orderAmount"/>
        <result column="create_time" property="createTime"/>
        <result column="create_user" property="createUser"/>
        <result column="pay_type" property="payType"/>
        <result column="commodity_name" property="commodityName"/>
        <result column="commodity_num" property="commodityNum"/>
    </resultMap>
    <!-- 按條件查詢-->

    <select id="findOrderList" parameterType="com.kotliner.demo.entity.CaOrder" resultMap="OrderMap" >
        select id,order_no, order_amount, create_time, create_user, pay_type, commodity_name, commodity_num from ca_order
    </select>


</mapper>

5.建立service和controller

服務接口ICaOrderService

package com.kotliner.demo.service

import com.kotliner.demo.entity.CaOrder


interface ICaOrderService{

    fun findAllOrder(order: CaOrder):List<CaOrder>;

    fun saveOrder(order: CaOrder):Int;

    fun updateOrder(order: CaOrder):Int;

    fun deleteOrder(id: Int);
}

服務實現類CaOrderMapper

package com.kotliner.demo.service


import com.kotliner.demo.entity.CaOrder
import com.kotliner.demo.mapper.CaOrderMapper
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service


@Service
class CaOrderImpl : ICaOrderService {

    @Autowired
    lateinit  var dao: CaOrderMapper;

    override fun findAllOrder(order: CaOrder): List<CaOrder> {
        return dao.findOrderList(order);

    }

    override fun saveOrder(order: CaOrder): Int {
        return dao.saveOrder(order);
    }

    override fun updateOrder(order: CaOrder): Int {
        return dao.updateOrder(order);
    }

    override fun deleteOrder(id: Int) {
        dao.deleteOrder(id);
    }

}

註解的使用同java相同,只是具體方法屬性定義須要注意

OrderController類

package com.kotliner.demo.controller

import com.kotliner.demo.entity.CaOrder
import com.kotliner.demo.mapper.OrderMapper
import com.kotliner.demo.service.ICaOrderService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*


@RestController
class OrderController{

    @Autowired
    lateinit var service: ICaOrderService


    @RequestMapping(value = "/findAllOrder",method = arrayOf(RequestMethod.POST))
    fun findAllOrder(@RequestBody order: CaOrder):List<CaOrder>{
        return service.findAllOrder(order);
    }

    @RequestMapping(value = "/save",method = arrayOf(RequestMethod.POST))
    fun save(@RequestBody order: CaOrder):Int{
        return service.saveOrder(order);
    }

    @RequestMapping(value = "/update",method = arrayOf(RequestMethod.POST))
    fun update(@RequestBody order: CaOrder):Int{
        return service.updateOrder(order);
    }
    @RequestMapping(value = "/delete",method = arrayOf(RequestMethod.GET))
    fun delete(@RequestParam(value = "id") id:Int){
        service.deleteOrder(id);
    }
}

建立完成,啓動一下服務。

建立的接口基本都是post的方式,咱們經過postman來調試接口。

啓動成功 接口調用 接口調用 數據庫 數據庫 輸入圖片說明

相關文章
相關標籤/搜索