学生谈对Mybatis的理解

自学MyBatis遇到的问题及感受
一:遇到的简单问题及处理
1.Book.xml创建命名空间时,运行时出错
Book.xml 的命名空间namespace必须是独一无二的,它可以取任意值,如果dao不为空,Book.xml创建命名空间时,namespace不能用 包名.类名 的形式,这样可能与下面的内容出现冲突,导致出错,因此我们在起名时可以用单个的单词的形式命名,最好和当前映射文件相关,这样可以保证独一无二和避免与下面的内容的冲突,从而避免出错。
2.因不同的数据库而导致的查询时出现的SQL语句错误
在进行sql语句查询时,不同的数据库查询语句不尽相同,因此需要根据不同的数据库写不同的sql语句。
在myBatis中查询返回部分列时,需要利用Map来获取查询到的数据,在oracle数据库中查询数据时Map的key值必须用大写,否则就会出现SQL语句错误,而在mysql数据库中查询时,Map的key值必须和sql语句中要查询的属性大小写一致,否则查不到数据。
3.进行动态sql查询时出现的问题
进行动态sql查询有两种方法:一种方法是利用if标签进行条件的选择时,在where后面加上一个1=1,每个条件前加上and,这种方法容易出现错误;
另一种方法是利用trim标签进行条件的选择,属性为prefix=”where”,prefixOverrides=” and / or “,特别注意and和or的前后需要加空格,该标签可在sql语句多出了and或者or时自动进行and或者or的屏蔽,另外注意使用Oracle数据库时,第一个if条件 前不加and或or, 后面的条件需要加上and或者or,否则会出现sql语句错误而在使用mysql数据库时,and或者or都可以省略。


select * from book where 1=1

and name like #{name}


and page>#{page}




select * from book


name like #{name}


and page>#{page}



在Oracle数据库中若不加and,则会出现下面这种错误:

4.插入记录时,自动生成Id时的一些问题
当我们在插入一条记录时,插入语句的字符串注意必需要用单引号,否则会出现插入的类型不符合数据库类型的错误。不是所有的数据库都支持自动生成id,只有支持autoincrement的数据库可以自动生成id,例如mysql可以自动生成id,Oracle不可以自动生成id,oracle数据库需要进行一些配置之后才可以自动生成id。
数据库自动生成id需要两个条件,1:userGeneratedKeys=“true”(默认为true),不给id时自动生成id;2:主键对应的列的名字也叫id,若不是id则需要在insert标签加上一个属性KeyProperty=”主键对应的列的名字”,只有同时符合这两个条件才可以自动生成id.
oracle 若要自动生成id,需配置selectKey标签,需要在插入语句前先利用序列来生成一个id,然后再执行插入语句,例子如下:

select my_seq.nextval from dual

insert into book(id,name,page) values(#{id},#{name},#{page})
在插入前先生成id然后再插入,order=”BEFORE”表示插入前执行keyProperty=”id”表示主键对应的列的名字叫id,与values 中得id要相同
5.分页查询时遇到的一些问题及注意
分页查询:在进行分页查询时,需要建立一个RowBounds对象,通过RowBounds来限制查询的范围,例如new RowBounds(start, pageSize),start表示从查询的第几条开始,pageSize表示每页的规模;并且在查询时,session.selectList(“book.all”,null,rb),null为参数位置不能省略,不然查不出正确数据,如果没有参数就写null。
6.进行dao接口编写时所要注意的事情
当dao为一个空的接口时,namespace就必须是完整的包名+类名形式,并且一定要跟你的包名和类名一致,因为只有这样才能在调用dao时,匹配到你在Book.xml中写的查询等语句并执行,不用在进行dao中方法的编写,但是dao中的方法名一定要和Book.xml中查询的id相同。
例如:



select * from book

接口中的方法一定要和Book.xml中查询的id相同,例如:
public List all();
public List condition1(int id);

二:Mybatis的自我总结和感受

在我学习Mybatis的过程中,我感觉Mybatis还是比较容易理解和接受的,mybatis与hibernate相比,它不能自动生成表,自动化相对而言差一些,但是我认为自动生成表和不自动生成之间并没有太大的关系,只要我们知道实体的各个属性,创建一张表也就最多几分钟的事,这并不是mybatis的不足。与hibernate的学习相比,mybatis可能需要的sql水平要求要高一些,因为在映射文件中对数据库的所有操作都必须用到sql语言,所以如果sql语言水平较低的话可能用起来比较吃力。
总体来说,通过这段时间的学习,我还是比较喜欢mybatis这个框架的,虽然自动化相对而言差一些,但是它的代码之间的耦合度很低,mybatis把对数据库的查询等操作全部放入到一个映射文件中,这样可以最大限度的减少我们的代码量,并且在我们需要修改一些操作时,只需要修改映射文件,不需要修改其他东西,因此我们基本不用担心代码的耦合,并且把所有的对数据库的操作都结合在一个文件中,这样会是代码变得更加清晰,更好进行操作,这是我喜欢这个框架的最大的原因。

你可能感兴趣的:(Web后台)