下面介绍注解和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);
@Testvoid queryUserInfoById() {userInfoMapper.queryUserInfoById(2);}
运行结果:
参数绑定:
where id = #{写值}
- 第二种写法:使用注解绑定参数
@Select("select * from userinfo where id = #{value}")UserInfo queryUserInfoById2(@Param("value") Integer id);
@Testvoid 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);
@Testvoid 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);
@Testvoid deleteUserInfo() {userInfoMapper.deleteUserInfo(10);userInfoMapper.deleteUserInfo(9);}
运行结果:
(2)修改操作
代码:
@Update("update userinfo set phone = #{phone}where id=#{id}")void updateUserInfo(UserInfo userInfo);
@Testvoid 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();
@Testvoid 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();
@Testvoid 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>
成功删除
文章到这里就结束了,至于多表查询,就不再介绍,企业中基本也不会使用。