1.标签(node)
Mybatis里面的各种标签,具体知道,了解几个就行了,特别是常见的,这里最好要培养可以熟读文档的水平
tips:
这里标签也是有顺序的...这里需要注意下一啊,mybatis的config.xml的配置文件里面的一些配置信息,有不少也是有顺序的,顺序不一样,运行的结果也不一样,阅读英文文档...有好有坏吧...通过check的方式查找,比通篇读的好,拿来主义
2.具体的crud
<select>标签下面有一个resultType的属性,这里写这个查询sql的返回值类型,可以是基本类型,POJO,也可以是集合,具体的设置肯定是有相关规范的,之前老老实实看了一些关于select的sql只是,但是update,insert,delete都没学...之后mysql的那个视频,肯定是要全部都看完的,之后还有不少知识,虽然可能冷门了点
3.sqlSession这里是拿来处理数据库查询的核心类
这里注意关于sqlSession.commit()是可以设置自动commit的,也可以手动commit
4.bean的构造器
这里注意,如果需要给一个bean写有参构造器,必须也要同时写一个无参构造器,否则mybatis跑不起来
5.增删改
在增删改的时候,mybatis是可以不像select那样还搞自定义的bean,写什么resultType,这里增删改直接就是可以写:
void | Integer | Long | Boolean
6.主键
得增加数据的主键,这里在insert标签里面有一个属性:useGeneratedKeys,这里可以拿到插入的record的主键
然后后面有一个keyProperty=""这里就是把这个主键值封装给哪个bean的哪个属性
7.mybatis参数处理
单个参数:
#{参数名}:取出参数,这时候大括号里面的参数名,随便写什么都不要紧因为就只有一个参数
多个参数:
mybatis在多参数情况下,有特殊规则,多个参数会封装成功一个map,所以这里的#{}就是从map里面取值
所以这里要写#{param1}或者写索引0,1
(推荐)命名参数:
这里的命名参数就是明确指定封装参数值map的key,这里就是在interface下面的方法的,参数前面加上注解:
@param("")这里直接就是注解名,这里就是明确指出
这里的参数,也可以直接传POJO或者map
POJO:
-->直接传POJO,然后取的时候直接用POJO的属性值拿:#{属性名},比如#{param2.属性名}
map
-->在使用map的时候,也是直接#{这里写map.put进去的key值}
如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(数据传输对象)
Tips:
这里要注意,如果是要传一个List<Integer>-->collection集合类型(list,set)或者是数组,mybatis也会把传入的集合或者数组封装在map中,Collection可以用collection小写key,而List也是可以用小写list作为key,数组的话,直接就是分装成一个array的key
所以,这里的要写#{list[0]}
关于具体的crud标签的代码的实现细节...这种东西肯定只有在实际写的时候才能积累
8.参数值的获取
之前一直用的#{}获取map | POJO 中的值
除了这个,还支持${}
但是有区别
-->$是字符拼串,而#直接就是一个占位符...在使用上没啥区别...
#{}是以预编译的形式,将参数设置到sql中(防止sql注入)
${}取出的值直接拼在sql语句中,会有安全问题,这里就是拼字符串
大部分情况下都应该是用#{},这里适合${}的场景,就是拼接......在需要比如分年份表,比如2016,2017的时候, 年份_表名
这个时候,就需要${},这样就可以把一个值传到sql实际的语句中...如果用#{}就没用了...
这里注意了...原生的jdbc....都是不支持占位符的.....我去...等于说之前传值那个,并不具备占位符的这个功能...
比如分表啊,排序啊啥的...
自己表述:一个是占位符,一个是相当于是传的参数
9.#{}的丰富用法
这里可以指定这个参数的很多数据类型==>javaType;jdbcType(有些数据库,比如oracle不支持mybatis的默认处理,这个时候就需要设置这个参数);mode(存储过程)等等
10.SELECT
如果需要返回的不是一个bean,而是一个list<>,那么resultType还是要写集合元素的类型,而如果查到的结果是一个list,那么mybatis还是会返回这个类型的元素的集合..这里上面说过,具体还是要写代码的时候再看...
需求:返回一个map对象
resultType=""这个里面不能写list,但是可以写map
这里返回了一个单条map
我靠:这里在interface下面的方法上,可以加注解@Mapkey("id"),这里告诉mybatis封装这个map的时候,用哪个属性作为主键
这个时候自动的就返回map了,不加的话,那返回的就是集合或者单个bean.
SELECT的属性很多,这里再讲一个
resultMap:
之前在解决,在数据库查到的字段跟在bean里面写的字段不一致时的解决方案:①在sql语句那里起别名,②设置那个下划线驼峰自动转的那个设置
这里的reultMap也可以解决上面的问题,叫做自定义结果集
之前有一个属性名:autoMappingBehavior:默认是PARTIAL,这里的意思是自动映射
我们可以自定义resultMap,实现高级结果集映射
11.resultMap
这里就是高级自动映射返回结果了
SELECT标签下面可以写自定义的结果集规则,这里写了一个resultMap="",但是在这里resultType和resultMap只能二选一
这里直接在mybatis的mapper的配置文件里面就可以写resultMap的标签了.
这里有<id column="id" property="id" / >,colunm对应的就是数据库的列,然后后面的property就是resultMap的type里面声明的全类名bean,这里的主键,就是用 的<id >,普通列是用<result >
这里涉及到外键关联...ALTER ....日...Mysql没看完...这里的外键关联,我猜,就是一张表单非主键,作为一个外键,这个外键是另一张表的主键
这里的联合查询,用级联属性,在map标签里面点出来,进行封装map
12.association
紧接着上面的,还有一个...association
这个标签的property=""就是指哪个属性是联合的对象,这里必须要要写javaType,表明属性对象的类型
<association>标签里面写的id,表示的就是关联表的主键...
总结:这里称之为-->嵌套结果集...也就是说,返回的结果里面还有别的类,那么association里面就是联表查询的另一个表
13.association分步查询
果然,这里到时候肯定要写很多张mapping的配置文件
之前的用association是用sql的联合查询,用级联属性的方式直接查出另一个表的数据,在这里,就是一步一步的分步来查询
这里的分布查询...还要在association里面加一个属性...select,这个select就是查另一个表的时候要写的sql语句
然后这里就是自然而然的操作...
14.resultMap-->延迟加载
当进行连表查询的时候,我们可以在需要的时候,再对分表进行查询,这个时候可以节约数据库资源
在config的xml文件里面写setting的一个lazyLoadingEnabled设置为true
15.这个雷丰阳老师主要就是按照官方文档来讲的,所以如果想全部精通使用框架,肯定是要看文档的...但是在这里,绝对不适合我来看全部文档,而是只学习主流的一些基本功能,拓展功能在实际应用各种再check文档,这样对于学习整个完整流程框架来说才是应该的
这里有:
Configuration XML
Mapper XML files
Dynamic SQL
Java API
Statement Builders
Logging
tips:这里有一个思想:
只要是显示的指定每个我们需要更改的配置的值,即使他是默认的.也要写出来,目的-->防止版本更替可能带来的问题(不愧是老程序员)
16.=插一下数据库的5大约束
#五大约束
1、主键约束(Primay Key Coustraint) 唯一性,非空性
2、唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
3、检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)
4、默认约束 (Default Counstraint)该数据的默认值
5、外键约束 (Foreign Key Counstraint)需要建立两表间的关系并引用主表的列
17.resultMap
之前讲的关于在resultMap下面有
①id:主键
②result:一般字段
③collection:这里是定义的关联的bean里面的集合属性-->自然,在collection标签里面设置property,然后里面有一个叫做ofType :这里就是集合里面的类的类型了,然后再在collection标签中定义集合里面的单个对象...跟之前一样.
collection里面自然,也是可以延迟加载的
18.这里然后又是用collection来搞分步查询,这里还是要
...注意一点,在一个mapping配置文件中,是可以调别的mapping配置文件中的方法的的,这里前面要写哪个mapping的xml的命名空间
.association是定义单个查询,collection是定义集合查询的
在这里,如果要多列值封装map传过去,这里 column的写法就是:
column="{key1=column1,key2=column2}",这里还有一个属性fetchType="lazy | eager"这里表示延迟加载 | 立即加载
19.mybatis的鉴别器-->discriminator
通过判断某列的值,从而来改变封装行为
<discriminator javaType="" colum="" >指定需要鉴定的列
用字标签<case value="" resultType="">来进行分类封装
小结一下:
必须要在实际项目中,多使用一下具体的主流的一些操作,然后把这些操作熟练的掌握,这样再做一些高级操作的时候再check文档等,这样是比较科学的,这里讲了一些稍微进阶一点,高阶一点的配置方式,确实讲的时候你听懂了,但是你用的时候还是不会用,会忘记.