文章目录
- 一. 什么是MyBatis
- 二. MyBatis操作数据库步骤
- 创建工程
- 创建数据库
- 创建对应实体类
- 配置数据库连接字符串
- 写持久层代码
- 单元测试
- 三. MyBatis基础操作
- 打印日志
- 参数传递
- 增
- 删
- 改
- 查
- 四. MyBatis XML配置文件
- 配置链接字符串和MyBatis
- 写持久层代码
- 方法定义Interface
- 方法实现xml
- 测试
- 增删改查
- 增:
- 删
- 改
- 查
- 五. 开发规范(mysql)
一. 什么是MyBatis
简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具
二. MyBatis操作数据库步骤
创建工程
创建springboot⼯程,并导⼊ mybatis的起步依赖、mysql的驱动包
Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加MySQL驱动
创建数据库
CREATE TABLE `userinfo` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(127) NOT NULL,`password` varchar(127) NOT NULL,`age` tinyint(4) NOT NULL,`gender` tinyint(4) DEFAULT '0' COMMENT '1-男 2-女 0-默认',`phone` varchar(15) DEFAULT NULL,`delete_flag` tinyint(4) DEFAULT '0' COMMENT '0-正常, 1-删除',`create_time` datetime DEFAULT CURRENT_TIMESTAMP,`update_time` datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
创建对应实体类
配置数据库连接字符串
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
修改数据库名称, 密码即可
写持久层代码
Mybatis的持久层接⼝规范⼀般都叫 XxxMapper
@Mapper注解:表⽰是MyBatis中的Mapper接⼝
程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理
@Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容
单元测试
选择想要测试的方法, 就会在Test中对应的文件帮我们创建测试方法
- 需要我们添加@SpringBootTest注解, 该测试类在运行时, 就会自动加载Spring的运行环境
- 通过@Autowired这个注解, 注入我们要测试的类, 就可以开始测试了
运行成功
三. MyBatis基础操作
打印日志
在Mybatis当中我们可以借助⽇志, 查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
参数传递
在方法中添加参数, 将方法中的参数, 传给SQL, 在SQL语句中使用**#{ }**来接收
测试:
- 如果方法形参只有一个参数, 那么#{} 中的属性名可以随便写
- 如果是多个参数, 那么就要求参数名和属性名一致
- 可以通过@Param()设置别名, 来映射到对应的属性名
此时, 只会按照id2来映射, id会失效
增
如果使用@Param
想要获取到自增字段:
使用@Options(useGeneratedKeys = true, keyProperty = “id”)
将JDBC的useGeneratedKeys方法拿到的数据库中生成的主键, 赋给keyProperty指定的属性中
测试:
删
改
查
观察日志发现, 数据库将后面字段的数据传回来了, 但是在打印userInfo对象时, 却没有接收到
原因分析:
当⾃动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略
⼤⼩写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性
但是由于规范性, 命名的时候, 字段名和属性名 不可能完全一致
** 办法一: 起别名**
成功接收
** 办法二: 结果映射**
使用@Results({@Result(column = ..., property = ...), @Result(column = ..., property = ...)...})
注解, 来映射字段和属性
映射成功
但是每当我们写个sql都需要加上这个映射关系
复用映射关系:
如果其他SQL, 也希望可以复⽤这个映射关系, 可以给这个Results定义⼀个id
其他的sql使用@ResultMap
注解来复用这个映射关系即可
办法三: 开启驼峰命名
加上配置:
mybatis:configuration: map-underscore-to-camel-case: true #配置驼峰⾃动转换
代码中无需做任何处理
映射成功
四. MyBatis XML配置文件
MyBatis开发有两种方式:
- 注解
- XML
使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中.
配置链接字符串和MyBatis
添加配置:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis:# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件mapper-locations: classpath:mapper/**.xml
在resources路径下, 创建mapper文件, 在mapper文件下创建**.xml文件, 以xml结尾的文件
和mapper-locations: classpath:后的路径对应即可
写持久层代码
方法定义Interface
方法实现xml
MyBatis的固定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">
<!--需要修改到上述mapper接口所对应的路径-->
<mapper namespace="com.bite.mybatis.mapper.UserInfoXmlMapper"></mapper>
查询:
<?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.bite.demo.mapper.UserInfoXMLMapper"><select id="queryAllUser" resultType="com.bite.demo.model.UserInfo">select * from userinfo</select>
</mapper>
- < mapper> 标签: 需要指定< namespace>属性, 表示命名空间, 值为mapper接口的全限定名, 即包名.类名
- < select>查询标签, 用来执行数据库的查询操作
- id : 是和接口中定义的方法名
- resultType : 是返回的数据类型
测试
增删改查
增:
<insert id="insertUser">insert into userinfo (username, `password`, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})</insert>
返回自增id:
接口定义不变, 设置useGeneratedKeys 和keyProperty属性
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, `password`, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})</insert>
删
<delete id="deleteUser">delete from userinfo where id = #{id}</delete>
改
<update id="updateUser">update userinfo set username = #{username} where id = #{id}</update>
查
和注解一样, 映射也有三种解决办法:
1和3和注解一样
** xml结果映射:**
<resultMap id="BaseMap" type="com.bite.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>
五. 开发规范(mysql)
阿里巴巴java开发手册的规范: