发表于: 2017-09-03 02:14:03

1 879


这段时间出了趟远门,今天才回家。


今天把mapper.xml收了个尾,然后开始测试。

代码链接:

1.mapper.xml:https://github.com/Cage666/Student/blob/master/config/StudentMapper.xml

2.测试代码:https://github.com/Cage666/Student/blob/master/test/MybatisStuImpl.java


测试过程:

1.开始测试后,在setUpBeforeClass这一步就出了问题:bug大意就是找不到类型为[String,String,Integer]的构造函数。(我在mapper.xml中的resultMap中设定了构造器映射)

解决方法:将Student类的构造函数参数列表中的参数(jnshuId)类型由int改为Integer。由于Integer类型的值可以直接赋给int类型的值,其余部分并未修改。

疑惑:我明明在mapper.xml>resultMap>constructor中id_jnshu的javaType设定的是int,可是程序自动读取为Integer了。


2.Mybatis-mapper.xml中,insert,update,delete的返回值能否设置为boolean?

答:sqlSession中的三个方法的返回值只能是int(影响行数)。接口中的返回值类型随意,没有影响。


3.能否在mapper.xml中,将sql的结果进一步操作(比如获取的Date类型结果,进行toString()操作)?

答:不用这样。如果POJO中的属性是String,Mysql中的数据是DATE,Mybatis会自动把获取到的java.sql.Date值toString()后传给POJO中的属性。


4.先忽略了其他三个测试方法,单独测试queryStuByName方法(通过姓名查询)。

结果:正常,并且可以打印出获取的学生对象的entrytime。(就是这样才获知了第3条的)


5.如何在调用sqlSession中的方法时,传入多个参数?(比如查询时要传入major和jnshuId,但是selectOne函数只支持一个参数)

答:用HashMap<String,Object>传入参数,String为参数名,Object为参数值。(测试代码第65行)


6.测试addStu方法,这里出现了一个很奇怪的现象:

插入方法的测试通过了,并且在测试方法中还查询到了,甚至连数据插入数据库时触发器自动生成的createTime都能打印出来,但是数据库中并没有出现一条新的记录?

通过查询方法的测试,可以知道,数据库信息是没有搞错的。重复测试,一直能成功插入,并且打印出的createTime一直在更新,说明记录的确没有真正插入数据库(因为我把major和jnshuId设为联合唯一索引了,如果第一次成功插入,第二次插入就会失败)。


7.测试delStuById方法,bug提示大意是无法把int型数据转为long型。(这一点很奇怪,在delete函数中直接传入的参数竟然只能以int型读取,而不是自动判定类型)

修改测试方法,不直接在sqlSession.delete()函数中写参数4,而是先定义long型变量id=4,将id传入函数,即测试通过。

这里出现了和6中同样的现象,测试通过,但数据库中的记录并没有被删除。

如图,根据打印结果,查询方法并未出错,然而在79行中查询到的结果为空,看似是删除成功了,但数据库中数据还在。(刷新过了)


7.测试updateStu方法,结果同上,测试通过而数据库未改变。

另外,由测试通过,验证了传入两个参数时,mapper.xml中updateStu中参数的写法:

如图,不设定接收参数的属性:


8.开始找原因:为何测试通过,但数据库中的记录没有变化。

原因:没有进行事务的提交,所以数据没有提交到数据库中。加上一句sqlSession.commit();即可。

在增删改测试代码中加上这一句后一切正常。


9.在此项目中,为了一致性,编写一个简单的Mybatis数据操作类,实现数据操作接口。这样就可以依旧通过原先的方式调用数据操作方法了。

数据操作类代码链接:https://github.com/Cage666/Student/blob/master/src/StudentDAOMybatisImpl.java


至此Mybatis部分完工。


长时间没动,之前写的东西都快忘了。。花了好半天复习之前自己写的东西→_→


明天:

完成任务1:

1.编写主类。功能:向数据库中插入X条数据。可通过多线程提高效率。(两个线程分别生成随机学生数据、插入数据库)

>可以通过多线程提高向数据库中插入数据的效率吗?

>通过批处理插入提高插入效率。

2.进行任务1中的各项测试。


返回列表 返回列表
评论

    分享到