【Mybatis】Bonus02 补充


 

关于主键生成问题

Mybatis的主键生成是基于JDBC的使用主键【getGeneratedKeys()】方法

也就是说,必须要JDBC驱动的支持才行

    @Test
    public void junitTest() throws SQLException {
        Connection connectionByOriginalJdbc = CompleteJdbcUtils.getConnectionByOriginalJdbc();、
PreparedStatement preparedStatement
= connectionByOriginalJdbc.prepareStatement("");
ResultSet generatedKeys
= preparedStatement.getGeneratedKeys(); }

 

useGeneratedKeys 表示使用数据库生成的主键,

keyProperty 表示绑定数据表的主键返回给实体类的哪个字段

 

在之前的插入SQL中并不需要主键生成功能就能完成主键自增生成,

看来是JDBC自动生成的【如果开启就像官方说的一样,是强制生成的】


 

实现主键生成的第二种方式:

使用<SelectKey> 标签

SELECT last_insert_id 表示查询最后一次插入的id

如果在SQL执行前查询,就返回最后一次插入的记录的id

然后我们的插入SQL就会按这个查询的id插入,这样插入是有问题的,

所以要选择AFTER,在执行插入后返回主键,再生成

 

对应的,使用注解实现的方式

 


 

关于getMapper底层实现原理

这是一个查询的SQL

先获取会话实例

然后从会话中获取Mapper实现类

调用查询SQL,完成后释放资源

通过调试查看源码

其实也是使用动态代理完成的

根据command的类型来处理,

一共四个Case,也正好就是我们Mapper的4个SQL标签

而在增删改3个,都是直接注入SQL即可,因为返回只有修改的记录结果数

 

SELECT反而更为复杂

需要根据查询的结果要求进行处理

 

摘要自: https://www.bilibili.com/video/BV1dV411o7bA?p=11


 

关于参数占位符

在多个普通参数注入的情况,我们可以使用这种占位符表示,

也就是不通过名称标识注入

 

如果是多个实体类类型的参数。。。

 


 关于驼峰命名匹配

Java实体类声明的映射字段是以驼峰命名的,

例如:

  userId,userName,userPassword

 

但是数据库的字段是不区分大小写的,尤其是Oracle数据库,会直接全大写

一般设置的字段会是这样,

例如:

  user_id,user_name,user_password

或者Oracle全大写的这样

  USER_ID,USER_NAME,USER_PASSWORD

Mybatis的设置项中可以开启一个驼峰命名映射,帮助这个字段进行匹配

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

 

如果你打算完全一致的声明ORM字段列表示,请不要设置驼峰匹配!!!

这会导致Mybatis无法找到数据表的字段【显示一切正常】

你会根本找不到什么问题,所有配置完全一致,结果就是返回null

 

 


 

关于模糊查询Like 更好的安全写法

 


 

posted @ 2020-05-07 08:56  emdzz  阅读(144)  评论(0编辑  收藏  举报