6/11 框架学习之MyBatis/Mapper动态代理/模糊查询/多参数查询/动态参数/各种查询

本文详细介绍了MyBatis框架的基础用法,包括创建数据库、实体类、DAO接口及其实现、配置文件等内容。重点讲解了Mapper的动态代理,如何进行模糊查询、多参数查询以及动态参数设置。此外,还探讨了where 1=1的效率问题及其解决方案,以及如何实现类似c:foreach的循环功能。

框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。

可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。

一个框架就是解决特定问题

MyBatis:数据持久层框架(Hibernate,Spring Data),替换JDBC和DbUtils
SpringMVC:MVC框架(Struts2),替换Servlet
分布式框架:Spring Cloud ,Dubbo
权限管理框架: Shiro ,Spring Security

对程序员来说,一个框架就是:jar 源码 帮助文档 实例代码
使用一个框架的流程:获取jar包 导入jar包 查看帮助文档 实例代码。

2.MyBatis:

数据持久层框架(Hibernate,Spring Data),替换JDBC和DbUtils
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190610151120211.)

在这里插入图片描述

MyBatis01-基础用法。

3.入门程序

jar包(桌面上有)
mybatis核心jar包和依赖jar包,mysql数据库驱动包(底层还是使用原始JDBC)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个connector来自于数据库连接包,在其他项目中拷贝的。

创建数据库

id:自动增长

实体类

在这里插入图片描述

DAO接口

在这里插入图片描述

配置文件

映射文件
约束文件
在这里插入图片描述
这张图上的内容,在Mybatis里面的说明文件里面有,规定了约束文件的格式。
在这里插入图片描述

主配置文件

在这里插入图片描述
同样的,这张图也来自说明文件,直接复制头即可
在这里插入图片描述

DAO实现类

在这里插入图片描述

测试类

在这里插入图片描述
注意,这里的测试文件不需要再此导入junit包,@te直接可以获取mybatis提供的测试包。

添加日志配置文件

在这里插入图片描述
MyBatis中可以通过指定命名空间的名字:只输出当前命名空间的代码在执行过程中相关的日志输出信息

若配置文件没有提示的解决方法

在这里插入图片描述
在这里插入图片描述

namespace的作用:

关联配置日志输出
不同的映射文件namespace必须唯一
不同namespace中有同名的方法,必须使用全限定名

类权限定名可以使用别名配置

#和$的区别
JDBC Statement和PreparedStatement的区别


MyBatis02-使用工具类来优化实现类。

创建工具类 核心是SqlSession,注意都是静态Static 方法。
在这里插入图片描述以 后所有的SqlSession 都由工厂创建 调用这个方法即可。

有了这个工具类,再写实现类的时候就可以直接调用了
在这里插入图片描述

插入一个id自增长的学生,如何查询他的id是多少?

@@identity:MySql 定义的一个系统变量。获取上一次添加语句的自动增长的主键值。
在这里插入图片描述
这样的话主键就出来了。

以后在执行增删改查的时候,
添加一个接口,多一个实现类,然后配置文件里面再多配置一句sql语句

接口:
在这里插入图片描述
实现类:
在这里插入图片描述
配置文件:
在这里插入图片描述

在配置文件里,直接 ‘<’ 就可以选择标签,插入就用insert 删除就delete。
实现类的。update .insert .delete根据需要改变
在这里插入图片描述

查询

查询用这个
在这里插入图片描述
如果是查询,返回值的类型一定要写。增删改写不写看自己需求。使用别名配置

在这里插入图片描述

查询所有

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

查询也可以使用Map
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询的时候,当遇到数据库表的列名 和实体类的属性不一致 怎么办?

使用别名。别名和属性一致即可。
如下图,实体类student 的属性为id name age等,但是表的列名为sid sname之类。
直接查查不出来。所以写别名
在这里插入图片描述

另一种方法:使用映射转换器。指定属性和列的对应关系的映射转换器。
在这里插入图片描述

MyBatis03-使用Mapper的动态代理:

不再需要接口的实现类了。
1.修改主配置文件。(之前是在dao的impl里面,现在直接在dao里面了)
在这里插入图片描述

2.修改mapper的头文件

在这里插入图片描述

测试类里面:
在这里插入图片描述
插入测试,需要提交(之前写在DAO里)
在这里插入图片描述

注意:动态代理不能查询返回值为Map的方法。
在这里插入图片描述
因为底层只会调用selectOne 或者selectlist。所以如果是map的话返回值不对。
(底层会自动判断,若不是list就用selectOne了)


按照姓名进行模糊查询

在这里插入图片描述
若按照我们的写法
在这里插入图片描述

发现不能查询,因为这个MyBatis框架不认这个写法。
在这里插入图片描述

做模糊查询应该使用下面的方法:

在这里插入图片描述
前后两个百分号
在这里插入图片描述
这样就成功了。

另外一种方法:使用 sql 的拼接语句concat:

在这里插入图片描述


多参数查询
多参数查询之参数为map

动态代理虽然不支持返回值是map,但是支持参数是map
在这里插入图片描述

若查询的参数是map,
图为mapper配置文件的内容
在这里插入图片描述
测试类的写法:
在这里插入图片描述


传入值为map的第二种写法:

在这里插入图片描述
测试类:
在这里插入图片描述

传入值为int 和String的查询

在这里插入图片描述
在这里插入图片描述
查询:
在这里插入图片描述
显然行不通
在这里插入图片描述

应该改成 0 和 1(位置占位符)
在这里插入图片描述
成功:
在这里插入图片描述

传入值为一个string 和一个对象在这里插入图片描述

mapper:
在这里插入图片描述
在这里插入图片描述

多参数的时候,若用0 1 2 不方便—添加注解

dao:在这里插入图片描述

mapper:
在这里插入图片描述
在这里插入图片描述

同样的,也可以给一个对象加注解。、

在这里插入图片描述
在这里插入图片描述

那么。什么情况下会用到上面这种?
比如 分页。 等传入多个参数的情况。

多条件查询之动态参数

在这里插入图片描述

如上图,之前用到的多条件查询,查询的参数也不一样,在框架里面如何使用?
在这里插入图片描述

在这里插入图片描述

查询name为%""%,age=11的
在这里插入图片描述
查询name为%""% 即查询所有在这里插入图片描述

where 1=1的效率问题:当查询条件没有的时候,还是会执行where 1=1 影响效率

在这里插入图片描述
解决方法:使用框架的where标签
在这里插入图片描述
若没有条件,就什么条件也没有,没有where 1=1了。
在这里插入图片描述
若有条件,会自动帮你补
在这里插入图片描述

上面的if也可以使用 choose when表现实现。
choose:when: 多选一:选中一个就结束了。不再执行其他的判断
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

类似c:foreach的循环功能的实现
传入值为一个数组

类似于下面的sql语句:如何实现?
在这里插入图片描述

Dao:
在这里插入图片描述
mapper:
在这里插入图片描述
在这里插入图片描述

传入值为一个集合

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

传入值为一个对象 ,不再是integer

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

sql重用:在前面sql查询的基础上 重用前一句sql查询的内容。

在这里插入图片描述

在这里插入图片描述

统计一张表的总条数

在这里插入图片描述

select count(*) from student
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值