对于不同的声明风格,MyBatis提供了多个同的参数,例如:SELECT、INSERT、UPDATE和DELETE。让我们看看这些是如何配置的。
我们在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好用了,不是使用固定的格式,而是通过自己的想法至尊命名,然后去调用。
在前面的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>
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);
一个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);
对于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。