【Springboot】mybatis进阶操作

动态sql

动态SQL是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的sql拼接。根据需求,动态拼接sql.

1.增加

根据用户的输入情况,进行插入。

-- 全部输入
insert into userinfo(username,password,age,gender,phone) values (?,?,?,?,?);
-- 如果性别为空
insert into userinfo(username,password,age,phone) values (?,?,?,?);
-- 如果年龄为空
insert into userinfo(username,password,age,phone) values (?,?,?,?);

if 标签

在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.example.mybatisdemo.mapper.User2Mapper">
    <insert id="insertByXML" useGeneratedKeys="true" keyProperty="id">
        insert into userinfo(
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                password,
            </if>
            <if test="age != null">
                age,
            </if>
            <if test="gender != null">
                gender,
            </if>
            <if test="phone != null">
                phone
            </if>
            )
        values (
            <if test="username != null">
                #{username},
            </if>
            <if test="password != null">
                #{password},
            </if>
            <if test="age != null">
                #{age},
            </if>
            <if test="gender != null">
                #{gender},
            </if>
            <if test="phone != null">
                #{phone}
            </if>
            );
    </insert>
</mapper>

实体层代码:

@Mapper
public interface User2Mapper {
     Integer insertByXML(UserInfo userInfo);
}

在注解中实现:

1.把全部的sql放在script标签下
2.使用if标签

 @Insert("<script> " +
         "insert into userinfo(" +
         "            <if test='username != null'>" +
         "                username," +
         "            </if>" +
         "            <if test='password != null'>" +
         "                password," +
         "            </if>" +
         "            <if test='age != null'>" +
         "                age," +
         "            </if>" +
         "            <if test='gender != null'>" +
         "                gender," +
         "            </if>" +
         "            <if test='phone != null'>" +
         "                phone" +
         "            </if>" +
         "            )" +
         "        values (" +
         "            <if test='username != null'>" +
         "                #{username}," +
         "            </if>" +
         "            <if test='password != null'>" +
         "                #{password}," +
         "            </if>" +
         "            <if test='age != null'>" +
         "                #{age}," +
         "            </if>" +
         "            <if test='gender != null'>" +
         "                #{gender}," +
         "            </if>" +
         "            <if test='phone != null'>" +
         "                #{phone}" +
         "            </if>" +
         "            );" +
         "</script>")
 Integer insert(UserInfo userInfo);

script标签中和xml中的内容是一样的。xml更加易读,书写有提示。

如果自由选择mybatis实现方式:

  1. 简单SQL 使用注解
  2. 动态SQL 使用xml

trim标签

trim标签帮我们去除多余的字符。比如上面如果phone为null,那么后面多余的逗号是没有办法处理的。我们解决方案就是使用trim标签。

<?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.example.mybatisdemo.mapper.User2Mapper">
    <insert id="insertByXML" useGeneratedKeys="true" keyProperty="id">
        insert into userinfo
            <trim suffixOverrides="," prefix="(" suffix=")">
                <if test="username != null">
                    username,
                </if>
                <if test="password != null">
                    password,
                </if>
                <if test="age != null">
                    age,
                </if>
                <if test="gender != null">
                    gender,
                </if>
                <if test="phone != null">
                    phone
                </if>
            </trim>
        values
            <trim suffixOverrides="," prefix="(" suffix=")">
                <if test="username != null">
                    #{username},
                </if>
                <if test="password != null">
                    #{password},
                </if>
                <if test="age != null">
                    #{age},
                </if>
                <if test="gender != null">
                    #{gender},
                </if>
                <if test="phone != null">
                    #{phone}
                </if>
            </trim>

    </insert>
</mapper>

prefixOverrides:去除trim标签代码块最前面指定的字符
prefix:在trim标签代码块最前面添加指定的字符
suffix:在trim标签代码块最后面添加指定的字符
suffixOverrides:去除trim标签代码块最后面指定的字符

2.查询

List<UserInfo> select(UserInfo userInfo);

如果使用trim+if标签处理没有任何参数的时候,需要加上条件1=1.

<select id="select" resultType="com.example.mybatisdemo.entity.UserInfo">
    select * from userinfo
    where 1=1
    <trim prefixOverrides="and">
        <if test="username!=null">
            and username = #{username}
        </if>
        <if test="age!=null">
            and age = #{age}
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
    </trim>
</select>

除此之外也可以使用where标签

where标签

<select id="select" resultType="com.example.mybatisdemo.entity.UserInfo">
    select * from userinfo
    <where>
        <if test="username!=null">
            username = #{username}
        </if>
        <if test="age!=null">
            and age = #{age}
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
    </where>
</select>

3.修改

Integer update(UserInfo userInfo);

xml文件中使用trim + if代码:

<update id="update">
    update userinfo set
        <trim suffixOverrides=",">
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
            <if test="gender != null">
                gender = #{gender}
            </if>
        </trim>
    where id = #{id}
</update>

set标签

<update id="update">
    update userinfo
    <set>
        <if test="username!=null">
            username = #{username},
        </if>
        <if test="password!=null">
            password = #{password},
        </if>
        <if test="gender!=null">
            gender = #{gender}
        </if>
    </set>
    where id = #{id}
</update>

测试代码:

@Test
void update() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(5);
    userInfo.setPassword("12123456");
    user2Mapper.update(userInfo);
}

4.删除

foreach标签

属性:

  • collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串
Integer batchDelete(List<Integer> ids);

xml文件中的代码:

<delete id="batchDelete">
    delete from userinfo
    where id in
        <foreach collection="ids" separator="," item="id" open="(" close=")">
            #{id}
        </foreach>
</delete>

sql和include标签

把一些重复的sql可以提取出来,使用标签来标识,使用时,使用标签。

比如:

<sql id="selectTable">
    select * from userinfo
</sql>
<select id="select" resultType="com.example.mybatisdemo.entity.UserInfo">
    <include refid="selectTable"></include>
    where 1=1
    <trim prefixOverrides="and">
        <if test="username!=null">
            and username = #{username}
        </if>
        <if test="age!=null">
            and age = #{age}
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
    </trim>
</select>
<select id="select2" resultType="com.example.mybatisdemo.entity.UserInfo">
    <include refid="selectTable"></include>
    <where>
        <if test="username!=null">
            username = #{username}
        </if>
        <if test="age!=null">
            and age = #{age}
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
    </where>
</select>

mybatis练习–表白墙

添加依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

yml配置文件

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/messagewall?characterEncoding=utf8&useSSL=false
    username: root
    password: abc123
mybatis:
  configuration: # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰自动转换
  # 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mapper/**Mapper.xml

数据库设计:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS messagewall CHARSET utf8;
USE messagewall;
-- 创建表
DROP TABLE IF EXISTS 
CREATE TABLE message_info(
	id INT PRIMARY KEY AUTO_INCREMENT,
	`from` VARCHAR(127) NOT NULL,
	`to` VARCHAR(127) NOT NULL,
	`message` VARCHAR(127) NOT NULL,
	`delete_flag` TINYINT(4) DEFAULT 0, # 0正常,1删除
	create_time DATETIME DEFAULT NOW(),
	update_time DATETIME DEFAULT NOW()
);

实体类改变:

@Data
public class MessageInfo {
    private Integer id;
    private String from;
    private String to;
    private String message;
    private String deleteFlag;
    private Date createTime;
    private Date updateTime;
}

实体层代码:

@Mapper
public interface MessageMapper {
    @Insert("insert into message_info (`from`,`to`,`message`) values (#{from},#{to},#{message})")
    public Integer insertMessage(MessageInfo messageInfo);
    @Select("select * from message_info")
    public List<MessageInfo> selectAllMessage();
}

service层代码:

@Service
public class MessageService {
    @Autowired
    MessageMapper messageMapper;
    public Integer add(MessageInfo messageInfo){
        Integer result = messageMapper.insertMessage(messageInfo);
        return result;
    }
    public List<MessageInfo> getAllMessage(){
        return messageMapper.selectAllMessage();
    }
}

controller层代码:

@RestController
@RequestMapping("/message")
public class MessageController {
    @Autowired
    private MessageService messageService;
    @RequestMapping("/publish")
    public boolean publishMessage(@RequestBody MessageInfo messageInfo){
        System.out.println(messageInfo);
        if (!StringUtils.hasLength(messageInfo.getFrom()) ||
            !StringUtils.hasLength(messageInfo.getTo()) ||
            !StringUtils.hasLength(messageInfo.getMessage())){
            return false;
        }
        messageService.add(messageInfo);
        return true;
    }
    @RequestMapping("/getMessageList")
    public List<MessageInfo> getMessageList(){
        return messageService.getAllMessage();
    }
}

前端代码和springMVC中一样,不需要进行改变。

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot的包括以下几个方面: 1. 配置文件自定义:在Spring Boot项目中,可以通过配置文件来配置各种参数,包括数据库连接、日志级别等。可以使用application.properties或application.yml文件来行配置。可以通过在配置文件中设置不同的属性值来实现对应用程序的一步定制。 2. 数据库访问:Spring Boot提供了对多种数据库的支持,包括MySQL、Oracle、SQL Server等。可以使用Spring Data JPA、MyBatis等框架行数据库操作,通过定义实体类和Repository接口来实现对数据库的访问。 3. 缓存管理:Spring Boot支持多种缓存管理器,包括Ehcache、Redis等。可以通过在配置文件中行相应的配置,使用注解将数据存储到缓存中,提高系统的性能和响应速度。 4. 安全管理:Spring Boot提供了一套完整的安全框架,可以对应用程序的资源行授权和认证。可以通过配置用户名、密码、角色等信息来保护应用程序的安全性。 5. 日志管理:Spring Boot内置了日志框架,可以通过配置文件来设置日志的级别、格式等。可以使用Logback或Log4j等日志框架来行日志的记录和管理。 6. 监控和管理:Spring Boot提供了多种监控和管理工具,可以通过集成Actuator模块来实现对应用程序的监控和管理。可以通过访问特定的URL来获取应用程序的健康状态、性能指标等信息。 7. 部署和运维:Spring Boot支持多种部署方式,包括打包成WAR文件、打包成可执行JAR文件等。可以使用Docker等容器技术行应用程序的部署和管理。 总结起来,Spring Boot的包括配置文件自定义、数据库访问、缓存管理、安全管理、日志管理、监控和管理以及部署和运维等方面。这些功能可以帮助开发者更好地构建、部署和管理Spring Boot应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值