一、mybatis是什么?
1.mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
2.mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
二、mybatis快速入门
首先创建项目,导入依赖
创建完之后可以我们先写一个和数据库表对应的实体类,这里创建一个Phone类
这里的@Data注解省去了get、set方法的单独生成
接下来在resources文件夹下创建并编写映射文件mapper/PhoneMapper.xml,以下为简单的增删查改示例
在resources目录下继续新建Mybaits的核心配置文件并命名为”SqlMapConfig .xml”
这里引入了外部的属性文件 jdbc.properties。这个属性文件通常用来存储数据库连接相关的配置信息,比如数据库的URL、用户名、密码等。通过这样引入属性文件的方式能够在不修改源代码的情况下改变配置信息。
接下来就可以开始测试了
运行结果
以上就是mybatis入门的简要步骤,其实还可以通过Mapper代理的方式优化以下流程
创建一个PhoneMapper接口对应PhoneMapper.xml
修改PhoneMapper.xml中namespace为PhoneMapper接口
现在我们再来写测试类,先写一个初始化方法,用于初始化数据库连接和映射关系。
然后就可以开始写具体的测试方法了
运行结果
由此可见,通过mapper代理的方式简化了编程,提供了灵活性,并且通过初始化方法我们可以不用在每个测试类方法里都读取核心配置文件
三、mybatis增删查改详解
了解了快速入门的过程之后,我们来详细了解增删查改。
在xml中,#{参数名}为xml映射配置接受的参数,名称一定要与传过来的参数名一致,如果传的是整个实体类,那么具体某个参数要与实体类的某个字段名一致
1.增加
需指定参数类型parameterType,默认resultType为int
2.删除
需指定参数类型parameterType,默认resultType为int
3.查找
查找语句中,resultType/resultMap是必不可少的,必须要指定查找的结果
4.修改
需指定参数类型parameterType,默认resultType为int
四、mybatis结果映射与关联查询
当实体类里的属性名和数据库字段不一致,或者sql语句执行结果与其他实体有关联关系时,就需要通过resultMap来进行关系映射
1.一对一
创建一个Brand实体类
修改Phone类如下,手机与品牌是一对一的关系
要实现查询某手机信息及其所属的品牌,相关sql语句与结果映射如下:
id标签是定义数据库主键与实体中简单数据类型属性的映射关系
result标签是定义非主键字段与实体中简单数据类型属性的映射关系
编写测试类查看结果
测试结果,可见品牌信息被包括在手机信息当中
2.一对多
Brand与Phone是一对多的关系,Brand实体类新增属性如下
依旧是先写一个接口
要实现查询某品牌信息及其名下的所有手机,相关sql语句与结果映射如下:
编写测试类查看结果
由查询结果可见,查询品牌信息的同时,把该品牌名下的所有手机也一起获取了
3.嵌套查询
除了关联查询,还可通过嵌套查询来实现,以下为一对一示例
首先编写一条把根据brand_id查询brand信息的sql
修改resultMap如下
编写总的查询语句
添加接口方法
测试类方法及其运行结果
五、动态SQL
动态SQL是MyBatis的一个强大特性,运用动态SQL语句标签方便我们在SQL中实现各种逻辑
常用标签如下:
<if>:条件选择,如果满足条件,则加上<if>标签之间的sql语句,没有就不加上
<choose>:相当于Java中的switch,用于条件选择
<where>:简化SQL中的where
<set>:解决动态更新语句
<trim>:灵活的去除多余的关键字
<foreach>:迭代遍历一个集合
以下为简单SQL配置示例:
(1)where、if标签
<where>标签能够智能的处理where、and、or,不必担心关键字导致的语法错误。
(2)set、if标签
使用set标签与if标签组合,可以智能增减要修改的字段(if的作用),并智能判断逗号是否有必要存在(set的作用)
(3)将(2)的set与if组合替换成trim与if组合
prefix为前缀,suffixOverrides:后缀覆盖,可用于处理update语句中中多余的”,”
此外还有suffix:后缀,prefixOverrides为前缀覆盖,可用于智能的处理”and”,”or”关键字
(4)foreach标签
foreach标签可以在SQL语句中迭代一个集合,常用于构造sql中in条件。
总结:使用动态SQL可以实现很多功能:比如条件查询等,不过前提是了解每个标签的作用,然后根据自己想达成的效果灵活运用每个标签。
六、基于注解方式
除了使用xml的方式,还可以使用注解来实现
以下为查询语句简要示例,其他语句也是一样的方式
如果#{参数} 里的参数名和方法上的参数不一致,可以使用@Param注解
1.一对一
接下来为使用注解方式实现多表查询,依旧是手机与品牌的一对一的关系
注解方式的mapper配置可以不用在配置mapper文件地址,而是只配置包的路径。
方式一:在要实现的接口方法上直接添加@Select注解和@Results
方式二:在Brand接口添加方法
修改PhoneMapper接口中selectAll方法
再次调用测试类中的方法即可获得一样的结果
2.一对多
品牌与手机的一对多关系
在PhoneMapper接口中添加如下方法
修改BrandMapper接口中selectAll方法