mybatis (一)

来源:互联网 发布:大数据技术无疑是当前 编辑:程序博客网 时间:2024/06/08 09:15

一. 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?)"。

0 0
原创粉丝点击