1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cjbi-mybatis-ext

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 21 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 02:17 674ca89

MyBatis-Ext — удобное расширение MyBatis


Обзор

MyBatis-Ext является расширением MyBatis, которое упрощает работу с операциями CRUD для одной таблицы и предоставляет общие функции, такие как функциональное программирование, поддержка пагинации запросов и пользовательских методов. Оно также обеспечивает защиту от SQL-инъекций, простую интеграцию и не изменяет исходный код MyBatis.

Анализ

Быстрый старт

1. Импорт зависимостей Maven

<dependencys>
    <!-- mybatis-ext核心模块 -->
    <dependency>
        <groupId>tech.wetech.mybatis</groupId>
        <artifactId>mybatis-ext-core</artifactId>
        <!--  Use the latest released version:
        https://repo1.maven.org/maven2/tech/wetech/mybatis/
         -->
        <version>LATEST_VERSION</version>
    </dependency>
    <!-- springframework请引入此模块(已包含以上依赖) -->
    <dependency>
        <groupId>tech.wetech.mybatis</groupId>
        <artifactId>mybatis-ext-spring</artifactId>
        <version>LATEST_VERSION</version>
    </dependency>
    <!-- spring-boot请引入此模块(已包含以上依赖) -->
    <!-- 请注意:引入mybatis-ext-spring-boot-starter无需再引入mybatis-spring-boot-starter -->
    <dependency>
        <groupId>tech.wetech.mybatis</groupId>
        <artifactId>mybatis-ext-spring-boot-starter</artifactId>
        <version>LATEST_VERSION</version>
    </dependency>
</dependencys>

2. Добавление аннотаций к классам сущностей

//Mybatis-ext использует аннотации Jpa, в настоящее время реализованы @Table, @Id, @Column, @Transient и @Version, в будущем планируется поддержка большего количества функций Jpa
@Table(name = "weshop_user")//указать имя таблицы, обязательно
@Where(clause = "del_flag = 0 ")//условие удаления
public class User {
    @Id//указать первичный ключ, обязательно
    @GeneratedValue //указать возвращаемое значение первичного ключа
    private Integer id;
    private String username;
    private String password;
    @Column(name = "gender")//указать поле отображения, необязательно, если не указано, то имена полей преобразуются из верблюжьего регистра в регистр с подчёркиванием
    private String gender;
    private Date birthday;
    @Column(name = "register_time")
    private Date registerTime;
    @Column(name = "last_login_time")
    private Date lastLoginTime;
    @Column(name = "last_login_ip")
    private String lastLoginIp;
    @Column(name = "user_level_id")
    private Byte userLevelId;
    private String nickname;
    private String mobile;
    @Column(name = "register_ip")
    private String registerIp;
    private String avatar;
    @Column(name = "wechat_open_id")
	private String wechatOpenId;
    @Transient//игнорировать это свойство
    private String pageSize;
    @Transient
    private String pageNumber;
    private Integer delFlag;
    //здесь опущены геттеры и сеттеры
}

3. Наследование интерфейса BaseMapper

public interface UserMapper extends BaseMapper<User> {
}

Mybatis-Ext поддерживает Java, Springframework и SpringBoot.

I. Использование в Java

public class MybatisExtTests {
    private static SqlSession sqlSession;
    private final Logger log = LoggerFactory.getLogger(MybatisExtTests.class);
    @BeforeClass
    public static void beforeClass() {
        //создать фабрику пула источников данных
        PooledDataSourceFactory pooledDataSourceFactory = new PooledDataSourceFactory();
        //настроить источник данных
        Properties properties = new Properties();
        properties.setProperty("driver", "<JDBC драйвер>");
        properties.setProperty("url", "<URL JDBC>");
        properties.setProperty("username", "<имя пользователя>");
        properties.setProperty("password", "<пароль>");
        pooledDataSourceFactory.setProperties(properties);
        DataSource dataSource = pooledDataSourceFactory.getDataSource();
        //создать фабрику транзакций
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);
        Configuration configuration = new ExtConfiguration(environment); //здесь используется ExtConfiguration
        configuration.setLogImpl(Log4jImpl.class);
        //добавить мапперы
        configuration.addMapper(UserMapper.class);
        //здесь используется ExtSqlSessionFactoryBuilder
        SqlSessionFactory sqlSessionFactory = new ExtSqlSessionFactoryBuilder().build(configuration);
        sqlSession = sqlSessionFactory.openSession();
    }
    @Test
    public void testSelectByPrimaryKey() {
        //выполнить запрос по первичному ключу
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.selectByPrimaryKey(1);
        log.info("selectByPrimaryKey result: {}", user);
    }
}

II. Использование в Springframework

  1. В XML-файле объявить необходимые бины или использовать аннотацию @Bean для настройки. Конфигурация:

xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="tech.wetech.mybatis.spring.mapper"/>

Разработка и вызов:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/beans2.xml") public class MybatisExtSpringTests { private Logger log = LoggerFactory.getLogger(MybatisSpringTests.class); @Autowired private UserMapper mapper; @Test public void testSelectByExample() { //支持Example查询 Example example = Example.of(User.class); example.createCriteria() .andEqualTo(User::getId, 1) .orEqualTo(User::getUsername, "张三") .orNotLike(User::getAvatar, "aaa") .orIsNull(User::getBirthday) .orBetween(User::getRegisterTime, new Date(), new Date()) .orIn(User::getMobile, Arrays.asList(111, "aaa", 222)) .andLike(User::getAvatar, "bbb"); example.setDistinct(true); example.setLimit(1); example.setOffset(2); List users = mapper.selectByExample(example); log.info("selectByExample result: {}", users); } }

В SpringBoot:

  1. В application.properties конфигурации файла добавить данные источника и mapper сканирования пути конфигурации:

此处配置数据源

spring.datasource.driver-class-name=<JDBC驱动> spring.datasource.url= spring.datasource.username=<用户名> spring.datasource.password=<密码>

此处配置mybatis扫描路径

mybatis.mapper-locations=classpath:tech.wetech.mybatis.mapper/*Mapper.xml

  1. В стартовом классе добавить @MapperScan аннотацию, указать путь интерфейса Mapper для сканирования. @SpringBootApplication @MapperScan(basePackages = "tech.wetech.mybatis.mapper") public class MybatisExtSpringBootApplication { //此处省略main方法... }

  2. Разработка и вызов: @RunWith(SpringRunner.class) @SpringBootTest public class MybatisExtSpringBootTests { @Autowired private UserMapper mapper; private final Logger log = LoggerFactory.getLogger(MybatisExtSpringBootTests.class); @Test public void testSelectAll() { log.info("log: {}", mapper.selectAll()); } } Вот перевод текста на русский язык:

user.setLastLoginTime(new Date()); user.setLastLoginIp("127.0.0.1"); user.setRegisterIp("127.0.0.1"); user.setAvatar("aaaa"); user.setWechatOpenId("222"); int rows = mapper.insert(user); } // Вставка (только содержит не-null значения) @Test public void testInsertSelective() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("张三"); user.setPassword("aagewrwer"); user.setNickname("zhangsan"); user.setUserLevelId((byte) 22); user.setMobile("180xxxxxxxx"); user.setRegisterTime(new Date()); user.setLastLoginTime(new Date()); user.setLastLoginIp("127.0.0.1"); user.setRegisterIp("127.0.0.1"); user.setAvatar("aaaa"); user.setWechatOpenId("222"); int rows = mapper.insertSelective(user); } // По первичному ключу обновление (включает null значения) @Test public void testUpdateByPrimaryKey() { User user = new User(); user.setId(111); user.setUsername("张三2223333"); user.setPassword("aagewrwer"); user.setNickname("zhangsan"); user.setUserLevelId((byte) 22); user.setMobile("180xxxxxxxx"); user.setRegisterTime(new Date()); user.setLastLoginTime(new Date()); user.setLastLoginIp("127.0.0.1"); user.setRegisterIp("127.0.0.1"); user.setAvatar("aaaa"); user.setWechatOpenId("222"); int rows = mapper.updateByPrimaryKey(user); } // По первичному ключу обновление (только включает не-null значения) @Test public void testUpdateByPrimaryKeySelective() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setId(111); user.setUsername("张三"); user.setPassword("aagewrwer"); user.setNickname("zhangsan"); user.setUserLevelId((byte) 22); int rows = mapper.updateByPrimaryKeySelective(user); } // Выбрать все @Test public void testSelectAll() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); List users = mapper.selectAll(); } // Выбрать несколько данных @Test public void testSelectList() { User user = new User(); user.setId(111); List users = mapper.selectList(user); } // Выбрать одну запись @Test public void testSelectOne() { User user = new User(); user.setId(111); User user1 = mapper.selectOne(user); } // Выбрать одну запись, используя Optional @Test public void testSelectOneWithOptional() { User user = new User(); user.setId(1); User user1 = mapper.selectOneWithOptional(user).orElseGet(() -> new User()); } // Проверить наличие записи по первичному ключу @Test public void testExistsByPrimaryKey() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); Boolean exists = mapper.existsByPrimaryKey(111); } // Удалить по первичному ключу @Test public void testDeleteByPrimaryKey() { int rows = mapper.deleteByPrimaryKey(1); } // Вставить пакетно @Test public void testInsertAll() { User user = new User(); user.setUsername("张三111333"); user.setPassword("aagewrwer"); user.setNickname("zhangsan"); user.setUserLevelId((byte) 22); user.setMobile("180xxxxxxxx"); user.setRegisterTime(new Date()); user.setLastLoginTime(new Date()); user.setLastLoginIp("127.0.0.1"); user.setRegisterIp("127.0.0.1"); user.setAvatar("aaaa"); user.setWechatOpenId("222");

User user2 = new User();
user2.setUsername("张三222333");
user2.setPassword("aagewrwer");
user2.setNickname("zhangsan");
user2.setUserLevelId((byte) 22);
user2.setMobile("180xxxxxxxx");
user2.setRegisterTime(new Date());
user2.setLastLoginTime(new Date());
user2.setLastLoginIp("127.0.0.1");
user2.setRegisterIp("127.0.0.1");
user2.setAvatar("aaaa");
user2.setWechatOpenId("222");
int rows = mapper.insertAll(Arrays.asList(user, user2));

} // Подсчитать по условию @Тест

public void testCount() {
    User user = new User();
    user.setId(1);
    int count = mapper.count(user);
}

//Критерии функция запроса
**@Тест**
public void testCreateCriteria() {
    List<User> users = mapper.createCriteria()
            .andEqualTo(User::getId, 122)
            .orEqualTo(User::getUsername, "张三")
            .orNotLike(User::getAvatar, "aaa")
            .orIsNull(User::getBirthday)
            .orBetween(User::getRegisterTime, new Date(), new Date())
            .orIn(User::getMobile, Arrays.asList(111, "aaa", 222))
            .andLike(User::getAvatar, "aaa")
            .selectList();
}

//Пример запроса
**@Тест**
public void testSelectByExample() {
    Example<User> example = Example.of(User.class);
    example.createCriteria()
            .andEqualTo(User::getId, 1)
            .orEqualTo(User::getUsername, "张三")
            .orNotLike(User::getAvatar, "aaa")
            .orIsNull(User::getBirthday)
            .orBetween(User::getRegisterTime, new Date(), new Date())
            .orIn(User::getMobile, Arrays.asList(111, "aaa", 222))
            .andLike(User::getAvatar, "bbb");
    example.setDistinct(true);
    example.setLimit(1);
    example.setOffset(2);
    List<User> users = mapper.selectByExample(example);
}

//Пример статистики
**@Тест**
public void testCountByExample() {
    Example<User> example = Example.of(User.class);
    example.createCriteria()
            .andEqualTo(User::getId, 1)
            .orEqualTo(User::getUsername, "张三")
            .orNotLike(User::getAvatar, "aaa")
            .orIsNull(User::getBirthday)
            .orBetween(User::getRegisterTime, new Date(), new Date())
            .orIn(User::getMobile, Arrays.asList(111, "aaa", 222))
            .andLike(User::getAvatar, "select * from t_user");
    Integer rows = mapper.countByExample(example);
}

//Пример удаления
**@Тест**
public void testDeleteByExample() {
    Example<User> example = Example.of(User.class);
    example.createCriteria()
            .andEqualTo(User::getId, 1)
            .orEqualTo(User::getUsername, "张三")
            .orNotLike(User::getAvatar, "aaa")
            .orIsNull(User::getBirthday)
            .orBetween(User::getRegisterTime, new Date(), new Date())
            .orIn(User::getMobile, Arrays.asList(111, "aaa", 222))
            .andLike(User::getAvatar, "select * from t_user");
    int rows = mapper.deleteByExample(example);
}

//Пример обновления (обновит null)
**@Тест**
public void testUpdateByExample() {
    User user = new User();
    user.setId(999);
    user.setUsername("张三223223333");
    user.setPassword("aagewrwer");
    user.setNickname("zhangsan");
    user.setUserLevelId((byte) 22);
    user.setMobile("180xxxxxxxx");
    user.setRegisterTime(new Date());
    user.setLastLoginTime(new Date());
    user.setLastLoginIp("127.0.0.1");
    user.setRegisterIp("127.0.0.1");
    user.setAvatar("aaaa");
    user.setWechatOpenId("222");
    Example<User> example = Example.of(User.class);
    example.createCriteria()
            .andEqualTo(User::getId, 1)
            .andEqualTo(User::getUsername, "张三");
    int rows = mapper.updateByExample(user, example);
}

//Пример обновления (не обновит null)
**@Тест**
public void testUpdateByExampleSelective() {
    User user = new User();
    user.setUsername("张三223223333");
    user.setPassword("aagewrwer");
    user.setNickname("zhangsan");
    Example<User> example = Example.of(User.class);
    example.createCriteria()
            .andEqualTo(User::getId, 1)
            .andEqualTo(User::getUsername, "张三");
    int rows = mapper.updateByExampleSelective(user, example);
}

//Пример функции запроса
**@Тест**
public void testCreateExample() {
    User user = mapper.createExample()
            .setDistinct(true) В запросе представлен фрагмент кода на языке Java. Основной язык текста запроса — Java.

Вот перевод этого фрагмента на русский язык:

setColumns(User::getId, User::getBirthday, User::getRegisterTime)
        .setOrderByClause("id asc,register_time desc")
        .createCriteria()
        .andEqualTo(User::getId, 1)
        .selectOneWithOptional()
        .orElseThrow(() -> new RuntimeException("数据不存在"));
}
//多个组合
@Test
public void testSelectByExampleWithSub() {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        GoodsMapper goodsMapper = session.getMapper(GoodsMapper.class);
        Example<Goods> example = Example.of(Goods.class);
        example.or()
                .orEqualTo(Goods::getName, "轻奢纯棉刺绣水洗四件套")
                .andEqualTo(Goods::getId, 10000);
        example.or()
                .andEqualTo(Goods::getGoodsBrief, "厚实舒适");
        example.and()
                .andLessThanOrEqualTo(Goods::getId, 10099)
                .andGreaterThanOrEqualTo(Goods::getId, 10000);
        Criteria<Goods> criteria = new Criteria<>();
        criteria.andIsNull("brandId").andLessThan(Goods::getGoodsNumber, 1L);
        example.or(criteria);
        List<Goods> users = goodsMapper.selectByExample(example);
        Assert.assertEquals(2, users.size());
        Assert.assertEquals("轻奢纯棉刺绣水洗四件套", users.get(0).getName());
        Assert.assertEquals("埃及进口长绒棉毛巾", users.get(1).getName());
    }
}
//排序
@Test
public void testSelectSortWithLambda() {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        GoodsMapper goodsMapper = session.getMapper(GoodsMapper.class);
        example.setSort(Sort.by("id").desc());
        List<Goods> goods = goodsMapper.selectByExample(example);
        Assert.assertEquals(goods.get(0).getId(), Long.valueOf(10099));
        example.setSort(Sort.by("name", Sort.Direction.DESC).and("id"));
        example.setSort(Sort.by(Goods::getName, Sort.Direction.DESC).and(Goods::getId));
        List<Goods> goods2 = goodsMapper.selectByExample(example);
        Assert.assertEquals(goods2.get(0).getId(), Long.valueOf(10041));
        example.setSort(Sort.by(Goods::getName, Sort.Direction.DESC).and(Goods::getId, Sort.Direction.DESC));
        List<Goods> goods3 = goodsMapper.selectByExample(example);
        Assert.assertEquals(goods3.get(0).getId(), Long.valueOf(10041));
    }
}
//分页
@Test
public void testSelectWithPage() {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        GoodsMapper goodsMapper = session.getMapper(GoodsMapper.class);
        Page list = Page.of(1, 3, true).list(() -> goodsMapper.selectAllGoods());
        Assert.assertEquals(list.getTotal(), 100L);
        Assert.assertEquals(list.size(), 3);
        List<Map<String, Object>> list2 = goodsMapper.selectAllGoodsWithPage(Page.of(1, 5));
        Assert.assertEquals(list2.size(), 5);
    }
}    

}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/cjbi-mybatis-ext.git
git@api.gitlife.ru:oschina-mirror/cjbi-mybatis-ext.git
oschina-mirror
cjbi-mybatis-ext
cjbi-mybatis-ext
master