MyBatis-Ext — удобное расширение MyBatis
MyBatis-Ext является расширением MyBatis, которое упрощает работу с операциями CRUD для одной таблицы и предоставляет общие функции, такие как функциональное программирование, поддержка пагинации запросов и пользовательских методов. Оно также обеспечивает защиту от SQL-инъекций, простую интеграцию и не изменяет исходный код MyBatis.
<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>
//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;
//здесь опущены геттеры и сеттеры
}
public interface UserMapper extends BaseMapper<User> {
}
Mybatis-Ext поддерживает Java, Springframework и SpringBoot.
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);
}
}
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:
spring.datasource.driver-class-name=<JDBC驱动> spring.datasource.url= spring.datasource.username=<用户名> spring.datasource.password=<密码>
mybatis.mapper-locations=classpath:tech.wetech.mybatis.mapper/*Mapper.xml
В стартовом классе добавить @MapperScan аннотацию, указать путь интерфейса Mapper для сканирования. @SpringBootApplication @MapperScan(basePackages = "tech.wetech.mybatis.mapper") public class MybatisExtSpringBootApplication { //此处省略main方法... }
Разработка и вызов: @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 )