查看: 1630|回复: 0

[Java学习] 阿里P7大牛带你一起来看MyBatis(五)

发表于 2018-1-24 19:46:16
在之前4个中的学习中,数据表的字段名和实体类的属性名称是一样的,如下图所示(没有看到的可以关注我的头条号进去看的)
这种情况下,我们进行CRUD操作是很方便的,就拿查询来说,只需要在xxxMapper.xml文件中对select标签配置一下即可
在使用时候,只需要User user = session.selectOne(statement, 1);就可以得到对应的实体类对象,其实就是一个把从数据表中查询到的记录映射到一个实体类对象的过程,也就是干了JDBC代码的这个过程,我截张图过来。
这张图就是通过JDBC进行的一个查询操作,然后将查询的结果通过循环遍历的方式赋值到实体类对象Admin中,为什么提这段代码呢?因为MyBatis是对JDBC的封装,所以说MyBatis的底层一定也做了这件事,不然怎么可能通过简单的select标签以及一两行代码就可以实现数据表的记录到实体类对象的过程呢?原理实际上是一样的,只不过MyBatis帮我们写好了这个繁琐的步骤。
好了,回归到我们讨论的话题,之前咱们数据表字段名和实体类属性名是一致的,上面截图中的映射实际上是遍历赋值的过程,比如admin.setUsername(rs.getString("username"))这句话,rs.getString("username")是从数据表的结果集中取出值,而admin.setUsername是向admin对象中设置值,这样才可以实现一个映射的过程,其他的字段属性也是同理,可以看出,两者的名称是完全一致的,所以映射起来很方便。
好了,有了这个共识之后,我们继续往下看。
如果数据表字段名和实体类属性名不一致会怎么样?要看会怎么样,咱们还是通过一个demo,因为前面几章步骤写得比较详细,这里有些步骤我就不截图咯。
要朝这java程序员发展或者真心有兴趣的。可以找我要一些java的学习视频java学习交流群:450936584,这个是免费的,希望同学找我要的时候不要有理所应当的态度,毕竟都是我的心血,希望你是真的有一颗想要学好java的心,我也会尽所能的去帮助你成为一名优秀的程序员
1)创建一张数据表t_student,为了演示方便,就只写两个字段咯。同时准备几条记录
2)创建一个Java工程”ES9D_MyBatis5",并且导入相应的jar包
3)创建实体类Student,可以和数据表字段名进行对比一下,发现两者的确不一致
4)创建SqlMapConfig.xml文件和MyBatisUtil工具类
5)创建studentMapper.xml文件
(6)将studentMapper.xml文件交给SqlMapConfig.xml文件管理,并编写测试类TestCode。可是比较奇怪的是,发现并没有取到值,student为null,难道配置错了?回头检查了一下,发现并没有,那是因为什么呢?原因很明显,数据表字段名和实体类属性名不一致。
7)咱们先不着急分析具体原因,不妨来稍微改动一下studentMapper.xml文件,如下图所示
实际上是给t_student表中的字段起了一个别名,并且该别名和实体类属性的名称一致,然后我们再运行看看刚才的测试代码。
这时候可以发现可以取到值,这时候大家能想通是因为什么吗?表面上的原因是因为数据表字段名和实体类属性名不一致,但是根据咱们开头的分析,不妨揣测一下进一步的原因。
如上图所示,当数据表字段名和实体类属性名不一致时,底层代码会根据数据表字段名的首字母大写去set值,但是实体类中并不存在该方法,只有起了别名之后,才会和实体类中的set方法对应。
8)那么当数据表字段名和实体类属性名不一致的时候,该怎么处理呢?上面给每个字段起一个别名,并且一一和实体类的属性名对应是一种解决方式,还有一种方式是使用标签的形式,实实际上就是为了将两者名称对应起来,具体做法如下。载select标签中定义一个resultMap属性和resultMap标签的id对应,也就是配置数据表t_student字段名和实体类Student的属性名,标签对中是具体的配置做法,主键使用id标签,column表示数据表的列名,property表示实体类的属性名,result标签配置的是其他字段和属性。这样就相当于给数据表字段起了一个别名,然后set方法就可以对应起来。
咱们不妨看下运行结果,一样可以取到值。



回复

使用道具 举报