依赖
注意:用的是mybatis-spring-boot-starter,分页用到的是pagehelper
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
application.yml配置
mybatis的xml文件我是放在了resources下mybatis文件夹中
#mybatis
mybatis:
mapper-locations: classpath*:mybatis/*.xml
type-aliases-package: com.jane.pojo
configuration:
map-underscore-to-camel-case: true
#showSql
logging:
level:
com.jane.mapper: debug
#pagehelper
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: countSql
批量查询
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
private Integer id;
private String lastName;
private String email;
private String gender;
private Integer age;
}
@Repository
public interface EmployeeMapper {
List<Employee> batchFind(List<Integer> ids);
List<Employee> list();
}
@Service
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
public List<Employee> batchFind(List<Integer> ids){
return employeeMapper.batchFind(ids);
}
public List<Employee> list(){
return employeeMapper.list();
}
}
xml文件
<?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.jane.mapper.EmployeeMapper">
<select id="batchFind" resultType="employee" parameterType="java.util.List">
select * from tbl_employee
<where>
<if test="list!=null and list.size()>0">
and id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</select>
</mapper>
测试
@Test
public void test2(){
List<Employee> employees = employeeService.batchFind(Arrays.asList(1, 3, 4));
log.info("结果:[{}]",employees);
}
批量删除
xml文件
collection
:需要被遍历的对象,当抽象方法的参数只有1个且没有添加@Param
注解时,如果参数类型是List
集合,则取值为list
,如果参数类型是数组,则取值为array
;当抽象方法的参数超过1个,就一定添加了@Param
注解,则取值为@Param
注解配置的参数值
这个 括号没有用到open和close
<delete id="deleteByIds">
DELETE FROM t_user WHERE id IN (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
批量插入
单条插入:
这个 括号用到的是
<trim prefix="(" suffix=")" suffixOverrides=",">
<insert id="insertSimulationData" parameterType="com.yh.domain.TunnelDetectData" keyProperty="id" useGeneratedKeys="true">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
SELECT LAST_INSERT_ID() as id
</selectKey>
insert into tunnel_detect_data
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="stakeNo != null" >
stake_no,
</if>
<if test="deviceNo != null" >
device_no,
</if>
<if test="deviceName != null" >
device_name,
</if>
<if test="tunnelName != null" >
tunnel_name,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=BIGINT},
</if>
<if test="stakeNo != null" >
#{stakeNo,jdbcType=VARCHAR},
</if>
<if test="deviceNo != null" >
#{deviceNo,jdbcType=VARCHAR},
</if>
<if test="deviceName != null" >
#{deviceName,jdbcType=VARCHAR},
</if>
<if test="tunnelName != null" >
#{tunnelName,jdbcType=VARCHAR},
</if>
</trim>
</insert>
多条插入
<foreach collection="list" item="item" index="index" separator=";">
<insert id="insertSimulationDataList" >
insert into tunnel_detect_data
(stake_no, device_no,
device_name, tunnel_name)
values
<foreach collection="list" separator="," index="index" item="item">
(#{item.stakeNo},
#{item.deviceNo},
#{item.deviceName},
#{item.tunnelName})
</foreach>
</insert>
批量更新
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update course
<set>
name=${item.name}
</set>
where id = ${item.id}
</foreach>
</update>
更新、插入、删除的where条件中#{xxxx}可以直接传入一个Dto,会自动解析需要的#{xxx}条件
联表查询
resultMap元素
<resultMap id="" type="">
<id property="属性名" column="查询结果列名"/> //主键使用id
<result property=""/ column=""> //其余使用result
</resultMap>
实现关联单个对象查询(N+1方式)
使用子元素:
<association property="" javaType=“对象类型”(可省略) select=“另一个select元素的引用” column=“传入参数”/>
<!-- 在mapper中实现联合查询 -->
<resultMap type="Student" id="stuMap1">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="sage" property="age"/>
<result column="tid" property="tid"/>
<association property="teacher" javaType="teacher">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
</association>
</resultMap>
<select id="selAll1" resultMap="stuMap1">
select s.id sid,s.name sname,s.age sage,t.id tid,t.name tname
from student s left join teacher t on s.tid = t.id;
</select>
有list元素
public class Teacher {
private int id;
private String name;
private List<Student> list;}
用tid查询学生
<mapper namespace="com.test.mapper.StudentMapper">
<select id="selByTid" resultType="student" parameterType="int" >
select * from student where tid = #{0}
</select>
</mapper>
再用resultmap和collection StudentMapper.selByTid
<mapper namespace="com.test.mapper.TeacherMapper">
<resultMap type="Teacher" id="teacMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list" select="com.test.mapper.StudentMapper.selByTid" column="id"/>
</resultMap>
<select id="selAll" resultMap="teacMap">
select * from teacher
</select>
</mapper>
分页
引用pagehelper,测试:
@Test
public void test3(){
PageHelper.startPage(1,5);
List<Employee> employees = employeeService.list();
PageInfo<Employee> pageInfo=new PageInfo<Employee>(employees);
log.info("结果:[{}]",pageInfo.getList());
}
可以用
<include refid="base_Column_List" />
来将需要的sql语句简化
<select id="xxxList" resultType="com.jane.dto.xxxDto">
SELECT
<include refid="base_Column_List" />
FROM srm_jobs_scheduling d
<include refid="example_join_value" />
<include refid="example_Where_Clause" />
ORDER BY d.jobs_scheduling_id ASC LIMIT 1
</select>
<sql id="base_Column_List">
d.jobs_scheduling_id jobsSchedulingId,
d.jobs_definition_id jobsDefinitionId,
</sql>