Spring Boot学习笔记(十五)mybatis(二)mybatis常用增删改查xml

此内容来源是:乐天笔记 mybatis

若不懂如何使用这些配置,建议看我的上一篇文章Spring Boot学习笔记(十四)mybatis(一)使用IDEA 整合SpringBoot + mybatis详细流程(有工程源码)

我们利用以下sql,准备好我们的数据库

-- 若有则删除
DROP DATABASE IF EXISTS `blog_db`;

-- 创建数据库
CREATE DATABASE `blog_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 用户表
CREATE  TABLE `blog_db`.`user` (
  `id` BIGINT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_name` (`name`) -- name 保证唯一
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;

-- 用户表添加数据
INSERT INTO `blog_db`.`user` (`name`, `email`, `password`) VALUES ('letian', 'letian@111.com', '123');
INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`) VALUES ('xiaosi', 'xiaosi@111.com', '123');

-- 博客表
CREATE  TABLE `blog_db`.`blog` (
  `id` BIGINT NOT NULL AUTO_INCREMENT ,
  `owner_id` BIGINT NOT NULL ,  -- 所属用户的id
  `title` TEXT NOT NULL ,
  `content` TEXT NOT NULL ,
  PRIMARY KEY (`id`) 
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;

-- 博客表插入数据
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题1', '文本1');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题2', '文本2');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题3', '文本3');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题4', '文本4');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '标题5', '文本5');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('2', '标题21', '文本21');
INSERT INTO `blog_db`.`blog` (`owner_id`, `title`, `content`) VALUES ('1', '你好, World', '你好, 😆');

实体类如下所示:

public class User {
    private Long id;
    private String username;
    private String email;
    private String password;
}

查询(均按照mapper、xml的方式一一对应)

  1. 根据密码,查询其中一个用户
//UserMapper.java

User findOneUserByPassword(String password); 
// 必须保证最多返回一条数据,否则会报 TooManyResultsException 错误。
// 无数据,则返回null
    <select id="findOneUserByPassword" parameterType="String" resultType="bean.User">
        select
        * from blog_db.user where password=#{password} order by id asc limit 1
    </select>
  1. 根据密码,查询所有用户
//UserMapper.java

List<User> findByPassword(String password);
    <select id="findByPassword" resultType="com.example.demo.bean.User">
        select * from blog_db.user where password = #{password}
    </select>
  1. 当实体类与数据库的与数据库的字段不一致时(resultMap)
//User.java

public class User {
    private Long id;
    private String username; // 数据库字段是 name
    private String email;
    private String password;
}
    <resultMap id="userResult" type="com.example.demo.bean.User">
        <result property="username" column="name" javaType="String" jdbcType="VARCHAR"/>
    </resultMap>
    <select id="findByPassword" resultMap="userResult" resultType="com.example.demo.bean.User">
        select * from blog_db.user where password = #{password}
    </select>

select中有个resultMap属性,将resultMap填入,根据resultMap中的定义,username对应数据库name列,即可生成符合实体类的查询信息

查询结果:id=1, username=letian, email=letian@111.com, password=123
  1. 当有多个参数的时候
//UserMapper.java
User findByNameAndPassword(String password, String name);
//此处的参数是先密码,后姓名
// 查询
<select id="findByNameAndPassword" resultType="com.example.demo.bean.User">
    select * from blog_db.user where name=#{username} and password=#{password}
</select>

或者

 <select id="findByNameAndPassword" resultType="com.example.demo.bean.User">
     select * from blog_db.user where name = #{param2} and password = #{param1}
 </select>

若使用param2,param1这种,则会根据参数的顺序填入,若使用username,password,则会根据参数的名称填入

  1. Map作为参数的时候(parameterType)
    Map作为参数与实体类作为参数相同
//UserMapper.java
User findByMap(Map<String, Object> data);
    <select id="findByMap" resultType="com.example.demo.bean.User" parameterType="java.util.Map">
                select * from blog_db.user where name=#{name} and password=#{password}  
    </select>

mybatis 会自动将 Map 参数解开,所以这里的占位符可以用#{username}、#{password}。也可以写为

select * from blog_db.user where name=#{param1.name} and password=#{param1.password}
  1. 当使用了@Param
// UserMpaaer.java
User findByUser(@Param("userParam") User user);
    <select id="findByUser" parameterType="com.example.demo.bean.User" resultType="com.example.demo.bean.User">
        select * from blog_db.user where name=#{userParam.name} and password=#{userParam.password}
    </select>

占位符除了可以用#{user.name}、#{user.password},还可以用#{param1.name}、#{param1.password}。
但是,占位符不能用#{name}、#{password}。

  1. 排序查询
//UserMapper.java
List<User> findByPasswordOrderDesc(String password);
    <select id="findByPasswordOrderDesc" resultMap="userResult" resultType="com.example.demo.bean.User">
        select * from blog_db.user as user where password = #{password} ORDER BY user.name DESC
    </select>
  1. 插入
    由于我们的主键(id)是自增的,所以需要使用useGeneratedKeys和keyProperty
//UserMapper
/**
 * 根据 id 更新密码
 * @return 影响的行数
 */
int updateUserPasswordById(User user);
 <insert id="insertUser" parameterType="com.example.demo.bean.User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO blog_db.user (name, email, password)
    VALUES (#{name}, #{email}, #{password})
</insert>

useGeneratedKeys:(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
keyProperty: (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

//UserMapper
int updateUserPasswordById(User user);
<update id="updateUserPasswordById" parameterType="bean.User">
    UPDATE blog_db.user
    SET password=#{password}
    WHERE id=#{id}
</update>
  1. 删除
//UserMapper.java
/**
 * 删除指定id的记录
 * @return 影响的行数
 */
int deleteById(Long id);
<delete id="deleteById" parameterType="Long">
    DELETE FROM blog_db.user WHERE id=#{id}
</delete>

11.动态SQL
我们的查询条件可能发生变化的时候,就需要用到动态sql

//UserMapper.java
User findByName(@Param("name") String name, @Param("optionalPassword") String password);
<select id="findByName" resultType="bean.User">
    select * from blog_db.user
    where name=#{name}
    <if test="optionalPassword != null">
        and password = #{optionalPassword}
    </if>
</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值