一. Mybatis 配置数据库和对象属性值对应问题
当数据库的字段和javaBean中的对象熟悉不一致的时候,在执行查询语句 使用当什么时候用到resultMap的情况当 javabean studId ,column stud_id
(1). <select id="findStudentById" parameterType="int" resultType="Student">
SELECT STUD_ID ,NAME,EMAIL,DOB
FROM STUDENTS
WHERE
STUD_ID=#{id}
</select>
将SELECT语句的结果集映射到java对象的属性中时,studId的值将为空
(2). <select id="findStudentById" parameterType="int" resultType="Student">
SELECT STUD_ID as studId,NAME,EMAIL,DOB
FROM STUDENTS
WHERE
STUD_ID=#{id}
</select>
将SELECT语句的结果集映射到java对象的属性中时,studId的值有值
(3).<resultMap type="Student" id="StudentResult">
<id property="studId" column="stud_id" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="dob" column="dob" />
</resultMap>
<!-- 列名和属性名字不一致可以给查询的列起一个别名 -->
<select id="findStudentById" parameterType="int" resultMap="StudentResult">
SELECT STUD_ID ,NAME,EMAIL,DOB
FROM STUDENTS
WHERE
STUD_ID=#{id}
</select>
将SELECT语句的结果集映射到java对象的属性中时,studId的值有值
----------------------------------------- -------- ----------------------------
select id ,name,age,address,t.add_id ,street,zip,country from teachers t,home h where t.add_id=h.add_id and t.id =7;
二. 当数据库中表中存在一个对象时,即javaBean中又嵌套了一个对象,对这个数据库进行操作
那如果有一个自定义的类型,怎么存储存储到数据库呢?示例如下:假设表STUDENTS 有一个 PHONE 字段,类型为 VARCHAR2(15),而 Student类有一个自定义类型属性(PhoneNumber类)public class Student {
private Integer studId;
private String name;
private String email;
private Date dob;
private PhoneNumber ph;
}
public class PhoneNumber {
private String countryCode;
private String stateCode;
private String number;
//PhoneTypeHandler 类中创建的方法来实现输出和传值
public PhoneNumber(String string) {
String [] str = string.split("-");
countryCode = str[0];
stateCode = str[1];
number=str[2];
}
public String getAsString() {
return countryCode+"-"+stateCode+"-"+number;
}
}
SQL> desc students 即在students表中含有PhoneNumber对象
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
STUD_ID NOT NULL NUMBER
NAME VARCHAR2(50)
EMAIL VARCHAR2(50)
DOB DATE
PHONE VARCHAR2(10)
1.所以需要在 PhoneTypeHandler 并在配置xml中注册
这里,参数对象中的属性phone的值需要传递给#{phone};而参数对象的属性phone是 PhoneNumber类型。但是,MyBatis 并不知道该怎样来处理这个类型的对象。
为了让MyBatis明白怎样处理这个自定义的Java对象类型,如PhoneNumber,我们可以创建一个自定义的类型处理器,MyBatis提供了抽象类BaseTypeHandler<T> ,我们可以继承此类创建自定义类型处理器。
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{
//遇到PhoneNumber参数的时候应该如何在ps中设置值
@Override
public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(i, parameter.getAsString());
}
//查询中遇到PhoneNumber类型的应该如何封装(使用列名封装)
@Override
public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException {
return new PhoneNumber(rs.getString(columnName));
}
//查询中遇到PhoneNumber类型的应该如何封装(使用列的下标)
@Override
public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return new PhoneNumber(rs.getString(columnIndex));
}
//CallableStatement使用中遇到了PhoneNumber类型的应该如何封装
@Override
public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return new PhoneNumber(cs.getString(columnIndex));
}
}
2. PhoneTypeHandler注册 到mybatis-config.xml
<typeHandlers>
<typeHandler handler="com.gog.utils.PhoneTypeHandler" />
</typeHandlers>
3. mybatis-config.xml 含又顺序
元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"。
三. 两张表之间联系查询,拓展/继承 ResultMap
1.确定两张表
两张表
desc home
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ADD_ID NOT NULL NUMBER(4)
STREET VARCHAR2(10)
ZIP VARCHAR2(10)
COUNTRY VARCHAR2(10)
SQL> desc teachers
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(9)
NAME VARCHAR2(50)
AGE NUMBER(2)
ADDRESS VARCHAR2(50)
ADD_ID NUMBER(5)
2.两个JavaBean
public class Teacher {
private Integer id;
private String name;
private Integer age;
private String address;
private Home home;
}
/**
* @author Gress
*
* create table home( add_id number(4) primary KEY, street
varchar2(10), zip varchar2(10), country varchar2(10) )
insert into home values(1,'青山','123456','南昌')
alter table teachers add add_id number(5) constraint teacher_add_id_fk
references home(add_id);
*
*/
public class Home {
private Integer add_id;
private String street;
private String zipp;
private String country;
}
3. 在xxxxMap.xml中配置resultMap的配置
<!--property是java对象的熟悉对应着 column数据库中的表 -->
<resultMap type="Teacher" id="TeacherResult">
<id property="id" column="ID" />
<result property="name" column="NAME" />
<result property="age" column="AGE" />
<result property="address" column="ADDRESS" />
</resultMap>
<!-- 继承关系 -->
<resultMap type="Teacher" id="teacherWithAddressResult" extends="TeacherResult">
<result property="home.add_id" column="add_id" />
<result property="home.street" column="street" />
<result property="home.zipp" column="zip" />
<result property="home.country" column="country" />
</resultMap>
4. 查询
<select id="selectteacherHOME" resultMap="teacherWithAddressResult">
select id ,name,age,address,h.add_id ,street,zip,country from
teachers t,home h where t.add_id=h.add_id
</select>
@Test
public void THOME() {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<Teacher> selectList = sqlSession.selectList("com.gog.mappers.TeacherMapper.selectteacherHOME");
for (Teacher teacher : selectList) {
System.out.println(teacher);
}
} catch (Exception e) {
e.printStackTrace();
}
}
5.结果
Teacher [id=5, name=唐, age=18, address=青山流水, home=Address [add_id=1, street=青山, zipp=123456, country=南昌]]
Teacher [id=4, name=宋, age=18, address=青山流水, home=Address [add_id=3, street=德州, zipp=1234456, country=USA]]
Teacher [id=6, name=元, age=18, address=青山流水, home=Address [add_id=2, street=天安门, zipp=123456, country=北京]]
四. mybatis-config.xml 属性顺序
元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"。