MyBatis-Plus 使用

MyBatis-Plus

MyBatis-Plus(簡稱 MP)是一個 MyBatis的增強工具,在 MyBatis 的基礎上只做增強不做改變璧帝,為簡化開發(fā)捍岳、提高效率而生富寿。
官方文檔地址:https://mybatis.plus/guide/

環(huán)境介紹

環(huán)境要素 版本
maven 3.3.3
jdk 1.8.0_1.81
編譯 idea
springboot 2.1.7.RELEASE
系統(tǒng) win10

快速開始

添加依賴

pom.xml中引入以下的包

<!--mybatis plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
    <scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>
<!--spring web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.1.7.RELEASE</version>
</dependency>
<!--測試-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.1.7.RELEASE</version>
    <scope>test</scope>
</dependency>

配置

在application.properties中添加數據庫配置

spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/db_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = 123456

在數據庫造點東西

CREATE TABLE `tb_sys_role`  (
  `id` bigint(1) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
  `name` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `description` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `id`(`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tb_sys_role
-- ----------------------------
INSERT INTO `tb_sys_role` VALUES (1, '管理員', '一切皆可管');

在springboot項目啟動類DemoApplication中睬隶,添加 @MapperScan 注解,掃描 Mapper 文件夾:

@SpringBootApplication(scanBasePackages = "com.smart.demo.*")
@MapperScan("com.smart.demo.dao.mapper")
public class SmartStreetApplication {
    public static void main(String[] args) {
        SpringApplication.run(SmartStreetApplication.class, args);
    }
}

編碼

編寫一個實體類TbSysRole(使用lombok簡化代碼)

@Data
public class TbSysRole {
    private Long id;
    private String name;
    private String description;
}

編寫一個Mapper類,在上面的com.smart.demo.dao.mapper包下

public interface SysRoleMapper extends BaseMapper<TbSysRole> {
}

開始使用

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SmartDemoApplication.class)
public class SampleTest {
    @Resource
    private SysRoleMapper roleMapper;

    @Test
    public void testRole() {
        System.out.println(("----- selectAll method test ------"));
        List<TbSysRole> list = roleMapper.selectList(null);
        Assert.assertEquals(1, list.size());
    }
}

小結

通過以上幾個簡單的步驟页徐,我們就實現了 User 表的 CRUD 功能苏潜。
從以上步驟中,我們可以看到集成 MyBatis-Plus 非常的簡單变勇,只需要引入 starter 工程恤左,并配置 mapper 掃描路徑即可。

我那個擦搀绣,都不用xml 了飞袋,像JPA的調用一樣絲滑。

下面介紹MP的具體使用方式

Mapper CRUD 接口

MP 封裝通用的CRUD的接口BaseMapper链患;啟動時自動解析實體表關系映射轉換為 Mybatis 內部對象注入到容器

使用實例

定義Mapper接口繼承BaseMapper

public interface SysRoleMapper extends BaseMapper<TbSysRole> {
}

定義實體類

@Data
public class TbSysRole {
    private Long id;
    private String name;
    private String description;
}

測試用例

@Test
public void testMapper() {
    TbSysRole r = new TbSysRole();
    r.setName("aa");
    roleMapper.insert(r);

    QueryWrapper<TbSysRole> query = Wrappers.query();
    query.eq("name","aa");
    TbSysRole role= roleMapper.selectOne(query);

    Map<String,Object > map=new HashMap<>();
    map.put("name",role.getName());
    roleMapper.deleteByMap(map);

    roleMapper.insert(r);
    roleMapper.delete(query);
    List<Long> ids=new ArrayList<>();
    ids.add(2L);
    ids.add(3L);
    roleMapper.deleteBatchIds(ids);
}

測試用例

@Resource
private SysRoleMapper roleMapper;

@Test
public void testRole() {
    System.out.println(("----- selectAll method test ------"));
    List<TbSysRole> list = roleMapper.selectList(null);
    Assert.assertEquals(1, list.size());
}

廬山面目

實體類的Mapper 繼承BaseMapper 巧鸭。其中泛型 T 為實體類;Wrapper 條件構造器

public interface BaseMapper<T> extends Mapper<T> {
    //插入一條記錄
    int insert(T entity);
    //刪除
    int deleteById(Serializable id);
    int deleteByMap(@Param("cm") Map<String, Object> columnMap);
    int delete(@Param("ew") Wrapper<T> wrapper);
    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    //更新
    int updateById(@Param("et") T entity);
    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
    //查詢
    T selectById(Serializable id);
    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
    T selectOne(@Param("ew") Wrapper<T> queryWrapper);
    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
    //分頁
    IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}

Service CRUD接口

mybatis-plus 進一步封裝了CRUD方法麻捻, 封裝的接口為IService纲仍,實現類為ServiceImpl,當然為了避免和Mapper層的混淆贸毕,方法的命名有些改變郑叠。

命名區(qū)別

Mapper Service
insert save/saveBatch/saveOrUpdateBatch
delete remove
update 一樣/updateBatchById
select get
selectPage page
selectList listBy

廬山面目

public interface IService<T> {
    boolean save(T entity);
    @Transactional(
        rollbackFor = {Exception.class}
    )
    default boolean saveBatch(Collection<T> entityList) {
        return this.saveBatch(entityList, 1000);
    }
    boolean saveBatch(Collection<T> entityList, int batchSize);
    @Transactional(
        rollbackFor = {Exception.class}
    )
    default boolean saveOrUpdateBatch(Collection<T> entityList) {
        return this.saveOrUpdateBatch(entityList, 1000);
    }
    boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

    boolean removeById(Serializable id);
    boolean removeByMap(Map<String, Object> columnMap);
    boolean remove(Wrapper<T> queryWrapper);
    boolean removeByIds(Collection<? extends Serializable> idList);
    
    boolean updateById(T entity);
    boolean update(T entity, Wrapper<T> updateWrapper);
    default boolean update(Wrapper<T> updateWrapper) {
        return this.update((Object)null, updateWrapper);
    }
    @Transactional(
        rollbackFor = {Exception.class}
    )
    default boolean updateBatchById(Collection<T> entityList) {
        return this.updateBatchById(entityList, 1000);
    }
    boolean updateBatchById(Collection<T> entityList, int batchSize);
    boolean saveOrUpdate(T entity);

    T getById(Serializable id);
    Collection<T> listByIds(Collection<? extends Serializable> idList);
    Collection<T> listByMap(Map<String, Object> columnMap);
    default T getOne(Wrapper<T> queryWrapper) {
        return this.getOne(queryWrapper, true);
    }

    T getOne(Wrapper<T> queryWrapper, boolean throwEx);
    Map<String, Object> getMap(Wrapper<T> queryWrapper);
    <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
    int count(Wrapper<T> queryWrapper);
    default int count() {
        return this.count(Wrappers.emptyWrapper());
    }
    List<T> list(Wrapper<T> queryWrapper);
    default List<T> list() {
        return this.list(Wrappers.emptyWrapper());
    }
    IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
    default IPage<T> page(IPage<T> page) {
        return this.page(page, Wrappers.emptyWrapper());
    }
    List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
    default List<Map<String, Object>> listMaps() {
        return this.listMaps(Wrappers.emptyWrapper());
    }
    default List<Object> listObjs() {
        return this.listObjs(Function.identity());
    }
    default <V> List<V> listObjs(Function<? super Object, V> mapper) {
        return this.listObjs(Wrappers.emptyWrapper(), mapper);
    }
    default List<Object> listObjs(Wrapper<T> queryWrapper) {
        return this.listObjs(queryWrapper, Function.identity());
    }
    <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
    
    IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
    default IPage<Map<String, Object>> pageMaps(IPage<T> page) {
        return this.pageMaps(page, Wrappers.emptyWrapper());
    }
    BaseMapper<T> getBaseMapper();
    default QueryChainWrapper<T> query() {
        return new QueryChainWrapper(this.getBaseMapper());
    }
    default LambdaQueryChainWrapper<T> lambdaQuery() {
        return new LambdaQueryChainWrapper(this.getBaseMapper());
    }
    default UpdateChainWrapper<T> update() {
        return new UpdateChainWrapper(this.getBaseMapper());
    }
    default LambdaUpdateChainWrapper<T> lambdaUpdate() {
        return new LambdaUpdateChainWrapper(this.getBaseMapper());
    }
    default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
        return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);
    }
}

使用實例

定義mapper

public interface SysUserMapper extends BaseMapper<TbSysUser> {
}

業(yè)務Service

public interface ISysUserService {
    List<TbSysUser> queryUser();
    List<TbSysUser> queryUser(Long userId);
}

業(yè)務Service實現

@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, TbSysUser> implements ISysUserService {
    @Resource
    private SysUserMapper userMapper;

    @Override
    public List<TbSysUser> queryUser() {
        List<TbSysUser> userList = userMapper.selectList(null);
        return userList;
    }

    @Override
    public TbSysUser queryUserById(Long userId) {
        return getById(userId);
    }

}

測試用例

@Autowired
private ISysUserService sysUserService;

@Test
public void test(){
    TbSysUser user=sysUserService.queryUserById(1L);
    System.out.println(user);
}

條件構造器

前面你肯定已經看到到一些以前沒見過的東西 ,例如下面明棍。這就是要說的條件構造器

QueryWrapper<TbSysRole> query = Wrappers.query();

條件構造器的父類是AbstractWrapper乡革,它有兩個實現類:QueryWrapper和UpdateWrapper 。它的主要作用是用于生成 sql 的 where 條件。

下面這些方法都是2個實現類公用的署拟。

allEq 多條件
  • 方法
allEq(Map<R, V> params) = allEq(true, map, true)
allEq(Map<R, V> params, boolean null2IsNull) = allEq(true,map,null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)

params : key為數據庫字段名,value為字段值
null2IsNull :默認true婉宰,為true則在map的value為null時調用 isNull 方法,為false時則忽略value為null的條件
condition:是否執(zhí)行條件,默認true

  • 示例

    模擬數據有:

    id name description
    1 管理員 一切皆可管
    2 Null 測試
    3 aaa AAAA
    /**
     * query.allEq(map);多參數查詢
     *  allEq({name:null,description:"一切皆可管"})--->where name is null and description="一切皆可管"
     */
    @Test
    public void testWrapper() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        Map<String, Object> map = new HashMap<>();
        map.put("name","管理員");
        map.put("description","一切皆可管");
        query.allEq(map);
        List<TbSysRole> list= roleMapper.selectList(query);
        Assert.assertEquals(1,list.size());
    }
    /**
     * query.allEq(map,true)相當于allEq(map) ;默認值就是true
     * 生成的相當于 name is null,查詢屬性值為null的記錄
     * allEq({id:1,name:null})--->where id = 1 and name is null
     */
    @Test
    public void testWrapper2() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        Map<String, Object> map = new HashMap<>();
        map.put("name",null);
        query.allEq(map,true);
        List<TbSysRole> list2= roleMapper.selectList(query);
        Assert.assertEquals(1,list2.size());
    }
    /**
     * query.allEq(map,false);忽略value=null的條件
     * 相當于不要這個為null的條件
     * allEq({id:1,name:null})--->where id = 1 
     */
    @Test
    public void testWrapper3() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        Map<String, Object> map = new HashMap<>();
        map.put("name",null);
        query.allEq(map,false);
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(3,list3.size());
    }
    /**
     * allEq(false,map,null2IsNull)
     * 第一個參數代表是否執(zhí)行這些條件推穷,false相當于沒傳條件
     */
     @Test
     public void testWrapper4() {
         QueryWrapper<TbSysRole> query = Wrappers.query();
         Map<String, Object> map = new HashMap<>();
         map.put("name","管理員");
         map.put("description","一切皆可管");
         query.allEq(false,map,true);
         List<TbSysRole> list= roleMapper.selectList(query);
         Assert.assertEquals(3,list.size());
     }
    
  • 方法

    allEq(BiPredicate<R, V> filter, Map<R, V> params) = allEq(true, filter, params, null2IsNull);
    allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
    allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) 
    
  • 示例

    /**
     * allEq(filter, map);
     * 相當于只傳入滿足過濾器的條件心包,其他條件都跳過
     */
    @Test
    public void testWrapper4() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        Map<String, Object> map = new HashMap<>();
        map.put("name","管理員");
        query.allEq((k,v) -> v.toString().indexOf("員") >= 0,map);
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(1,list3.size());
    }
    
eq 等于
  • 方法
eq(R column, Object val)
eq(boolean condition, R column, Object val)

相當于“=”
column :列名
val:值
condition:是否執(zhí)行條件

  • 示例

    /*
     * eq(R column, Object val);
     * Eq({name:"管理員"})--->where name "管理員"
     */
    @Test
    public void testWrapper6() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        query.eq("name","管理員");
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(1,list3.size());
    }
    /*
     * eq(condition,column,val)馒铃;
     * 相當于沒有傳遞任何條件
     */
    @Test
    public void testWrapper7() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        query.eq(false,"name","管理員");
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(3,list3.size());
    }
    
ne 不等于
  • 方法
ne(R column, Object val) = ne(true, column,val)
ne(boolean condition, R column, Object val)

相當于不等于<>
column :列名
val:值
condition:是否執(zhí)行條件

  • 代碼

    /**
     * ne("name","1");查詢name不等于1,(mysql默認會排除name=null的數據)
     * 相當于where name <>'1'
     */
    @Test
    public void testWrapper8() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        query.ne("name","1");
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(2,list3.size());
    }
    /**
     *  ne(true蟹腾,"name","1")相當于query.ne("name","1"),默認值就是true 
     *  查詢name不等于1,(mysql默認會排除name=null的數據)
     *  相當于where name <>'1'
     */
    @Test
    public void testWrapper9() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        query.ne(true,"name","1");
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(2,list3.size());
    }
    /**
     *  ne("name","1");查詢name不等于1,(mysql默認會排除name=null的數據)
     *  相當于 沒有where 
     */
    @Test
    public void testWrapper10() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        query.ne(false,"name","1");
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(3,list3.size());
    }
    
gt 大于
  • 方法

    gt(R column, Object val)
    gt(boolean condition, R column, Object val)
    
  • 例子

    ge("age", 18)--->age > 18

ge 大于等于
  • 方法

    ge(R column, Object val)
    ge(boolean condition, R column, Object val)
    
  • 例子

    lt("age", 18)--->age >= 18

lt 小于
  • 方法

    lt(R column, Object val)
    lt(boolean condition, R column, Object val)
    
  • 例子

    lt("age", 18)--->age < 18

le 小于等于
  • 方法

    le(R column, Object val)
    le(boolean condition, R column, Object val)
    
  • 例子

    lt("age", 18)--->age <= 18

between
  • 方法

    between(R column, Object val1, Object val2)
    between(boolean condition, R column, Object val1, Object val2)
    
  • 例子

    between("age", 18, 30)--->age between 18 and 30

notBetween
  • 方法
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
  • 例子

    notBetween("age", 18, 30)--->age not between 18 and 30

notBetween
  • 方法
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
  • 例子

    notBetween("age", 18, 30)--->age not between 18 and 30

like
  • 方法
like(R column, Object val)
like(boolean condition, R column, Object val)
  • 例子

    like("name", "王")--->name like '%王%'

notLike
  • 方法
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
  • 例子

    notLike("name", "王")--->name not like '%王%'

其他
方法名 方法 實例
likeLeft likeLeft(R column, Object val) likeLeft(boolean condition, R column, Object val) likeLeft("name", "王")--->name like '%王'
likeRight likeRight(R column, Object val) likeRight(boolean condition, R column, Object val) likeRight("name", "王")--->name like '王%'
isNull isNull(R column) isNull(boolean condition, R column) isNull("name")--->name is null
isNotNull isNotNull(R column) isNotNull(boolean condition, R column) isNotNull("name")--->name is not null
in in(R column, Collection<?> value) in(boolean condition, R column, Collection<?> value) in("age",{1,2,3})--->age in (1,2,3)
notIn notIn(R column, Collection<?> value) notIn(boolean condition, R column, Collection<?> value) notIn("age",{1,2,3})--->age not in (1,2,3)

還有很多区宇,可以去看官網

QueryWrapper

select
  • 方法

    select(String... sqlSelect)
    select(Predicate<TableFieldInfo> predicate)
    select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
    
  • 代碼

    /**
    * 查詢id=1, 且返回集中只有id,name
    **/
    @Test
    public void testWrapper12() {
        QueryWrapper<TbSysRole> query = Wrappers.query();
        query.select("id","name");
        query.eq("id",1);
        List<TbSysRole> list3= roleMapper.selectList(query);
        Assert.assertEquals(1,list3.size());
    }
    

UpdateWrapper

set
  • 方法
set(String column, Object val)
set(boolean condition, String column, Object val)
  • 代碼

    @Test
    public void testWrapper13() {
        UpdateWrapper<TbSysRole> updateWrapper=Wrappers.update();
        updateWrapper.eq("id",3);
        updateWrapper.set("name","AA1A");
        roleMapper.update(null,updateWrapper);
    }
    
setSql
  • 方法
setSql(String sql)
  • 代碼

    @Test
    public void testWrapper15() {
        UpdateWrapper<TbSysRole> updateWrapper=Wrappers.update();
        updateWrapper.eq("id",3);
        updateWrapper.setSql("name='小妹妹'");
        roleMapper.update(null,updateWrapper);
    }
    

自定義sql

注解方式
public interface SysRoleMapper extends BaseMapper<TbSysRole> {
    /**
     * 第一種方法:注解方式娃殖,不使用MP的Wrapper條件構造器
     *和Mybatis使用方法一致
     * @param id
     * @return
     */
    @Select("select * from tb_sys_role where id= #{id}")
    TbSysRole findOneRole(Long id);

    /**
     * 第一種方法:注解方式,如果自定義的方法還希望能夠使用MP提供的Wrapper條件構造器议谷,則需要如下寫法
     *
     * @param roleWrapper
     * @return
     */
    @Select("SELECT * FROM tb_sys_role ${ew.customSqlSegment}")
    TbSysRole selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper<TbSysRole> roleWrapper);
}
@Test
public void testWrapper16() {
    TbSysRole R= roleMapper.findOneRole(1L);
    System.out.println(R.getName());
}
@Test
public void testWrapper17() {
    QueryWrapper<TbSysRole> query = Wrappers.query();
    query.eq("id",1);
    TbSysRole r=roleMapper.selectByMyWrapper(query);
    System.out.println(r.getName());
}
xml 方式

Mapper接口

package com.smart.street.dao.mapper;

public interface SysUserMapper extends BaseMapper<TbSysUser> {
    /**
     * 和Mybatis使用方法一致
     *
     * @param id
     * @return
     */
    TbSysUser findOneUser(Long id);

    /**
     * 如果自定義的方法還希望能夠使用MP提供的Wrapper條件構造器炉爆,則需要如下寫法
     *
     * @param userWrapper
     * @return
     */
    TbSysUser selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper<TbSysUser> userWrapper);
}

xml 放在resources下的com.smart.street.dao.mapper目錄中,一定要和上面的Mapper接口目錄結構一致且文件名和Mapper名字一致

<?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">
<mapper namespace="com.smart.street.dao.mapper.SysUserMapper">

    <select id="findOneUser" resultType="com.smart.street.dao.entity.TbSysUser">
        SELECT * FROM tb_sys_user where id = #{id}
    </select>

    <select id="selectByMyWrapper" resultType="com.smart.street.dao.entity.TbSysUser">
        SELECT * FROM tb_sys_user ${ew.customSqlSegment}
    </select>

</mapper>

配置文件application.properties中添加

mybatis-plus.mapper-locations= classpath:com.smart.street.dao.mapper/*.xml

測試用例

@Test
public void testWrapper18() {
    TbSysUser u= userMapper.findOneUser(1L);
    System.out.println(u.getUserName());
}
@Test
public void testWrapper19() {
    QueryWrapper<TbSysUser> query = Wrappers.query();
    query.eq("id",1);
    TbSysUser u= userMapper.selectByMyWrapper(query);
    System.out.println(u.getUserName());
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末卧晓,一起剝皮案震驚了整個濱河市芬首,隨后出現的幾起案子,更是在濱河造成了極大的恐慌逼裆,老刑警劉巖郁稍,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異胜宇,居然都是意外死亡耀怜,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門桐愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來财破,“玉大人,你說我怎么就攤上這事从诲∽罅。” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵盏求,是天一觀的道長抖锥。 經常有香客問我,道長碎罚,這世上最難降的妖魔是什么磅废? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮荆烈,結果婚禮上拯勉,老公的妹妹穿的比我還像新娘竟趾。我一直安慰自己,他們只是感情好宫峦,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布岔帽。 她就那樣靜靜地躺著,像睡著了一般导绷。 火紅的嫁衣襯著肌膚如雪犀勒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天妥曲,我揣著相機與錄音贾费,去河邊找鬼。 笑死檐盟,一個胖子當著我的面吹牛褂萧,可吹牛的內容都是我干的。 我是一名探鬼主播葵萎,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼导犹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羡忘?” 一聲冷哼從身側響起谎痢,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳坪,沒想到半個月后舶得,有當地人在樹林里發(fā)現了一具尸體掰烟,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡爽蝴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了纫骑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎亚。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖先馆,靈堂內的尸體忽然破棺而出发框,到底是詐尸還是另有隱情,我是刑警寧澤煤墙,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布梅惯,位于F島的核電站,受9級特大地震影響仿野,放射性物質發(fā)生泄漏铣减。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一脚作、第九天 我趴在偏房一處隱蔽的房頂上張望葫哗。 院中可真熱鬧缔刹,春花似錦、人聲如沸劣针。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺典。三九已至鸟廓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間襟己,已是汗流浹背肝箱。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稀蟋,地道東北人煌张。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像退客,于是被迫代替她去往敵國和親骏融。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容