Mybatis加深

目录

基本操作

创建数据库表

实体类(根据指定路径及表列名创建)

接口方法

测试类(以查询表格数据为例,没有传参)

工具类

传参

需求:删除id为3的数据(注解开发,不需要映射文件中写sql)

接口方法

测试代码

需求:查询id为2的数据(映射文件中写sql)

映射文件

接口代码

测试代码

需求:修改id为1的数据

映射文件

接口代码

测试代码

需求:增加一条数据(主键)

映射文件

接口代码

测试代码

结果映射以及多个参数传值以及特殊字符处理

需求:查询id>2 status = 1的数据

映射文件

接口代码

测试代码

动态SQL

映射文件


基本操作

创建数据库表

-- 删除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` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('1', '格力', '格力电器股份有限公司', '30', '让世界爱上中国造', '1');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('2', '腾讯', '腾讯计算机系统有限公司', '50', '玩玩玩', '0');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('3', '百度', '百度在线网络技术公司', '5', '搜搜搜', '0');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('4', '京东', '北京京东世纪贸易有限公司', '40', '就是快', '1');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('5', '小米', '小米科技有限公司', '50', 'are you ok', '1');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('6', '三只松鼠', '三只松鼠股份有限公司', '5', '好吃不上火', '0');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('7', '华为', '华为技术有限公司', '100', '万物互联', '1');

实体类(根据指定路径及表列名创建)

略,不建议创建带参构造

接口方法

测试类(以查询表格数据为例,没有传参)

工具类

建议先判空,不用重复创建SQLSession对象

        //        1.加载mybatis核心配置文件,获取SQLSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //    2.获取SQLSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
 //    4.通过sqlSession调用mapper的代理对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //    5.通过mapper调用定义的方法  可改
            List<Brand> brands = mapper.selectAll();
    System.out.println(brands);
    //    4.释放资源
        sqlSession.close();

传参

  • 如果是单个参数,使用#{}接受参数
  • 如果是多个参数,定义一个对象,成员变量的名字和#{变量对应

需求:删除id为3的数据(注解开发,不需要映射文件中写sql)

接口方法

//    删除指定数据

    @Delete("delete from tb_brand where id = #{id}")
    public void deleteOne(Integer id);

测试代码

修改为  mapper.deleteOne(3);

需求:查询id为2的数据(映射文件中写sql)

映射文件

    <select id="selectOne" resultMap="brandMap">
        select * from tb_brand where id = #{id};
    </select>

接口代码

public Brand selectOne(Integer id);

测试代码

Brand brand = mapper.selectOne(2);

需求:修改id为1的数据

映射文件

<!---brand_name 无法获取值,因为对象中的属性是brandName     --->
<!---解决办法1:mybatis框架自带的驼峰命名转换设置    
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
 --->

<!---解决办法2:在命名空间下定义一个resultMap 将selectType替换为resultMap
column列名 property实体变量名
    <resultMap id="brandMap" type="com.itheima.pojo.Brand">
        <result column="brand_name" property="brandName" />
        <result column="company_name" property="companyName" />
    </resultMap>
 --->

<!---解决办法3:加别名     --->

<!---如果是注解开发:@ResultMap(“映射文件中resultmap的id”)     --->


    <update id='updateById'>
        update tb_brand set brand_name = #{brandName} .... status = #{status} where id = #{id}
    </update>

接口代码

public void updateById(Brand brand);

测试代码

Brand brand = new Brand();//不用带参构造,不灵活不安全
brand.setBrandName("tengxun");
        .
        .    
        .
        .
brand.setStatus(1);
brand.setId(2);
mapper.updateById(brand);

需求:增加一条数据(主键)

映射文件

<!-- 如果要主键返回,增加两个属性 keyProperty = 'id' useGeneratedKeys = 'true' >
<insert id = "addBrand"  keyProperty = "id" useGeneratedKeys = "true">
    insert into tb_brand (brand_name,...,status)
        values (#{brandName},...)
</insert>

接口代码

public int addBrand(Brand brand);

测试代码

Brand brand = new Brand();//不用带参构造,不灵活不安全
//没有也不用设置id的值
brand.setBrandName("tengxun");
        .
        .    
        .
        .
brand.setStatus(1);
brand.setId(2);
.
.
.
int i = mapper.addBrand(brand);
sout()
//释放

结果映射以及多个参数传值以及特殊字符处理

需求:查询id>2 status = 1的数据

映射文件

 <select id="selectByCondition" resultType="com.itheima.pojo.Brand">
        select * from tb_brand where id > #{startid} and id <![CDATA[
        <        ]]> #{endid} and status = #{status}
 </select>

接口代码

// 散装参数传值,使用@Param注解进行声明#{变量}的名字
// 对象参数,直接用对象传值 
// Map参数,保证key和#{变量}一致
//    根据指定条件查询


    public List<Brand> selectByCondition(@Param("startid") Integer startid, @Param("endid") Integer endid,@Param("status") Integer status);

测试代码

    List<Brand> brands = mapper.selectByCondition(2, 6, 1);
    System.out.println(brands);

动态SQL

<where>标签自动更正语句,解决and问题

<if test = "条件判断">

<set>标签解决多一个,问题

<update>标签用来解决where为空时的问题

<choose>和<when>相当于switch,otherwise保底

<foreach>批量删除:拼接(1,2,3,4)

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
————————————————
版权声明:本文为CSDN博主「qq_36759871」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36759871/article/details/68488776

映射文件

<!---批量删除 使用foreach标签 拼接(1,2,3,4)
        批量删除 collection
   --->

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值