MyBatis映射文件
文章目录
前言
在不同的映射文件中,mapper元素的子元素的id可以是相同的,MyBatis通过mapper元素的namespace属性值和子元素的id区分不同的Mapper.xml文件。
提示:以下是本篇文章正文内容,下面案例可供参考
一、MyBatis映射文件中的常用元素
1.1 select元素
<select id = "findUserById" parameterType = "Integer" resultType = "com.itheima.pojo.User">
/* parameterType的值表示接收的类型
resultType的值表示结果类型
*/
select * from users where id = #{id}
/*#{参数名}表示占位符,JDBC中用“?”来标识*/
</select>
1.2 insert元素
insert元素用于映射插入语句,在执行后会返回一个整数,表示插入记录的条数。
<insert id = "addUser" parameterType = "com.itheima.pojo.User">//id的值是这条插入语句的唯一标识,parameterType的值表示接受一个User类型的参数
insert into users(uid,uname,uage)values{#{uid},#{uname},#{uage}}
</insert>
执行插入操作后如果需要获取插入成功的数据生成的主键值,下面有两种方法:
(1)使用支持主键自动增长的数据库获取主键值
<select id = "addUser" parameterType = "com.itheima.pojo.User" keyProperty = "uid" useGeneratedKeys = "true">
/*
keyProperty是用POJO的某个属性接收主键的返回值(通常会设置到id属性上)。如果需要设置联合主键,在多个主键之间用逗号隔开。这里是用id的属性接收返回值。
useGeneratedKeys的属性会获取数据库内部产生的主键,默认值是false,即不获取。这里设置为true。
通过这两个属性的配置,将自动增长的id主键回写到“uid”,结果会显示id的值
*/
insert into users(uid,uname,uage)values{#{uid},#{uname},#{uage}}
</insert>
(2)使用不支持主键自动增长的数据库获取主键值
<insert id = "addUser" parameterType="com.itheima.pojo.User">
<selectKey
keyProperty = "id"
resultType = "Integer"
order = "BEFORE"//会首先执行<selectKey>元素中的配置来设置主键,然后执行插入语句。如果为AFTER,它先执行插入语句,然后再执行<selectKey>元素中的配置内容。
>
select if(max(uid) is null,1,max(uid)+1) as newId from users
/*
如果users表中没有记录,则将uid设置为1,否则将uid的最大值加1,作为新的主键
*/
</selectKey>
insert into users(uid,uname,uage)values{#{uid},#{uname},#{uage}}
</insert>
1.3 update元素
update元素用于映射更新语句,可以更新数据库中的数据。在在执行完元素中定义的SQL语句后,会返回更新的记录数量。update的常用属性属性值与insert基本相同。
<update id = "updateUser" parameterType = "com.itheima.pojo.User">
update users set uname = #{uname},#{uage} where uid = #{uid}
</update>
1.4 delete元素
在执行完delete元素中的SQL语句之后,会返回删除的记录数量。
<delete id = "deletUser" parameterType = "Integer">
delete from users where uid = #{uid}
</delete>
1.5 sql元素
sql元素将SQL语句中相同的部分抽取出来,在需要的地方引用。引入时需要<include refid=>语句。
<sql id = "userColumns">${alias}.uid,${alias}.uname,${alias}.uage</sql>
<select id = "findUserById" parameterType = "Integer" resultType = "com.itheima.pojo.User">
select <include refid = "userColumns"/>//引用自定义代码段
<property name = "alias" value = "t1">//sql元素参数化,<sql>元素中的属性值随包含的对象而发生变化
from users
where uid = #{uid}
</select>
1.6 resultMap元素
resultMap元素表示结果映射集。定义映射规则、更新级联和定义类型转换器。
默认情况下,MyBatis程序在运行时会自动将查询到的数据与需要返回的对象的属性进行匹配赋值。也就是数据表的列名与类的属性名一致时才会匹配成功并给属性名赋值。
//在数据库中创建表
USE mybatis;
CREATE TABLE t_student(
sid INT PRIMARY KEY AUTO_INCREMENT,//列名是uid
sname VARCHAR(50),//列名是sname
sage INT//列名是sage
);
//实体类封装信息
public class student{
private Integer id;//学生id
private String name;//学生姓名
private Integer age;//学生年龄
...
}
//在StudentMapper.xml文件中编写映射查询
<mapper namespace="com.itheima.mapper.StudentMapper">//这里是需要实现的接口名或者类名
<resultMap type = "com.ithiema.pojo.Student" id = "studentMap">
//id和result的<property>属性的值与Student类属性名一一对应
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="age" column="sage"/>
</resultMap>
<select id = "findAllStudent" resultMap="studengMap">
select * from t_studeng
</select>
//编写测试方法
@Test
public void findAllStudentTest(){
//SqlSession执行映射文件中定义的SQL,并返回映射结果
//selectList()方法的参数是映射文件StudentMpper.xml中定义的<select>元素id的全限定类名
List<Student> list = sqlSession.selectList("com.ithiema.mapper.StudentMapper.findAllStudent");
for(Student student:list){
system.out.println(student);
}
}