(本博客已由2019-08-27 优化更新)
序言:fastMybatis是一个更加快捷的框架,搭建更加快捷以及使用简单方便 ==》fastMybatis码云地址。
fastmybatis框架所有方法具体详解==》fastmybatis精装版
1、容易出Bug的点
1.1、dao层对应的文件名TUserMapper.java 必须和resource/mybatis/mapper下面的TUserMapper.xml文件名一致。
1.2、fastMybatis的xml中的namepace不用写,resultMap是嵌套在框架内部,不用改成具体实体类。
1.3、实体类必须要有主键的注解,不然会报错!
1.4、千万不要加MapperScan() 的扫描,因为在fastmybatis已经做过处理了,不然会扫描不到fastmybatis已经封装好得方法。
2、特点
2.1 支持mysql,sqlserver,oracle,postgresql,sqlite。
2.2 支持自定义sql,sql语句可以写在配置文件中,同样支持mybatis标签。
2.3 轻量级,无侵入性,可与传统mybatis用法共存。
3、搭建环境
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"; } }
最后测试成功!
3、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更方便。
来源:oschina
链接:https://my.oschina.net/u/3209213/blog/1835665