MyBatis之使用XML配置SQL映射(二)CRUD映射配置

 对于不同的声明风格,MyBatis提供了多个同的参数,例如:SELECT、INSERT、UPDATE和DELETE。让我们看看这些是如何配置的。

1. 声明INSERT

我们在Mapper XML的文件中使用<insert>来配置INSERT的语言。如下:

<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>

在这儿里,我们给出了inSertStudent作为ID,这个可以关联的独有的命名空间是:com.owen.mybatis.mappers.StuentMapper.insertStudent.我们定义的parameterType的属性值必须是完整的限定名,或是别名。我们可以执行上面的代码如下:

 int count =
sqlSession.insert("com.owen.mybatis.mappers.StudentMapper.insertStuden
t", student);

这个sqlSession.insert()方法返回的数值就是插入的行数。取代上面通过命名空间和声明的ID,你可以创建一个Mapper的接口和调用的方式如下:

 package com.owen.mybatis.mappers;
public interface StudentMapper
{
int insertStudent(Student student);
}

你可以调用的insertStudent映射声明如下:

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int count = mapper.insertStudent(student);

这样的方式比Hibernate好用了,不是使用固定的格式,而是通过自己的想法至尊命名,然后去调用。

2. 自动生成Key

在前面的INSERT声明中,我们插入STUDENT的表时,使用了自己手动的STUD_ID作为主键的列值。其实我们可以应用一个useGeneratedKeys和keyProperty属性来生成auto_increment列的值,而将生成的值赋予给STUD_ID.

<insert id="insertStudent" parameterType="Student"
useGeneratedKeys="true" keyProperty="studId">
INSERT INTO STUDENTS(NAME, EMAIL, PHONE)
VALUES(#{name},#{email},#{phone})
</insert>

这里的STUD_ID值将会由MySQL数据库自动生成,而且生成的值将会给student对象的参数studId。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
mapper.insertStudent(student);

现在你可以获取STUD_ID的值:

int studentId = student.getStudId();

一些数据库,如Oracle不能够提供AUTO_INCREMENT列和运用SEQUENCE去创建主键的值。现在,我们拥有一个SEQUENCE名称为STUD_ID_SEQ去生成STUD_ID的主键值。运用的代码如下:

<insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT ELEARNING.STUD_ID_SEQ.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>

这里我们运用了<selectKey>的子元素去生成一个主键的值,并且储蓄它在Student对象的studId的属性中。我们设置属性order=”BEFORE”,这个说明MyBatis在执行INSERT之前,会先对已有的主键进行排序,然后将主键储蓄到studId中。

当然, 我们也可以用触发器来设置主键值,可以从序列中获得一个主键值,并将其设置为主键的列值插入到查询中。如果你使用这个方法,你可以用下面的代码:

<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(NAME,EMAIL, PHONE)
VALUES(#{name},#{email},#{phone})
<selectKey keyProperty="studId" resultType="int" order="AFTER">
SELECT ELEARNING.STUD_ID_SEQ.CURRVAL FROM DUAL
</selectKey>
</insert>

3. 声明UPDATE

UPDATE的声明可以使用<update>的元素配置在MapperXML文件中。

<update id="updateStudent" parameterType="Student">
UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, PHONE=#{phone}
WHERE STUD_ID=#{studId}
</update>

我们可以使用如下的代码来调用声明:

int noOfRowsUpdated =
sqlSession.update("com.owen.mybatis.mappers.StudentMapper.updateStudent",
student);

通过UPDATE的声明,sqlSession().update()方法将会返回受影响的行。

这里我们就不使用声明的命名空间和声明的id来执行,我们使用Mapper的接口和调用 方法如下:

package com.owen.mybatis.mappers;
public interface StudentMapper
{
int updateStudent(Student student);
}
  你可发调用updateStudent声明使用Mapper接口。
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int noOfRowsUpdated = mapper.updateStudent(student);

4. 声明DELETE

一个DELETE的声明可以在MapperXML的文件中使用<delete>元素。

 <delete id="deleteStudent" parameterType="int">
DELETE FROM STUDENTS WHERE STUD_ID=#{studId}
</delete>

我们可以使用下面的方式调用声明:

 int studId =1;
int noOfRowsDeleted =
sqlSession.delete("com.owen.mybatis.mappers.StudentMapper.deleteStuden
t", studId);

在delete的声明中,sqlSession.delete()方法将会返回被影响的那个行。

我们创建一个Mapper接口和调用的方法如下:

 package com.owen.mybatis.mappers;
public interface StudentMapper
{
int deleteStudent(int studId);
}

你可发使用下面的方法来调用Mapper的接口:

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int noOfRowsDeleted = mapper.deleteStudent(studId);

5. 声明SELECT

对于MyBatis的真正有影响的要说它是如何通过JavaBean来映射和选择查询结果了。让我们来看一下简单的配置。

<select id="findStudentById" parameterType="int"
resultType="Student">
SELECT STUD_ID, NAME, EMAIL, PHONE
FROM STUDENTS
WHERE STUD_ID=#{studId}
</select>

我们可以通过下面的方法来调用声明:

int studId =1;
Student student = sqlSession.selectOne("com.owen.mybatis.mappers.
StudentMapper.findStudentById", studId);

上面代码中的sqlSession.selectOne()方法返回的对象,这个对象就是我们要配置文件中配置的resultType属性。如果返回的结果是多个,那么就会报TooManyResultException的报错。

 

我们不用namespace和声明的id来调用映射声明,而是使用Mapper的接口,如下:

 package com.owen.mybatis.mappers;
public interface StudentMapper
{
Student findStudentById(Integer studId);
}

我们可以调用声明中的finadStudentById,使用Mapper的接口。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.findStudentById(studId);

如果你去查找Student对象的参数时,你会发现studId的参数值并不属于表中的stud_id的列值。这是因为MyBatis会自动匹配JavaBean中定义的参数的值与数据库中列值相对应。也就是说,你在JavaBean定义的参数的名称要与数据表中列名保持一致。这就是为什么name、email、和phone可以匹配,而studId就不可以了。

为了解决这个问题,我们可以给列名一个别名去匹配JavaBeans参数的名字。

<select id="findStudentById" parameterType="int"
resultType="Student">
SELECT STUD_ID AS studId, NAME,EMAIL, PHONE
FROM STUDENTS
WHERE STUD_ID=#{studId}
</select>

现在Student类可以与数据库中的stud_id、name、email和phone的列一样了。接下来,我们来看一下如何去执行SELECT并且返回多行结果。

<select id="findAllStudents" resultType="Student">
SELECT STUD_ID AS studId, NAME,EMAIL, PHONE
FROM STUDENTS
</select>
List<Student> students =
sqlSession.selectList("com.owen.mybatis.mappers.StudentMapper.findAllS
tudents");

Mapper接口的StudentMapper可以如下使用:

package com.owen.mybatis.mappers;
public interface StudentMapper
{
List<Student> findAllStudents();
}

运用前面的代码,你可以使用Mapper接口调用findAllStudents的声明。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.findAllStudents(); 

除了使用java.util.List,你可以使用其它的容器,像Set、Map和SortedSet。基于这些容器的使用,MyBatis将会返回下面的结果:
   

1)        List、Collection、或Iterable类型,将返回java.util.ArrayList.

2)        Map类型,将返回java.util.HashMap。

3)        Set类型,将返回java.util.HashSet。

4)        SortedSet类型,将返回java.util.TreeSet。


























你可能感兴趣的:(java,spring,mybatis,web开发)