mybatis4

本着mybatis是什么?好处在哪,解决了哪些问题?原理?怎么用?

mybatis是一个持久层ORM(object relational mapping 对象关系映射)框架,对操作数据库的JDBC代码进行了封装。

好处,也是解决了哪些问题
1.让我们开发者只关注业务的处理,省去了加载驱动,数据库连接,创建statement语句对象,参数设置
结果集的处理等繁琐代码。
2.使用mybatis的xml配置或者注解方式,可以让java对象自动映射到sql参数,生成最终的sql执行语句,将
返回的的结果自动映射到java对象,返回给业务层。

此时疑问+?
1.如何找到mapper的映射文件。
2.如何让参数和java对象,结果集和java对象映射的。

原理:
1.mybatis框架有个核心配置文件 .xml,配置了相应的驱动,数据库的连接,操作数据库的环境,配置了
mapper映射文件的路径等东西。
2.加载mybatis的核心配置文件,然后通过sqlSessionFactoryBuilder这个类的build方法来读取核心配置文件。
3.读取到核心配置文件后,返回sqlSessionFactory对象,然后去创建SqlSession对象。
4.sqlSession对象去发起crud。
5.这里就是如何做到自动映射的,用了一个MappedStatement对象,就是每一个sql语句,进行参数映射。

框架原理参考:http://www.mamicode.com/info-detail-1630013.html   (图形易懂)

疑问继续提出:

1.#{}和${}区别?
2.写的mapper中的xml文件,都有一个dao层接口与它对应,dao接口工作原理是什么?dao接口的方法是否可以重载?
3.如何获得自动生成的键值?

1.1#{}是一个占位符,相当于jdbc中的?,mybatis在处理#{}时,会将#{}替换为?号,用PrepareStatement的
set方法来赋值。
1.2${} mybatis在处理时,直接把{}替换成变量的值。
优先用#{},安全,能防止大部分sql注入。${}容易导致sql注入,但在传入表名时必须用${}

2.dao层接口,也就是我们说的mapper层接口,接口全限定名就是xml文件中的namespace的值,接口中的
方法名就是xml文件中的MapperedStatement对象的id值,这里注意MapperedStatement就是我们xml中sql
语句。
当业务层调用mapper接口层方法时,就会通过接口全限定名+方法名作为一个key定位到xml文件中的一条sql
语句。
dao接口工作原理是基于jdk的动态代理,mybatis在运行的时候,业务层调用持久层方法时,就会产生一个动态代理
对象去对该方法进行增强,也就是拦截该方法,映射参数然后去执行sql,并将结果返回。
dao接口方法不可以重载,因为要通过接口全限定名+方法名作为key去定位一个唯一的MapperedStatement对象,
如果方法名重载了,就定位不到了。

3.我们在用insert的时候,返回的是行数,但用对象插入的时候,会给实体类返回自增的键值。

  

原文地址:https://www.cnblogs.com/yiyezhiqiuwuchen/p/12809001.html