MyBatis 通用 Mapper 研究 & 实现(一)

本贴最后更新于 2720 天前,其中的信息可能已经时移俗易

优点?

支持单表操作,两张表联查操作,不支持大于两张表操作

1.支持多种语句操作,如eq,ne,ge,gt,le,lt,is null,not null,is empty,not empty,in,not in,以上操作都为AND,目前不支持OR

2.支持两张表联查,依旧不写sql,同时也支持以上多种操作符。只需要简单配置一下注解即可。

3.支持字段別名,cas需求就很好处理了哦。对同一个字段可以取别名多次set。

4.有工具类,直接生成数据库建表文件,对象建模。

缺点?

目前id方案不支持数据库自增,采取编码setId的方案,后续会实现id生成器。

没实现oracle。。。只实现了mysql数据库支持。

使用方式

参考如下几个实现类
1.QueryBuilder 实现查询业务
2.UpdateBuilder 实现更新业务,支持根据查询条件更新数据
3.InsertBuilder 实现插入业务
4.DeleteBuilder 实现删除业务

准备开始

定义领域对象

@Alias("user_info")
@Table(table = "user_info")
public class UserInfo extends BasicModel<UserInfo> {    
    @Column(length = "200", desc = "用户头像")
    private String poster;
@Column(length = "50")
private String nickname;

//省略get/set

}

mybatis配置文件扫描领域对象,如想使用mybatis的扫描机制,切记数据库字段和对象字段要一致,如不一致请到xml里面去配置映射关系,目前没找到其他实现方式,下一版本直接在mybatis源码扩展功能,少量改动源码。

<?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>
    <typeAliases>
        <package name="com.xxx.model"/>
    </typeAliases>
</configuration>

定义一个mapper,不需要实现方法,泛型指定返回对象

public interface UserInfoMapper extends MysqlBaseMapper<UserInfo> {}

定义一个dao接口

public interface UserInfoDao extends MySqlBaseDao<UserInfo> {}

实现dao,对mapper进行绑定,指定mapper的class,dao也可以用传统的xml方式实现自己的业务,dao绑定mapper为了调用mapper通用方法,也还原了大家经常使用mybatis的方式。

@Repository
public class UserInfoDaoImpl extends AbstractMySqlBaseDao<UserInfo> implements UserInfoDao {
    @Override
    public Class mapperClass() {
        return UserInfoMapper.class;
    }
}

spring配置里面加入如下,com.xxxx.mapper为项目定义mapper目录

 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxxx.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
 </bean>

<!-- myBatis Sql 映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="multipleDataSource"/>
<property name="configLocation">
<value>classpath:mapper/entity-config.xml</value>
</property>
<!--
依旧可以使用 mybatis 配置文件方式
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
-->
</bean>

开始使用

注意:所有property字符串都为java类字段定义,非数据库字段。

查询单个对象

QueryBuilder queryBuilder = QueryBuilder.build(UserInfo.class).eq("id",1);
UserInfo userInfo = userInfoDao.one(queryBuilder);

查询list

QueryBuilder queryBuilder = QueryBuilder.build(UserInfo.class).eq("status",1);
List<UserInfo> userInfos = userInfoDao.list(queryBuilder);

查询总数

QueryBuilder queryBuilder = QueryBuilder.build(UserInfo.class).eq("status",1);
int  count = userInfoDao.count(queryBuilder);

查询当前页数据

QueryBuilder queryBuilder = QueryBuilder.build(UserInfo.class).page(1).size(10).eq("status",1);
PageData  page = userInfoDao.page(queryBuilder);

更新数据

UpdateBuilder update = UpdateBuilder.build(UserInfo.class).set("last_login_time",time).set("token", token).eq("id", 1);
int r = userInfoDao.update(update);

插入数据

UserInfo userInfo = new UserInfo();
userInfo.setId(UUIDUtils.uuid());
userInfo.setToken(token);
userInfo.setChannel(channel);
userInfo.setStatus_at(StatusAt.active.getCode());
userInfo.setClient_version(clientVersion);
userInfo.setCredit(0);
userInfo.setIp(ip);
userInfo.setPhone(phone);
userInfo.setPassword(sourcePwd);
userInfo.setSalt(salt);
userInfo.setCreate_at(now());
userInfo.setUpdate_at(now());
userInfo.setOs(os);
InsertBuilder insert = InsertBuilder.build(UserInfo.class).set(userInfo);
int r = userInfoDao.insert(insert);

删除数据

DeleteBuilder delete= DeleteBuilder.build(UserInfo.class).eq("id", 1);
int r = userInfoDao.delete(delete);
  • ORM
    9 引用 • 6 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖
  • myabtis
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...