MyBatis(二):映射文件

映射文件

        1.增删改

                1.mybatis允许增册改直接定义以下类型返回值:

                        1.Integer

                        2.Long

                        3.Boolean

                2.我们需要手动提交数据

sqlsessionFactory.openSession();===>手动提交
sqlsessionFactory.opensession(true) ;===>自动提交

         2.insert

                1.获取自增主键的值(支持自增主键的数据库下,如mysql):

                        1.在insert中选择useGenreatedKeys为true即可获取自增主键值 → (mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys())

                        2.在insert中选择keyProperty来指定对应的主键属性 → 也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性

                2.获取主键的值(不支持自增主键的数据库下,如oracle → 使用序列来模拟自增):

                        1.每次插入的数据的主键是从序列中拿到的值。如何获取到这个值:

                                1.在insert下的selectKey中有这样的操作:

                                        1.keyProperty:查出的主键值封装给javaBean的哪个属性

                                        2.order="BEFORE":当前sql在插入sql之前运行(AFTER:当前sql在插入sql之后运行)

                                        3.resultType:查出的数据的返回值类型

                        2.然后编写查询主键的sql语句

                        3.说明:

                                1.EFORE运行顺序(推荐使用):

                                        1.先运行selectKey查询id的sql,查出id值封装给javaBean的id属性

                                        2.再运行插入的sql:就可以取出id属性对应的值

                               2.AFTER运行顺序(同时插入很多条数据可能只会得到最后一次插入的主键值,所以不推荐使用):

                                        1.先运行插入的sql(从序列中取出新值作为id)

                                        2.再运行selectKey查询id的sql,查出id值封装给javaBean的id属性

        3.参数处理

                1.单个参数:mybatis不会做特殊处理

                        1.#{参数名}:取出参数值

                2.多个参数:mybatis会做特殊处理

                        1.多个参数会被封装成一个map(key: param1...paramN,或者参数的索引也可以;value:传入的参数值),#{}就是从map中获取指定的key的值

                3.命名参数(相较于 2 推荐):明确指出封装参数时map的key:@Param( "id")

                        1.多个参数会被封装成一个map(key: 使用@Param指定的值;value:传入的参数值),#{指定的值}取出对应的参数值

                4.POJO(多个参数)

                        1.如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo:

                                1.#{属性名}:取出传入的pojo的属性值

                5.Map(多个参数)

                        1.如果多个参数不是业务模型中的数据,没有对应的jopo,为了方便了解,我们也可以传入map

                                1.#{key}:取出map中对应的值

                6.TO(多个参数)

                        1.如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer object)数据传输对象

Page{
        int index;
        int size;
}

                7.补充:结合源码,看mybatis怎么处理参数

             总结:参数多时会封装map,为了不混乱,我们可以使用@Param来指定封装时使用的key,#{key}就可以取出map中的值;

                8.参数值的获取

                        1.#{}:可以获取map中的值或者pojo对象属性的值

                        2.${}:可以获取map中的值或者pojo对象属性的值

                        3.区别:

                                1.#{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement,防止sql注入

                                2.${}:取出的值直接拼装在sq1语句中,会有安全问题

                                3.使用:

                                        1.大多情况下,我们去参数的值都应该去使用#{};

                                        2.原生jdbc不支持占位符的地方我们就可以使用${}进行取值,比如

                                                1.分表:按照年份分表拆分:select * from ${year}_salary where xxx;

                                                2.排序:selec t* from tbl_employee order by ${f_name} ${order};

                9.#{}:更丰富的用法:规定参数的一些规则:javaType、jdbcType、mode(存储过程)、

numericScale、resultMap.typeHandler、 jdbcTypeName、expression

                        1.jdbcType:通常需要在某种特定的条件下被设置:

                                1.在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处

理。比如Oracle(报错) → JdbcType OTHER:无效的类型:因为mybatis对所有的null都映射的是

原生Jdbc的OTHER类型,Oracle不能正确处理; → 由于全局配置中:jdcbTypeForNull = 

OTHER,oracle不支持

                                2.解决方法:

                                        1.#{需要为空也能操作的字段,jdbcType=OTHER};

                                        2.全局配置(jdbcTypeForNull=NULL):<setting name="jdbcTypeForNull" value="NULL" />

        4.select

                1.resultType

                        1.返回List → resultType:如果返回的是一个集合,要写集合中元素的类型

                        2.记录封装map

                                1.返回一条记录的map:key就是列名,值就是对应的值 → resultType:如果返回的是一个map,要写map(mybatis起好的别名)

                                2.返回多条记录的map:Map<Integer,类对象>(键是这条记录的主键,值是记录封装后的javaBean) → @MapKey ("要作主键的属性名"):告诉mybatis封装这个map的时候使用哪个属性作为map的key,resultType:要写map中元素的类型

                2.resultMap:自定义结果集映射规则(和resultType只能用一个)

                        1.resultMap的属性

                                1.type:自定义规则的Java类型

                                2.id:唯一标识,方便引用

                        2.resultMap中的属性:

                                1.id:指定主键列的封装规则(定义主键会底层有优化)

                                        1.column(id的属性):指定哪一列

                                        2.property(id的属性):指定对应的JavaBean属性

                                2.result:定义普通列的封装规则

                                        1.column(result的属性):指定哪一列

                                        2.property(result的属性):指定对应的JavaBean属性

                                        3.其他不指定的列会自动封装(列名和属性名对应的情况下),建议只要写resultMap就把全部的映射规则都写上

                        3.resultMap关联查询

                                1.联合查询:级联属性封装结果集

                                2.association:可以指定联合的JavaBean对象

                                        1.定义关联的单个对象的封装规则

                                                1.association的属性

                                                        1.property:指定哪个属性是联合的对象

                                                        2.javaType:指定这个属性对象的类型(不可省略)

                                        2.分步查询

                                                1.association(property):定义关联对象的封装规则

                                                2.select:表明当前属性是调用select指定的方法查出的结果

                                                3.column:指定将哪一列的值传给这个方法

                                                4.流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性

                                        3.延迟加载(按需加载 / 懒加载):分步查询的基础上加两个配置(尽量显示的指定每个我们需要更改的配置的值,即使他是默认的,防止版本更新带来的问题)

                                                1.settings中:lazyLoadingEnabled 开启(默认是false)

                                                2.settings中:aggressiveLazyLoading 关闭(默认true)

                                3.collection:定义集合类型的属性的封装规则

                                        1.定义关联集合封装规则

                                                1.ofType:指定集合里面元素的类型

                                                2.使用collection嵌套结果集的方式,定义关联的集合类型元素的封装规则

                                        2.分步查询&延迟加载(与association一样)

                                4.多列值传递

                                        将多列的值封装map传递

                                5.discriminator鉴别器

                                        1.column:指定判定的列名
                                        2.javaType:列值对应的java类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值