【mybatis】springboot整合mybatis

依赖

注意:用的是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>

猜你喜欢

转载自blog.csdn.net/kanseu/article/details/125709128