《SpringBoot2.X心法總綱》 java
介紹:FastMybatis是一個比mybatis-plus更加簡單的框架,沒有複雜sql時xml也不須要編寫,並且兼容mybatis的操做方式,因此接下來該博客講解的Springboot集成fastmybatis框架,以及mybatis全註解的使用,90%開發沒用過的代碼風格,mysql
項目代碼:點擊git
fastmybatis開發文檔:fastmybatis文檔web
前提:@Autowired、@Qualifier、@Service(value="") 請先明白這幾個註解的區別,代碼會用到。spring
1.一、dao層對應的文件名TUserMapper.java 必須和resource/mybatis/mapper下面的
TUserMapper.xml文件名一致。
1.二、fastMybatis的xml中的namepace不須要寫,resultMap是嵌套在框架內部,不用改爲具
體實體類。
1.三、實體類必需要有主鍵的註解,否則會報錯。
1.四、千萬不要在啓動類加MapperScan() 的掃描,這個很重要,否則會掃描不到fastmybatis封
裝的方法。
目錄結構圖:sql
UserControllers以fastmybatis框架寫的增、刪、改、差、分頁、排序,開發中涉及到都寫全了。數據庫
User2Controoler以mybatis方式寫的增、刪、改、差、排序等(分頁本身網上找一下吧)apache
<dependency> <groupId>net.oschina.durcframework</groupId> <artifactId>fastmybatis-spring-boot-starter</artifactId> <version>1.7.3</version> </dependency>
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='用戶表';
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=true&zeroDateTimeBehavior=convertToNull spring.datasource.username=root spring.datasource.password=root #fastmybatis mybatis.mapper-locations=classpath:mybatis/mapper/*.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>
若是使用fastmybatis方式,那麼實體類必定要有主鍵@Id什麼的,否則會報錯pk.fullType錯誤,謹記!springboot
import com.gitee.fastmybatis.core.annotation.LogicDelete; import lombok.Data; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import java.math.BigDecimal; import java.util.Date; @Data 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 */ @LogicDelete private Boolean isdel; /** 備註, 數據庫字段:remark */ private String remark; /** 添加時間, 數據庫字段:add_time */ private Date addTime; /** 金額, 數據庫字段:money */ private BigDecimal money; @Column(name = "left_money") private float leftMoney; }
public class CreateDataUtil { //方便下面添加用戶測試,num是創造多少個user實體類對象 public static List<TUser> getUsers(int num){ List<TUser> tUsers = new ArrayList<>(); for (int i = 0;i<num;i++){ byte a = 1; TUser user = new TUser(); user.setAddTime(new Date()); user.setIsdel(false); user.setMoney(new BigDecimal(12.00)); user.setAddTime(new Date()); user.setRemark("測試"); user.setState(a); user.setLeftMoney(1f); user.setUsername("mujiutian測試"+ UUID.randomUUID().toString().split("-")[1]); tUsers.add(user); } return tUsers; } public static TUser getUser(){ byte a = 1; TUser user = new TUser(); user.setAddTime(new Date()); user.setIsdel(false); user.setMoney(new BigDecimal(14.00)); user.setAddTime(new Date()); user.setRemark("添加用戶"); user.setState(a); user.setLeftMoney(2f); user.setUsername("mujiutian測試"+ UUID.randomUUID().toString().split("-")[1]); return user; } /** * @description:更新用戶對象的時候,咱們只部分更新字段,可是實體類中像int類型,你不傳值它會有一個默認值 * 因此咱們用Map代替實體類對象進行局部update * @author:MuJiuTian * @createDate: 2019/6/8 14:27 */ public static Map<String,Object> getuserForMap(int id){ Map<String,Object> map = new HashMap<>(); map.put("username","更新後的大魔王"); map.put("id",id); return map; } }
改工具類只爲了測試建立數據而已,調用接口的時候直接使用這些對象數據就能夠了,省的在postman等工具編寫參數了。
分別以mybatis、fastmybatis的形式對user進行增刪改差、分頁、排序、等操做,開發過程當中寫一種就能夠了,寫mybatis只是測試fastmybatis集成以後是否是可使用mybatis原有的功能
import com.example.fastmybatis.entity.TUser; import com.example.fastmybatis.service.TUserService; import com.example.fastmybatis.util.CreateDataUtil; import com.gitee.fastmybatis.core.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; import java.util.Map; /** * @Description: 使用fastmybatis框架測試增刪改差相關接口 * @Author:Mujiutian * @CreateDate:2019/6/8 0:53 * @UpdateUser: */ @RestController @RequestMapping(value = "/user/fastmybatis") public class UserController { @Autowired @Qualifier("userService") TUserService userService; /** * @description:添加一個用戶 * @author:MuJiuTian * @createDate: 2019/6/8 14:24 */ @PostMapping("/addUser") public String addUser(){ userService.addUser(CreateDataUtil.getUser()); return "以fastmybatis方式"+"添加一個對象數據成功"; } /** * @description:添加num個用戶 * @author:MuJiuTian * @createDate: 2019/6/8 14:24 */ @PostMapping("/addUsers") public String addUsers(int num){ userService.addUsers(CreateDataUtil.getUsers(num)); return "以fastmybatis方式"+"批量添加數據成功"; } /** * @description:邏輯意義上刪除用戶,若是你想把數據庫中的數據真正刪除,那麼修改實體類中,把@LogicDelete這個註解去掉 * @author:MuJiuTian * @createDate: 2019/6/8 14:24 */ @DeleteMapping(value = "/deleteUser") public String deleteUser(int id){ userService.deleteUser(id); return "以fastmybatis方式"+"刪除成功"; } /** * @description:更新用戶數據,須要該用戶全部數據 * @author:MuJiuTian * @createDate: 2019/6/8 14:25 */ @PostMapping(value = "/updateUser") public String updateUser(TUser user){ userService.updateUser(user); return "以fastmybatis方式"+"更新成功"; } /** * @description:更新用戶的某些屬性字段,以Map傳入 * @author:MuJiuTian * @createDate: 2019/6/8 15:03 */ @PostMapping(value = "/updatePartUser") public String updatePartUser(int id){ userService.updateUser(CreateDataUtil.getuserForMap(id)); return "以fastmybatis方式"+"更新用戶局部成功"; } /** * @description:查找某個用戶 * @author:MuJiuTian * @createDate: 2019/6/8 14:25 */ @GetMapping(value = "/getUser") public String getUser(int id){ TUser tUser = userService.getUser(id); return "以fastmybatis方式獲取對象數據:"+tUser.toString(); } /** * @description:分頁獲取用戶列表 * @author:MuJiuTian * @createDate: 2019/6/8 14:25 */ @GetMapping(value = "/getPageUsers") public String getPageUsers(int pageIndex,int pageSize){ Map<String,Object> map = userService.getPageResult(pageIndex,pageSize); return "以fastmybatis方式獲取分頁數據:"+map.toString(); } /** * @description:更詳細更簡單的獲取分頁用戶數據 * @author:MuJiuTian * @createDate: 2019/6/8 15:29 */ @GetMapping(value = "/getEasyPageUsers") public String getEasyPageUsers(int pageIndex,int pageSize){ PageInfo<TUser> pageInfo = userService.getPageUsers(pageIndex,pageSize); return "獲取更相信的數據成功"; } /** * @description:以id排序獲取用戶 * @author:MuJiuTian * @createDate: 2019/6/8 17:27 */ @GetMapping(value = "/getUsersForOrder") public String getUsersForOrder(){ return userService.getUsersForOrder().toString(); } }
import com.example.fastmybatis.service.TUserService; import com.example.fastmybatis.util.CreateDataUtil; import org.apache.ibatis.annotations.Delete; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Description:以原始mybatis方式CRUD操做數據庫,測試fastmybatis框架是否兼容mybatis * @Author:Mujiutian * @CreateDate:2019/6/8 12:09 * @UpdateUser: */ @RestController @RequestMapping(value = "/user/mybatis") public class User2Controller { @Autowired @Qualifier("userService2") TUserService userService; @PostMapping(value = "/addUser") public String addUser(){ userService.addUser(CreateDataUtil.getUser()); return "fastmybatis框架使用mybatis方式:"+"建立數據成功"; } @Delete(value = "/deleteUser") public String deleteUser(int id){ userService.deleteUser(id); return "fastmybatis框架使用mybatis方式:"+"刪除數據成功"; } @PostMapping(value = "/updateUser") public String updateUser(int id){ userService.updateUser(CreateDataUtil.getuserForMap(id)); return "fastmybatis框架使用mybatis方式:"+"更新數據成功"; } @GetMapping(value = "/getUser") public String getUser(int id){ userService.getUser(id); return "fastmybatis框架使用mybatis方式:"+"獲取數據成功"; } @GetMapping(value = "/getPageUsers") public String getPageUsers(){ return "mybatis的分頁查詢本身寫吧:"; } /** * @description:更詳細更簡單的獲取分頁用戶數據 * @author:MuJiuTian * @createDate: 2019/6/8 15:29 */ @GetMapping(value = "/getEasyPageUsers") public String getEasyPageUsers(int pageIndex,int pageSize){ return "mybatis的分頁查詢本身寫吧"; } /** * @description:以id排序獲取用戶 * @author:MuJiuTian * @createDate: 2019/6/8 17:27 */ @GetMapping(value = "/getUsersForOrder") public String getUsersForOrder(){ return userService.getUsersForOrder().toString(); } }
兩種框架共同寫同樣的功能,接口同樣,實現類不一樣
import com.example.fastmybatis.entity.TUser; import com.gitee.fastmybatis.core.PageInfo; import java.util.List; import java.util.Map; public interface TUserService { int addUser(TUser user); int deleteUser(int id); int updateUser(TUser user); int updateUser(Map<String,Object> user); TUser getUser(int id); int addUsers(List<TUser> users); Map<String,Object> getPageResult(int pageIndex,int pageSize); PageInfo<TUser> getPageUsers(int pageIndex,int pageSize); //排序獲取用戶 List<TUser> getUsersForOrder(); }
import com.example.fastmybatis.entity.TUser; import com.example.fastmybatis.dao.TUserMapper; import com.example.fastmybatis.service.TUserService; import com.gitee.fastmybatis.core.PageInfo; import com.gitee.fastmybatis.core.query.Query; import com.gitee.fastmybatis.core.util.MapperUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service("userService") public class TUserServiceImpl implements TUserService { @Autowired TUserMapper tUserMapper; @Override public int addUser(TUser user) { tUserMapper.save(user); return 0; } @Override public int deleteUser(int id) { Query query = new Query(); query.eq("id",id); return tUserMapper.deleteByQuery(query); } @Override public int updateUser(TUser user) { return tUserMapper.update(user); } @Override public int updateUser(Map<String, Object> user) { Query query = new Query(); query.eq("id",Integer.valueOf(user.get("id").toString())); return tUserMapper.updateByMap(user,query); } @Override public TUser getUser(int id) { Query query = new Query(); query.eq("id",id); TUser user = tUserMapper.getByQuery(query); return user; } @Override public int addUsers(List<TUser> users) { return tUserMapper.saveBatch(users); } @Override public Map<String, Object> getPageResult(int pageIndex,int pageSize) { Map<String,Object> map = new HashMap<>(); Query query = new Query(); query.page(pageIndex,pageSize); List<TUser> users = tUserMapper.list(query); long total = tUserMapper.getCount(query); map.put("list",users); map.put("total",total); return map; } @Override public PageInfo<TUser> getPageUsers(int pageIndex,int pageSize) { Query query = new Query(); query.page(pageIndex,pageSize); return MapperUtil.query(tUserMapper,query); } @Override public List<TUser> getUsersForOrder() { Query query = new Query(); query.orderby("id", Sort.DESC); query.eq("isdel",0); //條件isdel==0 return tUserMapper.list(query); } }
import com.example.fastmybatis.dao.TUserMapper; import com.example.fastmybatis.entity.TUser; import com.example.fastmybatis.service.TUserService; import com.gitee.fastmybatis.core.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service(value = "userService2") public class TUserService2Impl implements TUserService { @Autowired TUserMapper userMapper; @Override public int addUser(TUser user) { return userMapper.addUserForMybatis(user); } @Override public int deleteUser(int id) { return userMapper.deleteUserForMybatis(id); } @Override public int updateUser(TUser user) { return userMapper.updateUserForMybatis(user); } @Override public int updateUser(Map<String, Object> user) { return userMapper.updateUserForMybatis(user); } @Override public TUser getUser(int id) { return userMapper.getUserForMybatis(id); } @Override public int addUsers(List<TUser> users) { return 0; } @Override public Map<String, Object> getPageResult(int pageIndex, int pageSize) { return null; } @Override public PageInfo<TUser> getPageUsers(int pageIndex, int pageSize) { return null; } @Override public List<TUser> getUsersForOrder() { return userMapper.getUsersForOrder(); } }
實現類中就能夠看到fastmybatis的代碼量就少多了,畢竟都被封裝好了
該文件夾必須是dao,不能寫成mapper,否則獲取不到dao層裏面的bean,多是fastmybatis有限制
import com.example.fastmybatis.entity.TUser; import com.example.fastmybatis.dao.provider.TUserSqlProvider; import com.gitee.fastmybatis.core.mapper.CrudMapper; import org.apache.ibatis.annotations.*; import org.apache.ibatis.type.JdbcType; import java.util.Map; public interface TUserMapper extends CrudMapper<TUser,Integer> { //mybatis有兩種方式操做數據庫,一個是註解,另一個是xml文件 //這次測試咱們所有使用註解的形式,方法後面接的..ForMybatis都是以mybatis方式測試的 @Insert({ "insert into t_user(username,state,isdel,remark,add_time,money,left_money)", " values(#{username},#{state},#{isdel},#{remark},#{addTime},#{money},#{leftMoney})" }) int addUserForMybatis(TUser user); @Delete({ "delete from t_user where id = #{id}" }) int deleteUserForMybatis(@Param("id") int id); int updateUserForMybatis(TUser user); @UpdateProvider(type = TUserSqlProvider.class,method = "updateUser") int updateUserForMybatis(Map<String,Object> user); @Select({ "select id,username,state,isdel,remark,add_time,money,left_money from t_user where id = #{id}" }) @Results({ @Result(column = "id",jdbcType = JdbcType.INTEGER,property = "id"), @Result(column = "username",jdbcType = JdbcType.VARCHAR,property = "id"), @Result(column = "state",jdbcType = JdbcType.INTEGER,property = "id"), @Result(column = "isdel",jdbcType = JdbcType.INTEGER,property = "id"), @Result(column = "remark",jdbcType = JdbcType.LONGNVARCHAR,property = "id"), @Result(column = "add_time",jdbcType = JdbcType.DATE,property = "id"), @Result(column = "money",jdbcType = JdbcType.DECIMAL,property = "id"), @Result(column = "left_money",jdbcType = JdbcType.FLOAT,property = "id") } ) TUser getUserForMybatis(@Param("id") int id); @SelectProvider(type = TUserSqlProvider.class,method = "getOrderUsers") List<TUser> getUsersForOrder(); }
import com.example.fastmybatis.entity.TUser; import org.apache.ibatis.jdbc.SQL; import java.util.Map; public class TUserSqlProvider { /** * @description:更新用戶對象 * @author:MuJiuTian * @createDate: 2019/6/8 13:50 */ public String updateUser(Map<String,Object> user){ SQL sql = new SQL(); sql.UPDATE("t_user"); if (user.get("username") != null && user.get("username").toString() != ""){ sql.SET("username=#{username,jdbcType=VARCHAR}"); } if (user.get("remark") != null && user.get("remark").toString() != ""){ sql.SET("remark=#{remark}"); } if (user.get("state") != null){ sql.SET("state=#{state}"); } if (user.get("addTime") != null){ sql.SET("add_time=#{addTime}"); } if (user.get("money") != null){ sql.SET("money=#{money}"); } if (user.get("left_money") != null){ sql.SET("left_money=#{leftMoney}"); } sql.WHERE("id = #{id}"); return sql.toString(); } /** * @description:此方法針對添加user對象的時候,防止有字段爲null狀況 * @author:MuJiuTian * @createDate: 2019/6/8 13:49 */ public String insertUser(TUser user){ SQL sql = new SQL(); sql.INSERT_INTO("t_user"); if (user.getUsername() != null && user.getUsername() !=""){ sql.VALUES("username","#{username,jdbcType=VARCHAR}"); } //下面的if等我就不寫了,參考上面的update就能夠 return sql.toString(); } /** * @description:高級查詢 * @author:MuJiuTian * @createDate: 2019/6/8 16:59 */ public String getOrderUsers(Map<String,Object> map){ SQL sql = new SQL(); sql.SELECT("id,username,state"); sql.FROM("t_user"); sql.WHERE("isdel = 0"); sql.ORDER_BY("id"); return sql.toString(); } }
這樣,咱們就能夠成功了,官網雖然有demo,可是是直接從Controoler到dao層或者直接測試類裏面寫的,正常開發仍是須要service,畢竟事務須要回滾。
這個demo教你怎麼使用mybatis全註解對數據CRUD、排序等,同時fastmybatis更簡潔的寫代碼!