1.单张表的增删改查

首先介绍idea中的一个功能,叫做单元测试

我们使用@Test来作为一个类中的一个方法的上标志,需要引入import org.junit.Test;

此时,这个方法就可以单独执行,我们就不需要每次都在main方法进行方法定义来测试方法中的代码,直接就可运行方法中的代码,还可进行debug运行。

1.查

(1)单个参数直接传递即可

注:只有基本类型可以直接传入,引用类型必须要使用下面两种方式(八个基本类型对应的引用类型因为可以自动转型,所以也可以单个参数直接传递)。

(2)多个参数进行查询时我们需要改变Dao中的抽象方法中的参数形式,例如:

Admin findAdmin(@Param("account") String account,@Param("password") String password);

此时mappers中的映射文件中的sql中就不需要写parameterType这一属性

(3)当我们有更多参数需要传入时,可以将数据封装进对象中,将对象作为参数传入,sql语句中使用参数对象中的哪个值,就从这个对象中取即可,不用对这个对象中所有属性都赋值,用什么赋什么即可。

此时的映射文件中对应sql 中parameterType=这个对象的类型。

2.增

注:当我们使用的sql语句对数据库中数据进行了改动时,我们就需要在sqlsession调用的最后,即

sqlSession.close之前,进行sqlsession.commit() ,即提交数据库事务,告诉数据库所有的逻辑执行完了,你可以将所有的sql执行 。查询操作不改变数据,所以不需要 这个操作。

当我们进行增加操作时,一般都是将对象当做参数传入,这个对象其中的属性值我们要提前设置好,但此时的这个对象并没有主键id,因为它在数据库是自增的,要想让其id号映射进刚才传入的对象也很简单,我们不需要再进行一个查询操作,只需要在刚才的标签中加入三个属性即可,如下所示:

通过设置以后,这个对象中的id号就会映射进来。

3.删

删除操作使用标签,我们一般通过id号进行删除,其余与别的操作基本类似,例如:

4.改

改操作使用标签,我们一般使用对象作为参数传入,要记住对要改的属性以及条件属性赋值,其余基本一致,例如:

 

注:在mappers sql映射文件中,resultType是返回值的类型定义,我们自定义的类的全类名已经定义了别名,那么java API中常见的类的全类名其实也已经在Mybatis jar包中进行了别名的定义,我们直接使用即可

2.#{}和${}的区别

#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入

#{}:select * from t_user where uid=#{uid}

${} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句,$方式无法防止 Sql

注入 ${}

${}:select * from t_user where uid= '1'

注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是#

总之可以理解为两个都能拿到值,但是#{}拿到的值会相当于经过预编译,带来一个‘ ’,而${}就相当于将拿来的值直接传入,适合在order by 的场景使用。

3.数据库与java的对象映射

sql语句的查询结果是一条记录,可以实现将数据记录的数据自动封装到对象中去,这个过程也称为数据库与java的对象映射。

在这个过程中,数据库的sql语言其实并未改变,Mybatis框架主要进行的作用就是将sql语句查询出来的数据封装在对应的对象中,就不用想我们以前那样很麻烦的进行封装,使用Mybatis框架进行更加方便的封装。

能够进行自动封装的三种情况

1、表中的列名与java中类的属性完全一致

2、可以出现不一致,但是数据库中属性要是经典数据命名即admin_phone,

此时java的属性为adminPhone驼峰,两个相互对应即可。

需要在全局配置文件中目录下进行一个配置:

3、当数据库中列名和java中属性名不一致时,我们可以在sql语句中给查询出的数据设置别名,让其与java中属性名一致。

4、当数据库中列名和java中属性名不一致时,也可单独进行处理(多表关联时经常使用,单张表几乎用不到,我们先以单表举例);

我们自定义resultMap,其中column指的是数据库中的列名,property指的是java中的属性名,实际意义可以理解为将从数据库中查出的列名为gender的数据映射到java中为xb的属性中;

     select * from admin where id=#{id} 

最终使用resultMap即可解决。

4.多表关联的查询:

首先,我们还是需要知道的是,Mybatis框架对jdbc进行了轻量级封装,它可以实现java与数据库的映射,在我们的sql语句只涉及单张表时,如上面所示解决。而当我们使用到多张表时,这里的映射就不像单张表那么简单。

这里以学生表和年级表为例,学生表中的列应该有年级id来存储学生的年级,这里对应的java中的学生类中的属性也应该要存储年级,在这里为了防止冗余,学生类的属性中用来存放年级信息的就是年级类,不应该放年级名,这样会导致数据冗余。

在这里我们要重点使用学习的是标签,这个标签主要的作用就是将数据库的各个列名与java中属性名相互对应,这样在进行映射时就可直接进行映射。

下面是举例:通过id查询学生表的信息,并且将查询信息封装在student对象中

 

如上图所示,中的id指的是它的名字,下面的sql可以通过名字来调用这个

在其下使用这三种标签:

(1)标签指的是主属性,即映射主键

(2)标签映射普通的属性

(3)标签映射关联属性,即一个类,property指的是java中这个类的引用,javaType指的是这个类,在这个标签下我们使用设置我们对应的映射。

上面的SQL语句我们使用了标签进行封装,在底下通过id号并使用进行调用。

在这里我们会发现一个问题,那个关联的属性需要我们自定义也就罢了,其他普通属性凭什么还要再次定义啊,在这里,如果我们不想对普通属性再次定义映射,那我们就需要对全局配置文件中进行设置,如下:

设置是否自动映射,指的是多表关联时,除了特殊属性(指属性类,用到association标签)外的其他普通属性,进行自动映射。 使用时需要注意,它会将你为查询的特殊属性(属性是类)中的其余属性进行自动映射,但往往不是我们想要的,所以我们注释掉

FULL:一直开启自动映射

NONE:不自动映射

PARIAL(默认):单张表自动映射,有嵌套关联关闭自动映射

总结:完成以上配置后,创建test进行student的id查询,我们即可完成一个简单的多表关联查询。

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: