ORM这个词对于很多做J2EE开发的人来讲,并不陌生,如Hibernate,但是在使用Hibernate时,你会有一个很大的感受是什么呢?那就是关联映射这个东东不太好弄,还有级联的设置,导致在公司中,其实很用Hibernate并不是太多,所以才有Mybatis这个半ORM框架,何为半ORM框架,就是它一半是使用sql来写的,但是最终的结果是对象,这个神奇吧。而且不像网上一大堆例子,Mybatis中写了一些resutlMap之类的东东,其实,只要你sql写对了,直接可以用在Mybatis上面,根本不用写其它的内容。下面以一个例子来讲解关联的例子,我有学生表(student)和课程表(course)。
1.实体类
Student.java:对应于数据库表的实体类
public class Student {
private int id;
private String student_name;
private int course_id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public int getCourse_id() {
return course_id;
}
public void setCourse_id(int course_id) {
this.course_id = course_id;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id+","+this.student_name+","+this.course_id;
}
}
Course.java:对应数据库表的实体类
public class Course {
private int id;
private String course_name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCourse_name() {
return course_name;
}
public void setCourse_name(String course_name) {
this.course_name = course_name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id+","+this.course_name;
}
}
SC.java:对应于一个关联查询结果类,在后面的查询语句中体现出来
public class SC {
private int id;
private String student_name;
private String course_name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public String getCourse_name() {
return course_name;
}
public void setCourse_name(String course_name) {
this.course_name = course_name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.student_name+","+this.course_name;
}
}
2.conf.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/gaofulai" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册userMapper.xml文件,
userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
<mapper resource="com/mapper/studentMapper.xml"/>
<mapper resource="com/mapper/courseMapper.xml"/>
</mappers>
</configuration>
3.studentMapper.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">
<mapper namespace="com.mapper.studentMapper">
<select id="getStudent" parameterType="int"
resultType="com.domain.Student">
select * from student where id=#{id}
</select>
<select id="getStudentAndCourse" parameterType="int"
resultType="com.domain.SC">
select s.id, s.student_name, c.course_name from student s, course c where s.course_id=c.id and s.id=#{id}
</select>
</mapper>
4.测试
public class Test {
public static void main(String args[]){
String resource = "conf.xml";
InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
String statement = "com.mapper.studentMapper.getStudentAndCourse";//映射sql的标识字符串
//执行查询返回一个唯一学生-课程对象的sql
SC sc = session.selectOne(statement, 1000);
System.out.println(sc);
}
}