Mybatis实现增删改查 -- Mybatis快速入门保姆级教程(二)(1)

简介: Mybatis实现增删改查 -- Mybatis快速入门保姆级教程(二)

前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。

(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)


五、配置文件完成增删改查

1.学习目标

2.入门案例环境准备

(详细代码可以在作者主页的mybatisy源码re_crud_demo模块里找到)

  1. 在数据库创建实体类表tb_brand
  • 代码
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
    -- id 主键
    id           int primary key auto_increment,
    -- 品牌名称
    brand_name   varchar(20),
    -- 企业名称
    company_name varchar(20),
    -- 排序字段
    ordered      int,
    -- 描述信息
    description  varchar(100),
    -- 状态:0:禁用  1:启用
    status       int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
       ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
       ('小米', '小米科技有限公司', 50, 'are you ok', 1);
SELECT * FROM tb_brand;
  • 效果

  1. 创建对应的实体类brand
package org.example.pojo;
//此处省略getter、setter和toString方法
public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;
  1. 在test包下的test文件下创建测试样例MybatisTest

  1. 安装MybatisX插件

  1. 文件结构预览

3.查询–查询所有

  1. 操作步骤

  1. 编写接口方法:Mapper接口
public interface BrandMapper {
    /**
     * 查询所有
     */
    List<Brand> selectAll();
}
  1. 编写SQL语句:SQL映射文件
<?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">
<!--
    namespace:名称空间
-->
<mapper namespace="org.example.mapper.BrandMapper">
    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>
</mapper>
  1. 编写测试样例
public class MyBatisTest {
    @Test
    public void testSelectAll() throws IOException {
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3. 获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4. 执行方法
        List<Brand> brands = brandMapper.selectAll();
        System.out.println(brands);
        //5. 释放资源
        sqlSession.close();
    }
}
  1. 运行结果

  1. 小结

  1. 问题
  • 问题描述: 查询出来的brandName和companyName为空

  • 原因: 数据库表的字段名称 和 实体类的属性名称 不一样,则不能自动封装数据

(实体类属性名)

(数据库名称)

  • 解决方案一
起别名:对不一样的列名起别名,让别名和实体类的属性名一样
     * 缺点:每次查询都要定义一次别名
         * sql片段
            * 缺点:不灵活

(sql片段):

<!--
        sql片段
    -->
    <sql id="brand_column">
         id, brand_name as brandName, company_name as companyName, ordered, description, status
     </sql>
     <select id="selectAll" resultType="brand">
         select
             <include refid="brand_column" />
         from tb_brand;
     </select>

运行结果:

  • 解决方案二:resultMap
resultMap:
     1. 定义<resultMap>标签
     2. 在<select>标签中,使用resultMap属性替换 resultType属性

对应的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">
<!--
    namespace:名称空间
-->
<mapper namespace="org.example.mapper.BrandMapper">
<!--    id属性 ,resultMap标签的标识。-->
<!--    type属性 ,返回值的全限定类名,或类型别名。-->
    <resultMap id="brandResultMap" type="brand">
        <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
        -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>
</mapper>

运行结果:

4.查询–根据id查询

  1. 操作步骤

2. 编写接口方法:Mapper接口

package org.example.mapper;
import org.example.pojo.Brand;
import java.util.List;
public interface BrandMapper {
    /**
     * 查询所有
     */
    List<Brand> selectAll();
    /**
     * 查看详情:根据Id查询
     */
    Brand selectById(int id);
}
package org.example.mapper;
import org.example.pojo.Brand;
import java.util.List;
public interface BrandMapper {
    /**
     * 查看详情:根据Id查询
     */
    Brand selectById(int id);
}
  1. 编写SQL语句:SQL映射文件
<?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">
<!--
    namespace:名称空间
-->
<mapper namespace="org.example.mapper.BrandMapper">
    <resultMap id="brandResultMap" type="brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand where id = #{id};
    </select>
</mapper>
  1. 编写测试样例
public class MyBatisTest {
    @Test
    public void testSelectById() throws IOException {
        //接收参数
        int id = 1;
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3. 获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4. 执行方法
        Brand brand = brandMapper.selectById(id);
        System.out.println(brand);
        //5. 释放资源
        sqlSession.close();
    }
}
  1. 运行结果

  1. BrandMapper.xml中的sql语句的参数占位符

1. #{}:会将其替换为 ?,为了防止SQL注入

2. ${}:拼sql。会存在SQL注入问题

3. 使用时机:
    * 参数传递的时候:#{}
    * 表名或者列名不固定的情况下:${} 会存在SQL注入问题
  1. BrandMapper.xml配置文件中sql语句select标签中的参数类型

* 参数类型:parameterType:可以省略
  1. sql语句中的特殊字符处理

* 特殊字符处理:
        1. 转义字符:

2. CDATA区:


相关文章
|
4月前
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
193 0
|
2月前
|
SQL JavaScript Java
springboot+springm vc+mybatis实现增删改查案例!
springboot+springm vc+mybatis实现增删改查案例!
27 0
|
5天前
|
SQL Java 数据库连接
【mybatis】动态sql之批量增删改查
【mybatis】动态sql之批量增删改查
11 0
|
18天前
|
Java 数据库连接 数据库
spring+mybatis_编写一个简单的增删改查接口
spring+mybatis_编写一个简单的增删改查接口
16 2
|
2月前
|
XML Java 数据库连接
Mybatis-Plus学习小项目及详细教程
Mybatis-Plus学习小项目及详细教程
|
3月前
|
XML Java 数据库连接
【JavaEE进阶】 MyBatis使用XML实现增删改查
【JavaEE进阶】 MyBatis使用XML实现增删改查
|
3月前
|
Java 关系型数据库 数据库连接
【JavaEE进阶】 MyBatis使用注解实现增删改查
【JavaEE进阶】 MyBatis使用注解实现增删改查
|
3月前
|
XML 监控 druid
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
|
3月前
|
SQL Java 数据库连接
【MyBatisPlus】通俗易懂 快速入门 详细教程
【MyBatisPlus】通俗易懂 快速入门 详细教程
83 0
|
3月前
|
SQL Java 数据库连接
【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门
【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门
55 0