搭建完成簡單的kotlin集成SpringBoot的框架,咱們再來嘗試把mybatis也集成進去,數據庫咱們採用mysql。java
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);
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>
編譯器會爲數據類(data class)自動生成如下函數:web
lateinit只能用於非基本數據類型。Kotlin會使用null來對每個用lateinit修飾的屬性作初始化,而基礎類型是沒有null類型。spring
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 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的?的使用方法。數據庫
第一種。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來調試接口。