崛起於Springboot2.X + 入門FastMybatis(8)

《SpringBoot2.X心法總綱》java

      (本博客已由2019-08-27 優化更新)mysql

    序言:fastMybatis是一個更加快捷的框架,搭建更加快捷以及使用簡單方便 ==》fastMybatis碼雲地址git

    fastmybatis框架全部方法具體詳解==》fastmybatis精裝版web

一、容易出Bug的點

    1.一、dao層對應的文件名TUserMapper.java 必須和resource/mybatis/mapper下面的TUserMapper.xml文件名一致spring

    1.二、fastMybatis的xml中的namepace不用寫,resultMap是嵌套在框架內部,不用改爲具體實體類。sql

    1.三、實體類必需要有主鍵的註解,否則會報錯數據庫

    1.四、千萬不要加MapperScan() 的掃描,由於在fastmybatis已經作過處理了,否則會掃描不到fastmybatis已經封裝好得方法。apache

二、特色

    2.1 支持mysql,sqlserver,oracle,postgresql,sqlite。緩存

    2.2 支持自定義sql,sql語句能夠寫在配置文件中,一樣支持mybatis標籤。springboot

    2.3 輕量級,無侵入性,可與傳統mybatis用法共存。

三、搭建環境

    2.1 建立springboot項目,勾選web,勾選mysql

    2.2 application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://${mysql.ip}:3306/test_msg1?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=${mysql.username}
spring.datasource.password=${mysql.password}

    2.3 fastMybatis依賴

<dependency>
    <groupId>net.oschina.durcframework</groupId>
    <artifactId>fastmybatis-spring-boot-starter</artifactId>
    <version>1.0.2</version>
</dependency>

    2.4 在application.properties添加對fastMybatis配置

#fastmybatis
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.fill.com.gitee.fastmybatis.core.support.DateFillInsert=add_time

    2.5 目錄結構圖

    而後在resource/mybatis下建立一個xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <settings>
      <!-- 全局映射器啓用緩存 -->
      <setting name="cacheEnabled" value="true" />
      <!-- 查詢時,關閉關聯對象即時加載以提升性能 -->
      <setting name="lazyLoadingEnabled" value="true" />
      <!-- 對於未知的SQL查詢,容許返回不一樣的結果集以達到通用的效果 -->
      <setting name="multipleResultSetsEnabled" value="true" />
      <!-- 容許使用列標籤代替列名 -->
      <setting name="useColumnLabel" value="true" />
      <!-- 容許使用自定義的主鍵值(好比由程序生成的UUID 32位編碼做爲鍵值),數據表的PK生成策略將被覆蓋 -->
      <setting name="useGeneratedKeys" value="false" />
      <!-- 對於批量更新操做緩存SQL以提升性能:BATCH -->
      <setting name="defaultExecutorType" value="SIMPLE" />
      <!-- 超時設置 -->
      <setting name="defaultStatementTimeout" value="25000" />
      <setting name="logImpl" value="LOG4J" />
   </settings>
</configuration>

    2.6 建立sql

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `username` varchar(255) DEFAULT NULL COMMENT '用戶名',
  `state` tinyint(4) DEFAULT NULL COMMENT '狀態',
  `isdel` tinyint(4) DEFAULT NULL COMMENT '是否刪除',
  `remark` text COMMENT '備註',
  `add_time` datetime DEFAULT NULL COMMENT '添加時間',
  `money` decimal(10,2) DEFAULT NULL COMMENT '金額',
  `left_money` float DEFAULT NULL COMMENT '剩下的錢',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='用戶表'
CREATE TABLE `user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
`user_id` int(11) NOT NULL COMMENT 't_user外鍵',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`address` varchar(100) DEFAULT NULL COMMENT '街道',
`status` varchar(4) DEFAULT '0' COMMENT '類型',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加時間',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='用戶信息表';

    2.7 建立TUserMapper.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">
<!-- 注意:文件名必須跟Dao類名字一致,由於是根據文件名作關聯。 -->
<mapper>

   <select id="selectByName" parameterType="String" resultMap="baseResultMap">
      select * from t_user t where t.username = #{username} limit 1
   </select>
   
   <select id="findByMap" parameterType="java.util.Map" resultMap="baseResultMap">
      select * from t_user t where
      <choose>
          <when test="map.keys.size > 0">
             <foreach collection="map.keys" item="key"
                   separator="AND">  
                   ${key} = #{map[${key}]}
               </foreach> 
          </when>
          <otherwise>
              1=2
          </otherwise>
      </choose>
   </select>
   
   <select id="getByMap" parameterType="java.util.Map" resultMap="baseResultMap">
       select * from t_user t where
       <choose>
           <when test="map.keys.size > 0">
               <foreach collection="map.keys" item="key"
                    separator="AND">  
                    ${key} = #{map[${key}]}
                </foreach> 
                LIMIT 1
           </when>
           <otherwise>
               1=2
           </otherwise>
       </choose>
    </select>


   <select id="findJoinPage"
      parameterType="com.gitee.fastmybatis.core.query.Pageable"
      resultMap="baseResultMap">
      SELECT t.*,t2.city,t2.address
      FROM t_user t LEFT JOIN user_info t2 ON t.id = t2.user_id
      <include refid="common.where" />
      <include refid="common.orderBy" />
      <include refid="common.limit" />
   </select>

</mapper>

    2.8 entity和mapper

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "t_user")
public class TUser {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    /** ID, 數據庫字段:id */
    private Integer id;

    /** 用戶名, 數據庫字段:username */
    private String username;

    /** 狀態, 數據庫字段:state */
    private Byte state;

    /** 是否刪除, 數據庫字段:isdel */
    @com.gitee.fastmybatis.core.annotation.LogicDelete
    private Boolean isdel;

    /** 備註, 數據庫字段:remark */
    private String remark;

    /** 添加時間, 數據庫字段:add_time */
    private Date addTime;

    /** 金額, 數據庫字段:money */
    private BigDecimal money;

    /** 剩下的錢, 數據庫字段:left_money */
    private Float leftMoney;

    /** 設置ID,數據庫字段:t_user.id */
    public void setId(Integer id) {
        this.id = id;
    }

    /** 獲取ID,數據庫字段:t_user.id */
    public Integer getId() {
        return this.id;
    }

    /** 設置用戶名,數據庫字段:t_user.username */
    public void setUsername(String username) {
        this.username = username;
    }

    /** 獲取用戶名,數據庫字段:t_user.username */
    public String getUsername() {
        return this.username;
    }

    /** 設置狀態,數據庫字段:t_user.state */
    public void setState(Byte state) {
        this.state = state;
    }

    /** 獲取狀態,數據庫字段:t_user.state */
    public Byte getState() {
        return this.state;
    }

    /** 設置是否刪除,數據庫字段:t_user.isdel */
    public void setIsdel(Boolean isdel) {
        this.isdel = isdel;
    }

    /** 獲取是否刪除,數據庫字段:t_user.isdel */
    public Boolean getIsdel() {
        return this.isdel;
    }

    /** 設置備註,數據庫字段:t_user.remark */
    public void setRemark(String remark) {
        this.remark = remark;
    }

    /** 獲取備註,數據庫字段:t_user.remark */
    public String getRemark() {
        return this.remark;
    }

    /** 設置添加時間,數據庫字段:t_user.add_time */
    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }

    /** 獲取添加時間,數據庫字段:t_user.add_time */
    public Date getAddTime() {
        return this.addTime;
    }

    /** 設置金額,數據庫字段:t_user.money */
    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    /** 獲取金額,數據庫字段:t_user.money */
    public BigDecimal getMoney() {
        return this.money;
    }

    /** 設置剩下的錢,數據庫字段:t_user.left_money */
    public void setLeftMoney(Float leftMoney) {
        this.leftMoney = leftMoney;
    }

    /** 獲取剩下的錢,數據庫字段:t_user.left_money */
    public Float getLeftMoney() {
        return this.leftMoney;
    }

}
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import com.gitee.fastmybatis.core.mapper.CrudMapper;
import com.gitee.fastmybatis.core.query.Query;
import com.myapp.entity.TUser;

public interface TUserMapper extends CrudMapper<TUser, Integer> {

    // 自定義sql
    @Update("update t_user set username = #{username} where id = #{id}")
    int updateById(@Param("id") int id, @Param("username") String username);

    
    TUser selectByName(@Param("username") String username);

    List<TUser> findByMap(@Param("map") Map<String, Object> map);

    TUser getByMap(@Param("map") Map<String, Object> map);

    List<TUser> findJoinPage(Query query);

}
@Controller
public class HomeController {

   @Autowired
   TUserMapper tUserMapper;
   @GetMapping("/")
   @ResponseBody
   public String home(Locale locale, Model model,HttpServletRequest request) {

      Query query = new Query().eq("username","王五");
      List<TUser> users = tUserMapper.list(query);

      TUser tUser = tUserMapper.selectByName("王五");
      return "hello";
   }
}

最後測試成功!

三、Query操做數據庫方式

        3.1 咱們看下咱們的UserMapper.java繼承的接口

這即是它父類的父類

咱們能夠根據Query查詢各類東西,Query是一個封裝的類,包含eq,gt,lt等處理方法

可是它的這一點又和Mybatis不一致,fastmybatis與MyBatis generator對比

接下來咱們本身寫一個測試方法,在controller中添加一個新的查詢方法

@GetMapping("/getUser")
@ResponseBody
public void home(Locale locale, Model model,HttpServletRequest request) {
   Query query = new Query().eq("username","王五");
   List<TUser> users = tUserMapper.list(query);
   System.out.println(users);
}

    經過Query也能操做查詢數據庫,相似於Hibernate方式,我的以爲FastMybatis使用的話正常只須要繼承一個CrudMapper就行了,連mapper也不須要寫,除非複雜的sql,比mybatis-plus更方便。

相關文章
相關標籤/搜索