二. 映射文件xml配置
1. dtd文件约束xml语法规则
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2. mapper
<mapper namespace="com.qnkj.dao.IStudentDao"></mapper>
namespace:映射该命名空间中的方法
3. select
<select id="getAll" resultType="com.jxc.pojo.student">
select * from student
</select>
常用的几个属性
-
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
-
parameterType 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler) 推断出具体传入语句的参数,默认值为未设置(unset)。
-
resultType 从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。
-
resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同时使用。
3. insert , update , delete
<insert id="addStudent">
insert student(id,name,age,gender) values(#{id},#{name},#{age},#{gender})
</insert>
<update id="updateStudent">
update student set name = #{name},age = #{name},gender = #{name},
</update>
<delete id="delStudent">
delete from student where id=#{id}
</delete>
4. 结果映射
你已经见过简单映射语句的示例了,但并没有显式指定 resultMap。比如:
<select id="getOneStudent" resultType="map">
select id, name, age, gender
from student
where id = #{id}
</select>
上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为领域模型。MyBatis 对两者都提供了支持。看看下面这个 POJO:
package com.jxc.pojo;
import java.io.Serializable;
public class Student implements Serializable {
private Integer id;
private String name;
private Integer age;
private String gender;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id;}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
public String getGender() { return gender; }
public void setGender(String gender) { this.gender = gender; }
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
基于 JavaBean 的规范,上面这个类有 4 个属性:id,name,age,gender。这些属性会对应到 select 语句中的列名。这样的一个 JavaBean 可以被映射到 ResultSet,就像映射到 HashMap 一样简单。
<select id="getOneStudent" resultType="com.jxc.pojo.Student">
select id, name, age, gender
from student
where id = #{id}
</select>
而我们在核心配置文件中配置了类型别名
<!--<typeAliases>
<typeAlias type="com.jxc.pojo.Student" alias="student"></typeAlias>
</typeAliases> -->
<!-- 可以直接写别名-->
<select id="getOneStudent" resultType="student">
select id, name, age, gender
from student
where id = #{id}
</select>
问:怎么解决数据库列名和实体类属性不一致的情况?
- 用sql语句别名来解决
<select id="getAll" resultType="student">
select
stu_id as id,
stu_name as name,
stu_age as age,
stu_gender as gender
from student
</select>
- 用resultMap解决
<resultMap id="studentMap" type="Student">
<id property="id" column="stu_id"/>
<result property="name" column="stu_name"/>
<result property="age" column="stu_age"/>
<result property="gender" column="stu_gender"/>
</resultMap>
<!-- 而在引用它的语句中使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如: -->
<select id="getAll" resultMap="studentMap">
select id, name, age, gender from student
</select>