- 2022/7/19
- 2022/7/20
- 2022/7/21
- 首先是参数获取
- MyBatis中的各种查询功能
- 1、查询一个实体类对象
- 2、查询一个List集合
- 3、查询单个数据
- 4、将查询的一条数据放到Map集合中
- 5、将查询到的多条数据放到Map集合中
- 方式一:把Map集合放在一个List集合中
- 方式二:将查询出来的集合放到一个大的Map集合中 使用@MapKey注解
- 特殊SQL的执行中的模糊查询:有三种解决方法
- 2022/7/22
- 202/7/31
- 动态SQL:
- 2022/8/1
- 2022/8/2
在Mybatis中,主要是通过一些配置文件来进行sql语句的执行
1、我们需要先获取MyBatis中的核心配置文件,用流的方式。
2、创建SqlSessionFactoryBuilder对象
3、通过Builder对象来创建工厂类SqlSessionFactory对象
4、通过工厂类对象创建SqlSession对象
5、使用SqlSession对象进行面向接口编程,最后就可以执行sql语句了
tips:但是在SqlSession sqlSession = sqlSessionFactory.openSession(true);中 必须添加参数true才可以自动提交。
6、会话结束后需要我们关闭会话。
2022/7/20今天早上的SSM学习,看了大概11个视频,主要了解了核心配置文件中的mybatis-config.xml文件中的标签意思,同时在连接数据库的时候,我们经常会把数据库的相关信息保存到一个properties文件中,进行维护,在核心配置文件中只需要使用${key}就可以获取到相应的值了,同时在核心配置文件中,我们在声明类别名和映射文件的时候可以使用package标签来引入,但是在创建包的时候是以/为分隔的而不是用.
之后又在MyBatis中添加了CURD四种基本的操作方法,其中查询,做了只查询一个和查询List集合,在UserMapper.xml文件中,我们需要在查询标签里配置resultType或者resultMap,用于设置实体类和数据库表的映射关系。我们将昨天做的添加获取SqlSession的一些代码进行了封装,使其成为了一种工具类的方法。
最后了解了在MyBatis中获取参数值的两种方法#{}和${},分为5种情况
#{}的本质就是占位符赋值
${}的本质就是字符串拼接
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
第一种情况:单个字面量类型的参数
此时可以使用
${}和#{}以任意的名称获取参数的值
注意
${}需要手动加单引号
之后几种情况明天再学
2022/7/21今天也是看了11个视频,学习了剩下的4种不同情况的参数获取和MyBatis中的各种查询功能还有特殊SQL的模糊查询功能。
首先是参数获取 2、多个字面量类型的参数,此时MyBatis会自动将这些参数放在一个map集合中,
以arg0,arg1…为键,以参数为值;
以param1,param2…为键,以参数为值;
因此只需要通过
${}和#{}访问map集合的键就可以获取相对应的值,
注意
${}需要手动加单引号
3、参数类型为map集合,若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
4、参数类型为实体类类型的参数,若mapper接口中的方法参数为实体类对象时,此时可以使用
${}和#{},通过访问实体类对象中的属性名获取属性值,
注意
${}需要手动加单引号
5、使用@Param注解标识参数,此时,会将这些参数放在map集合中,
以@Param注解的value属性值为键,以参数为值;
以param1,param2…为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应的值,
注意
${}需要手动加单引号
User getUserById(@Param("id") int id);
select * from t_user where id = #{id}
2、查询一个List集合
ListgetAllUser();
当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常
TooManyResultsException;
但是若查询的数据只有一条,可以使用实体类或集合作为返回值
3、查询单个数据4、将查询的一条数据放到Map集合中
Map5、将查询到的多条数据放到Map集合中 方式一:把Map集合放在一个List集合中getUserToMap(@Param("id") int id);
List方式二:将查询出来的集合放到一个大的Map集合中 使用@MapKey注解
@MapKey注解需要设置字段的值来作为键
@MapKey("id")
Map getAllUserToMap();
特殊SQL的执行中的模糊查询:有三种解决方法
使用${} concat() “%”#{}“%” 三种方法解决模糊查询
List2022/7/22testMohu(@Param("mohu") String mohu);
总结一下今天早上的SSM学习成果.
今天学习了特殊SQL中的批量删除,动态设置表名,添加功能获取自增的主键,学习了resultMap处理多对一的三种方法,分别是级联式,association标签和分步查询。
首先来看批量删除
我们可以看到淘宝购物车中的管理界面,可以让我们选中商品的选项,但是其实是根据id来进行删除,我们可以在sql语句中使用in方法然后用${}的方式进行字符串拼接
动态设置表名
select * from ${表名}
获取自增的主键,我们需要在标签中添加 userGeneratedKeys=“true” keyProperty=“id”
useGeneratedKeys:设置使用自增的主键
keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
insert into t_user values(null,#{username},#{password},#{age},#{sex})
最后是resultMap的使用
select id,user_name,password,age,sex from t_user where user_name like concat('%',#{mohu},'%')
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用),实体类中的属性名符合Java的规则(使用驼峰)
此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系
a>可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
b>可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将类型的字段名转换为驼峰
例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为userName
最后是处理多对一的三种方式
1、级联方式
使用多表查询的功能和resultMap设置映射关系
2、使用association处理映射关系
3、分步查询
第一步:查询员工信息
第二步:根据员工所对应的部门id查询部门信息
202/7/31
因为笔者最近家里有点事,就摆烂了9天,绝对不是床太好睡了hhh
今天学习了在myBatis中处理一对多的关系 主要有两种方法.还有学习了几种常用的动态SQL
1、collection标签
ofType:设置集合中的类型 其他与association一致
2、分步查询,与多对一的关系一致
动态SQL:
emp_id, emp_name, emp_age, emp_gender, dept_id
select from t_emp
2022/8/1
今天也是学习SSM的一天,今天主要学习了MyBatis的缓存,主要有一级缓存、二级缓存和第三方缓存,还学习了如何使用逆向工程来快速的创建一个MyBatis框架。
1、MyBatis的缓存
1.1、一级缓存:
一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问
使一级缓存失效的四种情况:
1) 不同的SqlSession对应不同的一级缓存
2) 同一个SqlSession但是查询条件不同
3) 同一个SqlSession两次查询期间执行了任何一次增删改操作
4) 同一个SqlSession两次查询期间手动清空了缓存
1.2、二级缓存
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
二级缓存开启的条件:
a>在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置
b>在映射文件中设置标签
c>二级缓存必须在SqlSession关闭或提交之后有效
d>查询的数据所转换的实体类类型必须实现序列化的接口
使二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
相关配置:用到的时候查看官方文档即可
1.3、缓存查询的顺序
先查询二级缓存,再查询一级缓存
1.4、第三方缓存EHCache
需要添加依赖,具体可以查看相关资料
2、MyBatis的逆向工程
正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。
逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
·Java实体类
·Mapper接口
·Mapper映射文件
具体查看资料进行配置
2.1、QBC查询,即通过逆向工程生成的pojp包中,各种实例中会有带有example,这些example即条件, 我们具体的可以看代码
2022/8/2今天忙着去学校,晚饭吃完后才开始学习MyBatis中的最后一章,分页插件的使用。还学习了Spring 的一些简介。Spring就放到下一篇的文章里吧。
limit index,pageSize
pageSize:每页显示的条数
pageNum:当前页的页码
index:当前页的起始索引,index=(pageNum-1)*pageSize
count:总记录数
totalPage:总页数
totalPage = count / pageSize;
if(count % pageSize != 0){
totalPage += 1;
}
pageSize=4,pageNum=1,index=0 limit 0,4
pageSize=4,pageNum=3,index=8 limit 8,4
pageSize=4,pageNum=6,index=20 limit 8,4
首页 上一页 2 3 4 5 6 下一页 末页
1、添加依赖
com.github.pagehelper pagehelper 5.2.0
2、配置分页插件
核心配置文件中:
3、分页插件的使用
a>在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能
pageNum:当前页的页码
pageSize:每页显示的条数
b>在查询获取list集合之后,使用PageInfo pageInfo = new PageInfo<>(List list, int
navigatePages)获取分页相关数据
list:分页之后的数据
navigatePages:导航分页的页码数
c>分页相关数据
PageInfo{
pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8,
list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30,
pages=8, reasonable=false, pageSizeZero=false},
prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true,
hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8,
navigatepageNums=[4, 5, 6, 7, 8]
}
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]
----------------------终于是结束了MyBatis的学习--------------------------
PS:一些文档资料在尚硅谷的微信公众号上能够找到的噢!



