【八】Spring Boot之 SpringBoot + Mybatis 增删改查 总结(XML、注解、动态SQL,一对一关联查询、一对多关联查询)

一、insert

  parameterType ,入参的全限定类名或类型别名

   keyColumn ,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

   keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

   useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

   statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE

   flushCache ,取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存

   timeout ,默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常

   databaseId ,取值范围oracle|mysql等,表示数据库厂家,元素内部可通过`<if test="_databaseId = 'oracle'">`来为特定数据库指定不同的sql语句

 

1.返回值为插入的记录数目

XML方式普通例子

  <insert id="insert" parameterType="com.sid.model.User" >
    insert into user (id, name, password, 
      mobile_phone)
    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
      #{mobilePhone,jdbcType=VARCHAR})
  </insert>

注解方式

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);

2.返回值为操作后获取记录主键

xml方式 

 <insert id="insert" parameterType="com.sid.model.User" useGeneratedKeys="true" keyProperty="id" >
    insert into user (id, name, password, 
      mobile_phone)
    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
      #{mobilePhone,jdbcType=VARCHAR})
  </insert>

注解方式

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{user.name}, #{user.age})")
@Options(useGeneratedKeys = true, keyProperty = "user.id")
int insert(@Param("user") User user);

@Options注解常用属性: 
- flushCache:刷新缓存策略,有DEFAULT,TRUE,FALSE三种值,默认DEFAULT表示刷新查询语句的缓存 
- useCache:默认true,表示使用缓存 
- fetchSize:查询时的获取数量 
- useGeneratedKeys:默认false,是否返回插入的id 
- keyProperty:实体类id属性 
- keyColumn:实体类属性对应数据库的字段

3.批量插入

1.foreach方式

mapper.java

    //ra对应roleAuthMapper.xml中的,修改的话要同时改
    void insertBatch(List<RoleAuth> ra);

mapper.xml

 <insert id="insertBatch" parameterType="List">
    INSERT INTO role_auth
    (role_id, menu_id, creator,create_time)
    VALUES
    <foreach collection ="list" item="ra" separator ="," close=";">
      (#{ra.roleId}, #{ra.menuId}, #{ra.creator}, #{ra.createTime})
    </foreach >
  </insert>

2.ExecutorType.BATCH方式

java

注意,这个opensession默认是关闭自动提交的,所以最后需要sqlSession.commit

        long start = System.currentTimeMillis();
        User user;
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH/*,false*/);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        for (int i = 0; i < 5; i++) {
            user = new User();
            user.setId(i*100L);
            user.setName("name" + i);
            user.setPassword("123");
            user.setMobilePhone("123");
            mapper.insert(user);
        }
        sqlSession.commit();
        sqlSession.close();
        long end = System.currentTimeMillis();
        System.out.println("---------------" + (start - end) + "---------------");

二、select

1.普通例子

XML方式

 <resultMap id="BaseResultMap" type="com.sid.model.User" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="mobile_phone" property="mobilePhone" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, name, password, mobile_phone
  </sql>  
 <select id="selectAll" resultMap="BaseResultMap"  >
    select
    <include refid="Base_Column_List" />
    from user
  </select>

注解方式

@Select("select id,name,age,mobile_phone from user where id = #{id}")
int select(@Param("id") Long id);

2.动态SQL

1.<if>

xml方式

<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = 'ACTIVE'
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

注解方式(动态SQL的注解方式都一样,不一一介绍)

用script标签包围,然后像xml语法一样写

@Select("<script>"
+"SELECT * FROM BLOG WHERE state = 'ACTIVE'"
+" <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>"
+"</script>")
Blog select(@Param("title ") Long title ,@Param("author ") Author author );

2.<choose> <when> <otherwise>

类似于Java 中的 switch 语句。还是上面的例子,但是这次变为提供了“title”就按“title”查找,提供了“author”就按“author”查找的情形,若两者都没有提供,就返回所有符合条件的 BLOG

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

3.<where>

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

4.<foreach>

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

3.关联查询<association>

1.一对一关联

相当于

public class Classes{
    private Long id ;
    private String name;
    private Teacher teacher;
    省略setter getter
}

public class Teacher{
    private Long id;
    private String name;
    省略setter getter
}

 

XML方式

嵌套结果和嵌套查询。

<association javaType=‘Teacher’>指的是POJO中属性的类型

<!-- 根据班级id查询班级和教师信息 -->
    <select id="getClass" resultMap="ClassResultMap">
        select *
        from class as c
        left join
        teacher as t on c.teacher_id = t.t_id
        where c.c_id
        = #{id}
    </select>

    <!-- 嵌套结果 -->
    <resultMap type="Classes" id="ClassResultMap">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <association property="teacher" javaType="Teacher">
            <id property="id" column="t_id" />
            <result property="name" column="t_name" />
        </association>
    </resultMap>

    <select id="getClass2" parameterType="int"
        resultMap="ClassResultMap2">
        select * from class where c_id=#{id}
    </select>


    <!-- 嵌套查询 -->
    <resultMap type="Classes" id="ClassResultMap2">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <association property="teacher" column="teacher_id"
            select="getTeacher" />
    </resultMap>

    <select id="getTeacher" parameterType="int" resultType="Teacher">
        SELECT
        t_id id, t_name name from teacher where t_id=#{id}
    </select>

注解方式@Results @Result

one=@one 代表一对一

select="com.sid.mapper.TeacherMapper.selectById" 是指的调用TeacherMapper接口的selectById方法,入参是@Result(column="teacher_id",property="teacher"中的teacher_id

fetchType=FetchType.LAZY 获取当前pojo后延迟加载对应数据

fetchType=FetchType.EAGER 获取当前pojo后立即加载对应数据

延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来。Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来。

@Mapper
public interface ClassesMapper {

    @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="name",property="name"),
            @Result(column="teacher_id",property="teacher",
                    one=@One(
                            select="com.sid.mapper.TeacherMapper.selectById"/*,fetchType= FetchType.EAGER*/
                            /*fetchType= FetchType.LAZY*/))
    })
    @Select("select * " +
            "from classes c " +
            "where c.id = #{id}")
    public Classes selectAssociat(Long id);
}
@Mapper
public interface TeacherMapper {

    @Select("select * from teacher where id = #{id}")
    public Teacher selectById(@Param("id")Long id);
}

 

2.一对多关联

相当于

public class Classes{
    private Long id ;
    private String name;
    private Teacher teacher;
    private List<Student> students;
    省略setter getter
}

public class Teacher{
    private Long id;
    private String name;
    省略setter getter
}

public class Student{
    private Long id;
    private String name;
    省略setter getter
}

XML实现

<collection ofType=‘Student’>值得是映射到list集合属性中POJO的类型 

<select id="getClass3" parameterType="int"
        resultMap="ClassResultMap3">
        select *
        from class c
        left join teacher t on c.teacher_id =
        t.t_id
        left join student
        s on c.c_id = s.class_id
        where c.c_id = #{id}
    </select>

    <resultMap type="Classes" id="ClassResultMap3">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <association property="teacher" column="teacher_id"
            javaType="Teacher">
            <id property="id" column="t_id" />
            <result property="name" column="t_name" />
        </association>
        <collection property="students" ofType="Student">
            <id property="id" column="s_id" />
            <result property="name" column="s_name" />
        </collection>
    </resultMap>

注解实现

 Many=@Many

select="com.sid.mapper.StudentMapper.selectByClassId" 是指的调用StudentMapper接口的selectByClassId方法,入参是@Result(column="id",property="students"中的id,即是查询完后的课程ID

    @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="name",property="name"),
            @Result(column="teacher_id",property="teacher",
                    one=@One(
                            select="com.sid.mapper.TeacherMapper.selectById"
                            )),
            @Result(column="id",property="students",
                    many=@Many(
                            select="com.sid.mapper.StudentMapper.selectByClassId"
                            ))
    })
    @Select("select * " +
            "from classes c " +
            "where c.id = #{id}")
    public Classes selectOneToMany(Long id);
@Repository
public interface StudentMapper {

    @Select("select * from student where class_id = #{classId}")
    public List<Student> selectByClassId(@Param("classId")Long classId);

}

 

三、parametertype 多个入参

1.单个入参

<select id="getUserByMobilePhone" resultMap="BaseResultMap" parameterType="java.lang.String" >
  select
  <include refid="Base_Column_List" />
  from user
  where mobile_phone = #{mobilePhone,jdbcType=VARCHAR}
</select>

2.多个入参

XML方式

在mapper.java中使用@Param

List<WhiteList> selectAll(@Param("name")String name, @Param("url") String url);

mapper.xml中不用@parameterType

取值#{url}不用再指明jdbcType=VARCHAR 

<select id="selectAll" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from white_list
    <where>
      <if test="name!=null">
        name like #{name}
      </if>

      <if test="url!=null">
        and url like #{url}
      </if>
    </where>
  </select>

注解map方式(XML也能用map入参,@parameterType=‘java.util.Map这里不演示)

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})")
int insertByMap(Map<String, Object> map);

注解model类方式(XML也能用model入参,@parameterType=‘com.sid.User’这里不演示

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insertByUser(User user);

四、update

XML方式示例

<update id="updateByPrimaryKey" parameterType="com.sid.model.User" >
    update user
    set name = #{name,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR},
      mobile_phone = #{mobilePhone,jdbcType=VARCHAR}
    where id = #{id,jdbcType=BIGINT}
  </update>

注解方式 

 @Update("update user set userId=#{userId},password=#{password},comment=#{comment} where userName=#{userName}")  
    public int update ( User user );  

五、delete

XML方式示例

<delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
    delete from user
    where mobile_phone = #{mobilePhone,jdbcType=VARCHAR}
  </delete>

注解方式 

@Delete("delete from user where userName = #{userName}")  
    public int delete ( String userName );  

 

### 回答1: Spring Boot 是一个快速开发框架,MyBatis 是一个优秀的持久层框架,二者结合可以实现增删改查操作。具体实现步骤如下: 1. 配置数据源和 MyBatisSpring Boot 中,可以通过配置文件或者注解的方式配置数据源和 MyBatis。配置完成后,需要在启动类上添加 @MapperScan 注解,扫描 Mapper 接口。 2. 编写 Mapper 接口和 XML 文件 Mapper 接口定义了增删改查的方法,XML 文件中编写 SQL 语句。可以使用 MyBatis 提供的注解方式或者 XML 配置方式。 3. 编写 Service 层 Service 层调用 Mapper 接口中的方法,实现业务逻辑。 4. 编写 Controller 层 Controller 层接收请求,调用 Service 层中的方法,返回结果给前端。 以上就是 Spring Boot + MyBatis 实现增删改查的基本步骤。 ### 回答2: Spring Boot是一个快速开发框架,它简化了Spring应用程序的配置和部署过程。同时、Mybatis是一个轻量级的ORM框架,它可以简化与关系型数据库的交互过程。在结合Spring BootMybatis进行开发时,可以更加简化我们的开发过程。 在Spring Boot使用Mybatis时,需要进行以下操作: 1. 引入依赖 在pom.xml文件中,需要加入以下依赖: ```xml <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> ``` 2. 配置数据源 在application.yml文件中,需要配置数据源的信息: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 3. 定义MapperMybatis中,可以使用注解XML文件来定义Mapper,这里我们以注解的方式来演示: ```java @Mapper public interface UserMapper { @Select("select id, name, age from user where id = #{id}") User findById(long id); @Insert("insert into user(name, age) values(#{name}, #{age})") int insert(User user); @Update("update user set name = #{name}, age = #{age} where id = #{id}") int update(User user); @Delete("delete from user where id = #{id}") int delete(long id); } ``` 4. 注入Mapper 在Service层中,需要注入Mapper进行数据库操作: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User findById(long id) { return userMapper.findById(id); } public int insert(User user) { return userMapper.insert(user); } public int update(User user) { return userMapper.update(user); } public int delete(long id) { return userMapper.delete(id); } } ``` 5. 测试 完成以上步骤后,就可以进行增删改查的测试了: ```java @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { @Autowired private UserService userService; @Test public void testFindById() { User user = userService.findById(1L); assertNotNull(user); } @Test public void testInsert() { User user = new User(3L, "test", 30); int rows = userService.insert(user); assertEquals(1, rows); } @Test public void testUpdate() { User user = userService.findById(1L); user.setName("update"); user.setAge(20); int rows = userService.update(user); assertEquals(1, rows); } @Test public void testDelete() { int rows = userService.delete(1L); assertEquals(1, rows); } } ``` 通过以上步骤的操作,我们就可以在Spring Boot使用Mybatis进行增删改查操作了。当然,在实际开发中,还需要考虑数据库的事务、异常处理等情况,这些内容可以进一步学习和探索。 ### 回答3: SpringBoot是一个基于Spring框架的快速开发脚手架,它简化了Spring应用的开发过程,使得开发者可以更快速地搭建应用。MyBatis是一款优秀的持久层框架,它可以提供灵活性和高效性。在SpringBoot使用MyBatis进行增删改查非常方便,本文将介绍如何实现这一过程。 1. 建立Maven项目 在Eclipse或者Idea等IDE中建立一个Maven项目,我们需要在pom.xml文件中引入SpringBootMyBatis的依赖。 2. 配置数据源 我们需要在application.properties文件中配置数据库连接参数,包括driver、url、username和password等参数。这些参数取决于用户使用的数据库类型和所处环境的配置。 3. 配置MyBatisSpringBoot中集成MyBatis非常方便,我们只需要在配置文件中加入MyBatis的配置即可。如下代码: mybatis.mapper-locations=classpath:mybatis/mapper/*.xml mybatis.type-aliases-package=com.example.demo.domain 4. 编写实体类和Mapper文件 实体类通常对应着数据库中的一个表,MyBatis中的Mapper文件则定义了数据库操作所需要的SQL语句和对实体类的映射关系。可以借助MyBatis Generator插件自动生成Mapper和实体类文件。 5. 编写Service和Controller Service层对MyBatis进行了简单的封装,Controller层则处理HTTP请求和响应。我们需要借助@Autowired注解将Service和Mapper注入到Controller中。 6. 测试增删改查功能 我们可以通过Postman等工具或编写JUnit测试用例来测试程序功能的正确性。当然,在测试之前要确保数据库表已经存在,并已初始化数据。 在SpringBoot使用MyBatis进行增删改查非常简单,只需要通过配置文件将MyBatis集成进来即可。如果在使用过程中遇到了问题,可以通过查看控制台日志或MyBatis Generator生成的代码来进行排查。祝开发愉快!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值