目录
第一章 MyBatis简介
要有核心配置文件,要有数据模型对应的mapper。
通过以上的两个组件就能产生SqlSessionFactory,这个工厂能生产出SqlSession,就能使用SqlSession操作数据库了,SqlSession中有一个Executor对象,Executor对象是数据库操作语句的执行者,给SqlSession的sql语句放在了一个pojo对象里,这个pojo对象就像是我们的用户对象一样,有什么用户名、密码、性别等等,这个pojo对象可以将我们的存储语句分开,比如select存储在一个字段中,参数存储在一个字段中,表名存储一个字段中等等,具体如下图所示,MappedStatement存储在Executor里面,Executor存储在SqlSession里面。
在后面的MappedStatement中又牵扯到输入与输出的问题,当把sql语句输入到MappedStatement中时,可能会有占位符?,所以我们需要一个映射,将问号输入,待到要输出数据时,可以将其映射为map,string等等。
第二章 具体操作
2.1 pojo类与核心配置文件的配置
pojo类的话,其中的字段与数据库中的字段名字类型匹配就好了。
可以看出配置类主要是配置mybatis的一些参数,mybatis需要的mapper的位置。
2.2 Mapper.xml的配置
在select标签中,id代表查询的名字,自己起,parameterType表示参数的类型,resultType表示返回值的类型,自动填充的,需要pojo类的属性名与数据库表中的字段名一致才可以自动填充,要填写完整的类名。#{v}代表接收参数。
为了避免各个pojo类.xml中的id名重复,一般会在mapper标签中加入namespace属性。
2.3 执行查询
需要执行的时候,先通过工厂创建SqlSession,然后调用其的方法传入mapper中的配置与参数即可。
2.4 简单的查询例子
2.4.1 模糊查询
虽然这个查询的是list,按理说要返回list<?>,但是根据规定,只需要填写里面的泛型就好,所以还是那个user,#{}表示要给参数加上两个单引号,同时{}括号中的名字可以随便起,${}表示不给参数加上单引号,{}里面的名字必须为value,即${value}。
2.4.2 添加用户
2.4.3 添加用户返回ID
mysql保存数据的过程是先保存数据后生成id。keyProperty表示的需要获取的属性,这个是由数据库提供的不是mybatis提供的。
2.4.4 更新用户
2.4.5 删除用户
第三章 Mybatis与Hibernate的区别
3.1 Mybatis解决的问题
1. 可以在核心配置文件中配置数据连接池,使用连接池管理数据库链接。
2. 把sql语句写在代码里易维护。
3. mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4.mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
3.2mybatis与hibernate的区别
1. mybatis不完全是一个ORM框架,hibernate是完整的版的ORM框架,区别是一个要写sql语句,一个不用写。
2. mybatis程序员直接写原生态的sql,可严格控制sql执行性能,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一旦需求变化要求迅速输出,但是灵活的前提是mybatis无法做到数据库无关性,比如mysql与oracle的分页就不一样,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多的代码,但是hibernate学习门槛较高,怎么设计O/R映射,在性能和对象模型之间如何权衡以及如何用好hibernate需要具有很强的能力。
第四章 原始Dao开发与Mapper动态代理开发
4.1 前几章进行的操作所处位置
刚才我们写了很多,其实并不在三层架构之中,我们只是在数据库外建立了一个单元测试,通过单元测试来进行一系列的操作,如果我们能将单元测试整合到dao层之中,就可模拟dao层的开发了。
我们观察刚才的测试中的代码,我们发现前面几行都是重复的,所以我们可以进行提取,但是SqlSession不能进行提取,因为工厂是单例模式,我们可以共用一个工厂,但是一个session是一个线程,所以我们不能共用(还是有些疑问)。
4.2 Dao开发
按照之前的开发,我们需要进行注解配置,但是现在我们没有spring,只能自己new一个。
我们再写一个单元测试充当service层,
这是原始的dao开发,之前hibernate就是这么干的。
4.3 Mapper动态代理开发
在原始的dao开发中,我们要写的比较复杂,需要写mapper.xml,dao接口与dao实现类。在实现类中还有很多重复的代码,所以出现了Mapper动态代理开发。
我们建立mapper包取代dao包,新建接口UserMapper(相当于dao接口),如果接口能遵循四个原则就可以取代接口+实现类的形式。
关于第二条的思考:我们一开始数据库接口的名字可以不一样是因为我们是用命名空间加id进行调用的,现在我们让系统自动根据接口建立了对象,系统想知道我们接口调用的是哪个数据库语句,这时只要根据方法名去数据库里找对应的id,然后执行sql语句就行了.
自己的思考:在实现类中我们要做的就是把dao实现类中的方法和xml中的sql语言结合起来,如果有更简便的方法使之结合,再让系统帮们生成实现类,我们就可以不用写实现类了,直接调用接口的方法就行了。
注意到在接口中和使用时并没有区分是selectone还是selectlist,它会根据你mapper接口的返回值来决定的。在接口中我们可以使用pojo包装对象与map对象等等,用来保证代码的通用性。
第五章 SqlMapConfig的一些配置
5.1 properties的配置
5.2 typeAliases
我们在mapper的resultType中,一般是写全类名,如下图
我们可以起个别名,然后就能直接写User了,需要注意的是properties标签要在typealiases标签上面。
但是这样写有个弊端,我们有一个表就要写一个别名,比较麻烦,我们可以直接写个包名,只需指定父包即可,它会扫描下面的子包等等,同时不区分大小写,我们用大写小写都行。
5.3 Mapper设置
我们需要指定Mapper.xml的位置,一开始我们的Mapper使用resource设置的,如下图,我们也可以用别的配置指定其位置。
用class配置:此种方法要求mapper.xml与mapper接口名字相同,且在同一个包下,与5.2的问题一样,同样一个表一条语句有些麻烦,可以直接扫描包,只要遵循前面的规则就可以了。