先简单讲一下mybatis。
mybatis是一个orm框架、持久层框架、作用于dao层,负责数据库的访问操作。
几乎消除了jdbc的赋值代码、动态获取结果集等等。
再来是应用的需求配置:
1)核心配置文件:mybatis.xml
2)读取加载mybatis.xml并转换成输入流InputStream
3)创建sqlSessionfactorybuilder并读取mybatis.xml文件输入流
4)获取SqlSessionFactory实例
5)获取SQLSessionFactory工厂类获取SqlSession(正常访问数据库,完成crud即增删改查)
mybatis与hibernate区别或异同?
都是orm框架,但是有不同
orm框架:object Relational Mapping。对象与关系型数据库之间的映射管理框架
mybatis:半自动、轻量级、支持sql、扩展性和迁移性比较差。
hibernate:全自动、重量级、支持hql和sql、无缝移植。
ssh2/自定义MVC与ssm的区别
ssh2/自定义MVC ssm
action controller
biz service
dao mapper
IXxxDAO.java(接口) XxxMapper.java(接口)
XxxDAOImpl.java(实现类) XxxMapper.xml
entity model
Xxx.java Xxx.java
使用mybatis-generator插件自动生成代码
1)在pom.xml中配置mybatis-generator插件,并指定mysql的版本(不能使用高版本8+)
2)导入generateConfig,xml至resources目录,并做项目的配置
1.配置外部的数据库连接配置文件jdbc.properties
2.设置本地mysql的jar包位置
3.设置实体类生成位置
4.设置Mapper层接口位置
5.设置Mapper层的sql映射文件
6.生成对应的表的实体类<table>
3)配置maven的启动插件,设置启动的命令
4)启动并生成代码(注意,不要重复生成)
注意:
xml的根节点有且只有一个mapper!
mybayis动态sql:
trim : java中表示去除前后空格,mybatis中是动态拼接
prefix:前缀
suffix:后缀
suffixOverride:去除前缀指定的字符
separator:表示间隔,可以改值如:‘’,‘’
注意!!!String类型传递参数不能直接传参,应该增加一个注解如图:
注意!!!!加了注解后,此时btype才是参数名,uname就只是变量名了
如图:
模糊查询 1)#():相当于占位符,参数传递时需要手动拼接%% ,如:"zs“->#{}->'zs' 2)$()使用$传递参数时,只会传递参数本身, 如:"zs" -> ${} ->zs 关键:#{...}与${...}区别? 参数类型为字符串,#会在前后加单引号['],$则直接插入值
使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
比如:
1.3 foreach
1.4 其他
choose/set/where (作业)
2.模糊查询(3种方式)
2.1 参数中直接加入%%
2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
关键:#{...}与${...}区别?
参数类型为字符串,#会在前后加单引号['],$则直接插入值
注:
1) mybatis中使用OGNL表达式传递参数
2) 优先使用#{...}
3) ${...}方式存在SQL注入风险
2.3 SQL字符串拼接CONCAT
3.查询返回结果集
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
3.1 使用resultMap返回自定义类型集合
3.2 使用resultType返回List<T>
3.3 使用resultType返回单个对象
3.4 使用resultType返回List<Map>,适用于多表查询返回结果集
3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
4.分页查询
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
4.1 导入分页插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
4.2 将pagehelper插件配置到mybatis中
<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
4.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
//设置分页处理
if (null != pageBean && pageBean.isPaginate()) {
PageHelper.startPage(pageBean.getCurPage(), pageBean.getPageRecord());
}
4.4 获取分页信息(二种方式)
4.4.1 使用插件后,查询实际返回的是Page<E>,而非List<E>,Page继承了ArrayList,同时还包含分页相关的信息
Page<Book> page = (Page<Book>)list;
System.out.println("页码:" + page.getPageNum());
System.out.println("页大小:" + page.getPageSize());
System.out.println("总记录:" + page.getTotal());
4.4.2 使用PageInfo
PageInfo pageInfo = new PageInfo(list);
System.out.println("页码:" + pageInfo.getPageNum());
System.out.println("页大小:" + pageInfo.getPageSize());
System.out.println("总记录:" + pageInfo.getTotal());
5.特殊字符处理
>(>)
<(<)
&(&)
空格( )
作业:
1)choose、set、where标签的使用(写例子)
2)mybatis实现批量insert/update/delete