打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用 Mapper 接口的方式操作数据库 CRUD
liaoxiaohua
关联元素 association 学习
关联元素用来处理“一对一”的关系(如一个博客有一个用户)。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种加载方式、三种常用表现方式
两种加载方式:
嵌套查询:select: 通过执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活
嵌套结果:resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型
三种常用表现方式:
在本身映射SQL语句中直接嵌套结果。如下面的配置文件将Join的班主任实体Teacher嵌套在班级实例Classes上。需要注意的是Classes实体中必须有Teacher这个属性。
ClassMapperXML
<?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.nantian.mybatis.one2one.ClassesMapper">
<resultMap type="Classes" id="classes">
<id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/>
<association property="teacher" column="c_t_id" javaType="Teacher">
<id property="id" column="t_id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="t_name" javaType="string" jdbcType="VARCHAR"/>
</association>
</resultMap>
<select id="one2one" parameterType="int" resultMap="classes">
select c.c_id,c.c_name,c.c_t_id,t.t_id,t.t_name
from classes c join teacher t on c.c_t_id = t.t_id where c.c_id = #{id}
</select>
</mapper>
2.通过association 结合 resultMap实现。
<association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/>
ClassesMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.myapp.mybatis.ClassesMapper">
<resultMap type="Classes" id="classes">
<id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/>
<association property="teacher" column="c_t_id" javaType="Teacher" resultMap="teacherResultMap"><!--teacherResultmap定义在TeacherMapper.xml中 ->
</association>
</resultMap>
<select id="one2one" parameterType="int" resultMap="classes">
select c.c_id,c.c_name,c.c_t_id,t.t_id,t.t_name
from classes c join teacher t on c.c_t_id = t.t_id where c.c_id = #{id}
</select>
</mapper>
TeacherMapper.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.myapp.mybatis.TeacherMapper"> <resultMap type="TeacherEntity" id="teacherResultMap">
<id property="teacherID" column="TEACHER_ID" />
<result property="teacherName" column="TEACHER_NAME" />
<result property="teacherSex" column="TEACHER_SEX" />
<result property="teacherBirthday" column="TEACHER_BIRTHDAY"/>
<result property="workDate" column="WORK_DATE"/>
<result property="professional" column="PROFESSIONAL"/>
</resultMap>
<select id="getTeacher" parameterType="String" resultMap="teacherResultMap">
SELECT *
FROM TEACHER_TBL TT
WHERE TT.TEACHER_ID = #{teacherID}
</select>
3.accosciation 结合select(嵌套查询)
<association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> <!-- 另一个映射语句的ID 如果是外部配置文件中且ID不唯一的则需要指定全路径如select="com.myapp.mybatis.Teacher.getTeacher"-->
修改上面的ClassesMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.myapp.mybatis.ClassesMapper">
<resultMap type="Classes" id="classes">
<id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/>        <!--getTeacher定义在TeacherMapper.xml中  -->
<association property="teacher" column="c_t_id" javaType="Teacher" select="getTeacher"></association>
</resultMap>
<select id="one2one" parameterType="int" resultMap="classes">
select c.c_id,c.c_name,c.c_t_id,t.t_id,t.t_name
from classes c join teacher t on c.c_t_id = t.t_id where c.c_id = #{id}
</select>
</mapper>
Classes实体
package com.myapp.mybatis.one2one;
public class Classes {
private int id;
private String name;
private Teacher teacher;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
Teacher实体
package com.myapp.mybatis.one2one;
public class Teacher {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ClassesMapper类
public interface ClassesMapper {
public Classes one2one(int id);
}
属性  描述
property:
映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称的字段。
这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一 些 东 西 :“ username ”, 或 者 映 射 到 一 些 复 杂 的 东 西 “address.street.number”。
column :
来 自 数 据 库 的 类 名 , 或 重 命 名 的 列 标 签 。 这 和 通 常 传 递 给resultSet.getString(columnName)方法的字符串是相同的。
注 意 : 要 处 理 复 合 主 键 , 你 可 以 指 定 多 个 列 名 通 过   column= ”{prop1=col1,prop2=col2} ” 这种语法来传递给嵌套查询语 句。这会引起
prop1 和 prop2 以参数对象形式来设置给目标嵌套查询语句。
javaType :
一个 Java 类的完全限定名,或一个类型别名(参加上面内建类型别名的列表)。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证所需的行为。
jdbcType:
在这个表格之前的所支持的 JDBC 类型列表中的类型。JDBC 类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC 的需要,
而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定这个类型-但仅仅对可能为空的值。
typeHandler:
我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。
select:
另外一个映射语句的 ID,可以加载这个属性映射需要的复杂类型。获取的在列属性中指定的列的值将被传递给目标 select  语句作为参数。后面
有一个详细的示例。 注 意 : 要 处 理 复 合 主 键 , 你 可 以 指 定 多 个 列 名 通 过   column= ”{prop1=col1,prop2=col2} ” 这种语法来传递给嵌套查询语 句。这会引起prop1 和 prop2 以参数对象形式来设置给目标嵌套查询语句。
resultMap:
这是结果映射的 ID,可以映射关联的嵌套结果到一个合适的对象图中。这是一种替代方法来调用另外一个查询语句。这允许你联合多个表来合成到一个单独的结果集。这样的结果集可能包含重复,数据的重复组需要被分解,合理映射到一个嵌套的对象图。为了使它变得容易,MyBatis 让你“链接”结果映射,来处理嵌套结果。
posted @ 2011-09-01 12:58 liaoxiaohua 阅读(171) 评论(0) 编辑
简单查询
定义Users
package com.myapp.mybatis.model;
public class Users {
private int id;
private String name;
private int age;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
2. 定义UsersMapper
package com.myapp.mybatis.model;
public interface UsersMapper {
public Users selectUsers(int id);
public void insertUsers(Users users);
public Users selectUser(int id);
}
3.定义UserMapper.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.myapp.mybatis.model.UsersMapper">
<resultMap type="Users" id="user"> <!--此结果集只将id,name,sex值对应到Users对象属性中-->
<id property="id" column="id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
<result property="sex" column="sex" javaType="string" jdbcType="VARCHAR"/>
</resultMap>
<!-- 查询单一对象所有属性 -->
<select id="selectUsers" parameterType="int" resultType="Users"> <!--返回Users对象,对象所有的属性都将有对应值-->
select id,name,age,sex from users where id = #{id}
</select>
<!-- 选择查询单一对象属性 -->
<select id="selectUser" parameterType="int" resultMap="user"> <!-- 对应resultMap type="Users" id="user" 的Map user 该Map为Users对象但只有id,name,sex属性有对应值-->   select id,name,sex from users where id = #{id}
</select>
<!-- 主键自增插入mysql -->
<insert id="insertUsersMysql" parameterType="Users">
insert into users values(null,#{name},#{age},#{sex})
</insert>
<!-- 主键自增插入oracle -->
<insert id="insertUsers" parameterType="Users">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select seq_users.nextval from dual
</selectKey>
insert into users values(#{id},#{name},#{age},#{sex})
</insert>
</mapper>
4.定义configuration.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>
<typeAliases>
<typeAlias alias="Users" type="com.myapp.mybatis.model.Users"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/nantian/mybatis/model/UsersMapper.xml"/>
</mappers>
</configuration>
4.定义DBUtil(用于读取SqlSession)
package com.myapp.mybatis.data;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DBUtil {
private static final DBUtil dbUtil = new DBUtil();
private SqlSessionFactory sqlSessionFactory = null;
private DBUtil() {
try {
String resource = "com/nantian/mybatis/data/configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static DBUtil getInstance() {
return dbUtil;
}
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
5.Test 用于测试
package com.myapp.mybatis.test;
import junit.framework.TestCase;
import org.apache.ibatis.session.SqlSession;
import com.myapp.mybatis.data.DBUtil;
import com.myapp.mybatis.model.Users;
import com.myapp.mybatis.model.UsersMapper;
public class Test extends TestCase {
public void selectUser() {
SqlSession sqlSession = DBUtil.getInstance().getSqlSessionFactory()
.openSession();
try {
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users user = usersMapper.selectUser(3);
System.out.println(user.getId());
System.out.println(user.getName());
System.out.println(user.getAge());
System.out.println(user.getSex());
} finally {
sqlSession.close();
}
}
public void selectUsers() {
SqlSession sqlSession = DBUtil.getInstance().getSqlSessionFactory()
.openSession();
try {
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users users = usersMapper.selectUsers(1);
System.out.println(users.getId());
System.out.println(users.getName());
System.out.println(users.getAge());
System.out.println(users.getSex());
} finally {
sqlSession.close();
}
}
public void insertUsers() {
SqlSession sqlSession = DBUtil.getInstance().getSqlSessionFactory()
.openSession();
try {
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users users = new Users();
users.setName("王五");
users.setAge(32);
users.setSex("神");
usersMapper.insertUsers(users);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SQL语句映射文件(1)resultMap
mybatis 一对多,多对一配置
MyBatis一对多和多对一
mybatis知识点总结
Mybatis关联查询之一对多和多对一XML配置详解
Mybatis XML 文件的学习详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服