MyBatis的入门操作--打印日志和增删改查(单表静态)

下面介绍注解和xml实现crud的操作

目录

一、日志打印和参数传递

1.1.使用mybatis打印日志

1.2.参数传递细节

二、crud(注解实现)

2.1.增(insert)

2.2.删(delete) 和 (update)

2.3.查(select)

三、crud(xml实现)

3.1.准备工作

3.2.查询

3.3.增删改


介绍一下准备工作:

数据库信息:

环境和代码框架

一、日志打印和参数传递

1.1.使用mybatis打印日志

(1)准备工作

我们要在使用mybatis的时候打印日志,不需要写什么代码,只需要将配置放上即可。

yml格式:

mybatis:
configuration: # 配置打印 MyBatis⽇志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

properties格式:
 

#指定mybatis输出⽇志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

未使用打印日志的情况:

(2)使用配置打印日志

我们使用yml配置,要注意格式

再次运行后的结果:

多出来的部分就是使用了日志的结果,我们后续可以通过日志的内容,来判断程序是否正确和排查问题等。

1.2.参数传递细节

我们下面使用select * from userInfo来举例,介绍参数名字的映射关系。

(1)单个参数传递

上面的sql语句是查询表的所有数据,是没有参数的,下面我们介绍传递参数的写法。

  • 第一种代码写法:直接写
  @Select("select * from userinfo where id = #{id}")
    UserInfo queryUserInfoById( Integer id);
 @Test
    void queryUserInfoById() {
        userInfoMapper.queryUserInfoById(2);
    }

运行结果:

参数绑定: 

where id = #{写值}

  • 第二种写法:使用注解绑定参数
 @Select("select * from userinfo where id = #{value}")
    UserInfo queryUserInfoById2(@Param("value") Integer id);
@Test
    void queryUserInfoById2() {
        userInfoMapper.queryUserInfoById2(3);
    }

这种写法就是可以绑定到指定参数上,id的值绑定到value上

  • 注意点

一般来说,只有一个参数,参数名字可以随意取,都是可以映射的上

(2)多个参数

  • 两个参数错误版

当多个参数而且名字不一样时,mybatis是没有办法帮我们做到参数映射的

  • 两个参数正确版

运行结果:

无论参数有多少个,只要参数名字对应上了,那就是没有问题

  • 两个参数注解版

运行结果:

使用注解后,参数名字就可以不一样了。

(3)总结

二、crud(注解实现)

这里我们介绍增删改查

2.1.增(insert)

(1)普通插入数据版

  • 正确版

因为插入的参数很多,所以方法的参数可以写成对象的形式,而sql语句正常写参数即可

 @Insert("insert into userinfo (username,password,age,gender,phone)" +
            " values (#{username},#{password},#{age}," +
            "#{gender},#{phone})")
    Integer insertUserInfo(UserInfo userInfo);
  @Test
    void insertUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("ssy");
        userInfo.setPassword("bb");
        userInfo.setAge(22);
        userInfo.setGender(1);
        userInfo.setPhone("1750000000");
        System.out.println(userInfoMapper.insertUserInfo(userInfo));
    }

运行结果:插入成功

我们需要注意的点:

  • 属性错误版 

运行结果:

也就是在对象的属性中找不到ages,也就是没有get方法

  • 字段错误版

(2)注解插入数据版

  • 注解错误版

运行结果:

错误原因:方法中的参数username直接映射到注解中了,当加上注解后,就不会自动映射到每一个参数上。

  • 正确注解写法:拿着注解的参数去给每个参数赋值

运行结果:

(3)获取主键自增id

  • 做法:在方法前面加上:@Options注解

运行结果:

2.2.删(delete) 和 (update)

通过前面的学习,删除和修改操作也差不多

(1)删除操作

代码:

  @Delete("delete from userinfo where id=#{id}")
    Integer deleteUserInfo(Integer id);
@Test
    void deleteUserInfo() {
        userInfoMapper.deleteUserInfo(10);
        userInfoMapper.deleteUserInfo(9);
    }

运行结果:

(2)修改操作

代码:

 @Update("update userinfo set phone = #{phone}where id=#{id}")
    void updateUserInfo(UserInfo userInfo);
  @Test
    void updateUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(8);
        userInfo.setPhone("88888888888");
        userInfoMapper.updateUserInfo(userInfo);
    }

运行结果:

如果id没有设置,就会修改失败,但是不会有报错信息。

2.3.查(select)

前面我们有简单的查询语句,我们重新看一下

运行结果:

我们来解释一下:

首先,数据库返回的是有数据的,但是映射到对象上却没了,原因就是变量名字不一样。比如数据库返回的是:create_time,而对象的变量名是:createTime,因此他们没有办法映射上,所以值为空。

下面我们介绍3-4种名字映射方法,可以解决上面的问题。

(1)起别名

这种方法最简单粗暴,就是直接在数据库返回数据后改变名字。

作用位置:注解上

代码:

@Select("select id,username,password,age,gender,phone,delete_flag as deleteFlag" +
            ",create_time as createTime,update_time as updateTime from UserInfo")
    List<UserInfo> queryUserInfos();
 @Test
    void queryUserInfos() {
        userInfoMapper.queryUserInfos();
    }

我们只需要给那些:表的字段名字和java对象中名字不一样的起别名就好

(至于为什么不把它们两个的名字搞成一样,因为它们都有不同的命名规范)

上述的方法比较暴力,很麻烦,为了给几个单独的字段起别名,还要顺便把所有字段加上。

(2)定义结果映射

作用方式:新起一个注解

 @Results({
           @Result(column = "delete_flag",property = "deleteFlag"),
           @Result(column = "create_time",property = "createTime"),
           @Result(column = "update_time",property = "updateTime"),
   })
    @Select("select * from UserInfo")
    List<UserInfo> queryUserInfos222();
 @Test
    void testQueryUserInfos2() {
        userInfoMapper.queryUserInfos222().forEach(System.out::println);
    }

运行结果:

只需要记住注解内的别买是这样起就可以了。

但是这样,还是需要每个语句都需要加上一长串注解,所以也就还有优化的地方

(3)复用结果映射

这种方法就是:只需要定义一次结果映射,后续就不需要重新定义,只需要复用即可。

为了复用上面的注解,我们就需要给上面的注解加上标志(也就是id),方便后续复用

如何使用:

 @Results(id = "base",value = {
           @Result(column = "delete_flag",property = "deleteFlag"),
           @Result(column = "create_time",property = "createTime"),
           @Result(column = "update_time",property = "updateTime"),
   })
    @Select("select * from UserInfo")
    List<UserInfo> queryUserInfos222();

   @ResultMap("base")
   @Select("select * from userinfo")
   List<UserInfo> queryUserInfos333();

运行结果:

所以后续,只需要写一次注解就可以了,后续只需要引用。

(4)配置驼峰

上面的方式还是会有点麻烦,所以我们再学习一个终极方法,就是使用配置文件让他们的名字对应上。

yml配置文件:

mybatis:
    configuration:
        map-underscore-to-camel-case: true #配置驼峰⾃动转换

放到文件中:

我们接着运行没有做任何处理的代码:

运行结果:成功有了数据

所以说,最后一种配置文件是推荐使用的,非常的方便。

三、crud(xml实现)

3.1.准备工作

我们开始先介绍准备工作:

(1)第一步:配置响应的依赖(创建项目的时候顺带配置了)

(2)第二步:配置数据库连接信息(一般一开始就设置好了)

(3)第三步:写一个mapper接口,里面就存放crud的接口

(4)第四步:使用yml配置xml路径(xml用来实现crud代码)

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
    mapper-locations: classpath:mapper/**Mapper.xml

(5)第五步:建立xml文件夹

(6)第六步:套模版

模版代码:复制即可

<?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.exmple.mybatis.mapper.UserInfoXmlMapper">
 

</mapper>

其中:namepace后面跟的是一个全限定类名,也就是需要使用的那个mapper接口

最后:

准备工作做完,接下来就是写sql的实现了(和注解的方式差不多了)

3.2.查询

(1)查询操作

代码:

我们先完成左边方法,就可以自动生成右边的代码(生成<select>标签);对于里面的sql语句则需要自己写,语法就和写mysql的时候一样了。

我们通过测试代码查询一下运行结果:

结果是没有什么问题的。后面的一些值有变量,原因是前面已经配置好了驼峰转换。

如果关了配置是这样的:

下面介绍使用起别名和使用注解的方法进行变量映射

(2)起别名

这里的起别名和前面使用注解进行crud是一样的

运行结果:

(3)使用注解

 <resultMap id="XMLbase" type="demo.model.UserInfo">
        <id column="id" property="id"></id>
        <result column="delete_flag" property="deleteFlag"></result>
        <result column="create_time" property="createTime"></result>
        <result column="update_time" property="updateTime"></result>
    </resultMap>
    <select id="queryUserInfo2" resultMap="XMLbase">
        select * from userinfo
    </select>

运行结果:

3.3.增删改

(1)增

void insertUserInfo11(UserInfo userInfo);
<insert id="insertUserInfo11">
        insert into userinfo (username,password,age,gender,phone)
        values (#{username},#{password},#{age},#{gender},#{phone})
    </insert>

运行后:

(2)改

void updateUserInfo(UserInfo userInfo);
    <update id="updateUserInfo">
        update userinfo set password = #{password} where id = #{id}
    </update>

成功修改

(3)删

void deleteUserInfo(Integer id);
<delete id="deleteUserInfo">
        delete from userinfo where id = #{id}
</delete>

成功删除


文章到这里就结束了,至于多表查询,就不再介绍,企业中基本也不会使用。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小娥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值