MyBatisPlus学习笔记(一)Mapper CRUD接口 Wrapper条件构造器
文章目录
Mapper CRUD接口
基础配置
-
以下所有方法都建立在此基础之下
-
public class TestMP { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); EmployeeMapper empMapper = applicationContext.getBean("employeeMapper", EmployeeMapper.class); // ... }
-
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 基于注解的事务管理 --> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/> <!-- 配置SqlSessionFactoryBean Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 别名处理 --> <property name="typeAliasesPackage" value="com.fu.bean"></property> <!-- 注入全局MP策略配置 --> <property name="globalConfig" ref="globalConfiguration"></property> </bean> <!-- 定义MybatisPlus的全局策略配置--> <bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- 在2.3版本以后,dbColumnUnderline 默认值就是true 驼峰命名法 --> <property name="dbColumnUnderline" value="true"></property> <!-- 全局的主键策略 value: AUTO(0, "数据库ID自增"), INPUT(1, "用户输入ID"), 以下2种类型、只有当插入对象ID 为空,才自动填充。 ID_WORKER(2, "全局唯一ID"), UUID(3, "全局唯一ID"), NONE(4, "该类型为未设置主键类型"), ID_WORKER_STR(5, "字符串全局唯一ID"); --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> </bean> <!-- 配置mybatis 扫描mapper接口的路径 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.fu.mapper"></property> </bean> </beans>
-
mybatis-config.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> </configuration>
-
db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/xxx jdbc.user=xxx jdbc.password=xxx # 将xxx改为自己的即可
-
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
验证数据库是否连接成功
-
@Test public void testDatasource() throws SQLException { DataSource sd = applicationContext.getBean("dataSource", DataSource.class); System.out.println(sd); Connection connection = sd.getConnection(); System.out.println(connection); } // 打印出 com.mchange.v2.c3p0.impl.NewProxyConnection@353352b6 [wrapping: com.mysql.jdbc.JDBC4Connection@4681c175] 即代表连接成功
通用CRUD
通用CRUD insert
public void testInsertAllColumn() {
Employee employee = new Employee();
employee.setLastName("efda");
// insert方法在插入时, 会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中
Integer result = empMapper.insertAllColumn(employee);
// INSERT INTO tbl_employee ( last_name,email,gender,age ) VALUES ( ?,?,?,? )
// insertAllColumn方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中
// Integer insert = empMapper.insert(employee);
// INSERT INTO tbl_employee ( last_name ) VALUES ( ? )
System.out.println("result="+result);
//获取当前数据在数据库中的主键值
Integer key = employee.getId();
System.out.println("key:" + key );
}
通用CRUD update
public void testUpdate() {
Employee employee = new Employee();
employee.setLastName("az");
employee.setAge(24);
employee.setGender(1);
employee.setId(4);
// Integer update = empMapper.updateById(employee);
// UPDATE tbl_employee SET last_name=?, gender=?, age=? WHERE id=?
// Integer update = empMapper.updateAllColumnById(employee);
// UPDATE tbl_employee SET last_name=?,email=?,gender=?,age=? WHERE id=?
String setSql = "age = 18 where id = 5";
Integer update = empMapper.updateForSet(setSql, null);
// UPDATE tbl_employee SET age = 18 where id = 5
System.out.println("update="+update);
}
通用CRUD select
public void testSelect() {
// 1. 通过id查询
// Employee employee = empMapper.selectById(2);
// SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE id=?
// System.out.println(employee);
//2. 通过多个id进行查询 <foreach>
// List<Integer> ids = new ArrayList<>();
// ids.add(1);
// ids.add(2);
// ids.add(3);
// ids.add(4);
// List<Employee> list = empMapper.selectBatchIds(ids);
// // SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE id IN ( ? , ? , ? , ? )
// System.out.println(list);
//3. 通过多个列进行查询 age + lastName
// 查询的结果只能是一条,如果是多条则报错
// Employee employee = new Employee();
// employee.setLastName("qaaz");
// employee.setAge(18);
// Employee employeeOne = empMapper.selectOne(employee);
// // SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE last_name=? AND age=?
// System.out.println(employeeOne);
//4. 通过Map封装条件查询
// Map<String, Object> map = new HashMap<>();
// map.put("last_name", "az");
// map.put("gender", 1);
// List<Employee> list = empMapper.selectByMap(map);
// SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE gender = ? AND last_name = ?
//5. 分页查询
// 假分页,物理分页,查询所有数据,显示的时候再分页显示
List<Employee> list = empMapper.selectPage(new Page<>(2,3), null);
// SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee
System.out.println(list);
}
通用CRUD delete
public void testDelete() {
// 1. 通过id删除
// Integer result = empMapper.deleteById(1);
// DELETE FROM tbl_employee WHERE id=?
//2. 通过多个id进行删除
// List<Integer> ids = new ArrayList<>();
// ids.add(1);
// ids.add(2);
// ids.add(3);
// Integer result = empMapper.deleteBatchIds(ids);
// DELETE FROM tbl_employee WHERE id IN ( ? , ? , ? )
//3. 通过Map封装条件删除
// 可以删除多个满足条件的数据
Map<String, Object> map = new HashMap<>();
map.put("last_name", "qaaz");
map.put("age", 18);
Integer result = empMapper.deleteByMap(map);
// DELETE FROM tbl_employee WHERE last_name = ? AND age = ?
System.out.println("result="+result);
}
条件构造器(Wrapper)
- 简介:条件构造器是由wrapper这个抽象类构成的,该类有两个子类,分别是EntityWrapper 和 Condition两个类,两个子类用法相同,本例使用EntityWrapper介绍
- [外链图片转存失败(img-GjkVZoIA-1564995361812)(assets/1.png)]
条件构造器 update
public void wrapperUpdate() {
Employee employee = new Employee();
employee.setLastName("kongming");
employee.setAge(20);
employee.setGender(1);
Integer update = empMapper.update(employee, new EntityWrapper<Employee>()
.eq("last_name", "efda")
.eq("gender", 0)
);
// UPDATE tbl_employee SET last_name=?, gender=?, age=? WHERE (last_name = ? AND gender = ?)
System.out.println("update="+update);
}
条件构造器 select
public void wrapperSelect() {
// 1. 查询符合条件的集合
// 查询名字是qaaz,且年龄在18~40之间,或性别是男,名字中含有q的人
/* List<Employee> list = empMapper.selectList(new EntityWrapper<Employee>()
// 必须是数据库字段名
.eq("last_name", "qaaz")
.between("age", 18, 40)
.or() // (last_name = ? AND age BETWEEN ? AND ? OR gender = ? AND last_name LIKE ?)
//.orNew() // (last_name = ? AND age BETWEEN ? AND ?) OR (gender = ? AND last_name LIKE ?)
.eq("gender", 1)
.like("last_name", "q")
);
System.out.println(list);
*/
// 2.查询符合条件的条数
// Integer count = empMapper.selectCount(new EntityWrapper<Employee>().eq("gender", 1));
// System.out.println("count="+count);
// 3.查询满足条件的数据,只返回第一个字段的值
// List<Object> list = empMapper.selectObjs(new EntityWrapper<Employee>().eq("gender", 1));
// System.out.println(list);
// 4. 按照年龄排序,并分页
// 仍然是假分页
/* List<Map<String,Object>> list = empMapper.selectMapsPage(new Page<Employee>(2, 3), new EntityWrapper<Employee>()
// .orderAsc(Arrays.asList(new String[] {"age"} )) //升序
.orderDesc(Arrays.asList(new String[] {"age"} )) // 倒 序
);
// SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee ORDER BY age DESC
System.out.println(list);
*/
// 5. 简单分页, 真实分页
List<Employee> list = empMapper.selectList(new EntityWrapper<Employee>()
.last("limit 1,3"));
// .last() 手动把sql拼接到最后 (有sql注入的风险)
// SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee limit 1,3
System.out.println(list);
}
条件构造器 delete
public void wrapperDelete() {
Integer delete = empMapper.delete(new EntityWrapper<Employee>()
.like("last_name", "s")
);
// DELETE FROM tbl_employee WHERE (last_name LIKE ?)
// Parameters: %s%(String) 会自动添加 %
System.out.println("delete = "+delete);
}