序言:fastMybatis是一个更加快捷的框架,搭建更加快捷以及使用简单方便,简化Mybatis的开发,码云地址,fastMybatis码云地址。
下面的只是一个简单的demo,如果想要用该框架去企业开发的话,推荐==》企业版开发demo
1、特点
1.1 支持mysql,sqlserver,oracle,postgresql,sqlite,因为本人开发没有接触过sqlserver和oracle等等...那么接下来大家自己配置下,主要讲springboot集成fastmybatis操作mysql的项目构建
1.2 支持自定义sql,sql语句可以写在配置文件中,同样支持mybatis标签
1.3 轻量级,无侵入性,可与传统mybatis用法共存
2、搭建环境
2.1 创建springboot项目,勾选web,勾选mysql
2.2 配置mysql属性文件在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}
这里写你自己的mysql信息,ip 密码等等
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
package com.myapp.entity;
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;
/**
* 表名:t_user
* 备注:用户表
*/
@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;
}
}
package com.myapp.dao;
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";
}
}
最后测试成功!
2.9 注意点
2.9.1 mapper对应的文件名必须和resource/mybatis/mapper 下面的xml文件名一致!
2.9.2 这个fastMybatis的xml中的namepace不用写,resultMap是嵌套在框架内部,不用改成具体实体类
2.9.3 实体类必须要有主键的注解,不然会报错!
其实这个大致和mybatis没有什么区别,接下来的注解方式也不会和mybatis的注解方式有什么区别。注解的话只需要跟之前得博客一样写就好,例如在UserMapper.java添加
// 自定义sql
@Update("update t_user set username = #{username} where id = #{id}")
int updateById(@Param("id") int id, @Param("username") String username);
然后controller添加测试就可以了
3、fastMybatis的另外一中操作数据库方式
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);
}
我们也能够取得我们想要的结果,不过我们创建的这个springboot项目没有service,所以这些东西都要放在service中。service是写代码业务逻辑的功能,dao/mapper是写处理sql的功能
最终我们又学会了另外一种fastMybatis的方式,其实最后这种方式是一种设计模式,这样的框架在接下来的springboot集成mongodb也会出现类似的方法,如果觉得可以点个关注。
转载于:https://my.oschina.net/mdxlcj/blog/1835665