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号映射进刚才传入的对象也很简单,我们不需要再进行一个查询操作,只需要在刚才的<update>标签中加入三个属性即可,如下所示:
通过设置以后,这个对象中的id号就会映射进来。
3.删
删除操作使用<delete>标签,我们一般通过id号进行删除,其余与别的操作基本类似,例如:
4.改
改操作使用<update>标签,我们一般使用对象作为参数传入,要记住对要改的属性以及条件属性赋值,其余基本一致,例如:
注:在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驼峰,两个相互对应即可。
需要在全局配置文件中<settings>目录下进行一个配置:
3、当数据库中列名和java中属性名不一致时,我们可以在sql语句中给查询出的数据设置别名,让其与java中属性名一致。
4、当数据库中列名和java中属性名不一致时,也可单独进行处理(多表关联时经常使用,单张表几乎用不到,我们先以单表举例);
我们自定义resultMap,其中column指的是数据库中的列名,property指的是java中的属性名,实际意义可以理解为将从数据库中查出的列名为gender的数据映射到java中为xb的属性中;
<resultMap id="adminMap" type="admin"><result column="gender" property="xb"></result>
</resultMap>
select * from admin where id=#{id}
最终使用resultMap即可解决。
4.多表关联的查询:
首先,我们还是需要知道的是,Mybatis框架对jdbc进行了轻量级封装,它可以实现java与数据库的映射,在我们的sql语句只涉及单张表时,如上面所示解决。而当我们使用到多张表时,这里的映射就不像单张表那么简单。
这里以学生表和年级表为例,学生表中的列应该有年级id来存储学生的年级,这里对应的java中的学生类中的属性也应该要存储年级,在这里为了防止冗余,学生类的属性中用来存放年级信息的就是年级类,不应该放年级名,这样会导致数据冗余。
在这里我们要重点使用学习的是<resultMap>标签,这个标签主要的作用就是将数据库的各个列名与java中属性名相互对应,这样在进行映射时就可直接进行映射。
下面是举例:通过id查询学生表的信息,并且将查询信息封装在student对象中
如上图所示,<resultMap>中的id指的是它的名字,下面的sql可以通过名字来调用这个<resultMap>,
在其下使用这三种标签:
(1)<id>标签指的是主属性,即映射主键
(2)<result >标签映射普通的属性
(3)<association>标签映射关联属性,即一个类,property指的是java中这个类的引用,javaType指的是这个类,在这个标签下我们使用<result>设置我们对应的映射。
上面的SQL语句我们使用了<sql>标签进行封装,在底下通过id号并使用<include>进行调用。
在这里我们会发现一个问题,那个关联的属性需要我们自定义也就罢了,其他普通属性凭什么还要再次定义啊,在这里,如果我们不想对普通属性再次定义映射,那我们就需要对全局配置文件中<settings>进行设置,如下:
<setting name="autoMappingBehavior" value="FULL"/>设置是否自动映射,指的是多表关联时,除了特殊属性(指属性类,用到association标签)外的其他普通属性,进行自动映射。 使用时需要注意,它会将你为查询的特殊属性(属性是类)中的其余属性进行自动映射,但往往不是我们想要的,所以我们注释掉
FULL:一直开启自动映射
NONE:不自动映射
PARIAL(默认):单张表自动映射,有嵌套关联关闭自动映射
总结:完成以上配置后,创建test进行student的id查询,我们即可完成一个简单的多表关联查询。
版权归原作者 用手写的从前 所有, 如有侵权,请联系我们删除。