设为首页 收藏本站
查看: 1283|回复: 0

[经验分享] MyBatis (转载)

[复制链接]

尚未签到

发表于 2016-11-24 04:12:48 | 显示全部楼层 |阅读模式
一、MyBatis简介与配置MyBatis+Spring+MySql

1.1MyBatis简介

      MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis
摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO
到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis
是一种“半自动化”的ORM实现。

需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(与Spring结合包)。
下载地址:
http://ibatis.apache.org/tools/ibator

http://code.google.com/p/mybatis/

 

1.2MyBatis+Spring+MySql简单配置

1.2.1搭建Spring环境

1,建立maven的web项目;

2,加入Spring框架、配置文件;

3,在pom.xml中加入所需要的jar包(spring框架的、mybatis、mybatis-spring、junit等);

4,更改web.xml和spring的配置文件;

5,添加一个jsp页面和对应的Controller;

6,测试。
可参照:http://limingnihao.javaeye.com/blog/830409
使用Eclipse的Maven构建SpringMVC项目






1.2.2建立MySql数据库


建立一个学生选课管理数据库。

表:学生表、班级表、教师表、课程表、学生选课表。

逻辑关系:每个学生有一个班级;每个班级对应一个班主任教师;每个教师只能当一个班的班主任;
使用下面的sql进行建数据库,先建立学生表,插入数据(2条以上)。
更多sql请下载项目源文件,在resource/sql中。

Sql代码





  • /* 建立数据库 */  


  • CREATE
     
    DATABASE
     STUDENT_MANAGER;  


  • USE STUDENT_MANAGER;  

  •   

  • /***** 建立student表 *****/  

  • CREATE
     
    TABLE
     STUDENT_TBL  


  • (  

  •    STUDENT_ID         VARCHAR
    (255) 
    PRIMARY
     
    KEY
    ,  


  •    STUDENT_NAME       VARCHAR
    (10) 
    NOT
     
    NULL
    ,  


  •    STUDENT_SEX        VARCHAR
    (10),  


  •    STUDENT_BIRTHDAY   DATE
    ,  


  •    CLASS_ID           VARCHAR
    (255)  


  • );  

  •   

  • /*插入学生数据*/  

  • INSERT
     
    INTO
     STUDENT_TBL (STUDENT_ID,  


  •                          STUDENT_NAME,  

  •                          STUDENT_SEX,  

  •                          STUDENT_BIRTHDAY,  

  •                          CLASS_ID)  

  •   VALUES
       (123456,  


  •             '某某某'
    ,  


  •             '女'
    ,  


  •             '1980-08-01'
    ,  


  •             121546  

  •             )  



/* 建立数据库 */
CREATE DATABASE STUDENT_MANAGER;
USE STUDENT_MANAGER;
/***** 建立student表 *****/
CREATE TABLE STUDENT_TBL
(
STUDENT_ID         VARCHAR(255) PRIMARY KEY,
STUDENT_NAME       VARCHAR(10) NOT NULL,
STUDENT_SEX        VARCHAR(10),
STUDENT_BIRTHDAY   DATE,
CLASS_ID           VARCHAR(255)
);
/*插入学生数据*/
INSERT INTO STUDENT_TBL (STUDENT_ID,
STUDENT_NAME,
STUDENT_SEX,
STUDENT_BIRTHDAY,
CLASS_ID)
VALUES   (123456,
'某某某',
'女',
'1980-08-01',
121546
)

  

创建连接MySql使用的配置文件mysql.properties。

Mysql.properties代码





  • jdbc.driverClassName=com.mysql.jdbc.Driver  


  • jdbc.url=jdbc:mysql://localhost:3306
    /student_manager?user=root&password=limingnihao&useUnicode=true&characterEncoding=UTF-
    8
      




jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student_manager?user=root&password=limingnihao&useUnicode=true&characterEncoding=UTF-8


1.2.3搭建MyBatis环境

顺序随便,现在的顺序是因为可以尽量的少的修改写好的文件。




1.2.3.1创建实体类: StudentEntity


Java代码





  • public
     
    class
     StudentEntity 
    implements
     Serializable {  


  •   

  •     private
     
    static
     
    final
     
    long
     serialVersionUID = 3096154202413606831L;  


  •     private
     ClassEntity classEntity;  


  •     private
     Date studentBirthday;  


  •     private
     String studentID;  


  •     private
     String studentName;  


  •     private
     String studentSex;  


  •       

  •     public
     ClassEntity getClassEntity() {  


  •         return
     classEntity;  


  •     }  

  •   

  •     public
     Date getStudentBirthday() {  


  •         return
     studentBirthday;  


  •     }  

  •   

  •     public
     String getStudentID() {  


  •         return
     studentID;  


  •     }  

  •   

  •     public
     String getStudentName() {  


  •         return
     studentName;  


  •     }  

  •   

  •     public
     String getStudentSex() {  


  •         return
     studentSex;  


  •     }  

  •   

  •     public
     
    void
     setClassEntity(ClassEntity classEntity) {  


  •         this
    .classEntity = classEntity;  


  •     }  

  •   

  •     public
     
    void
     setStudentBirthday(Date studentBirthday) {  


  •         this
    .studentBirthday = studentBirthday;  


  •     }  

  •   

  •     public
     
    void
     setStudentID(String studentID) {  


  •         this
    .studentID = studentID;  


  •     }  

  •   

  •     public
     
    void
     setStudentName(String studentName) {  


  •         this
    .studentName = studentName;  


  •     }  

  •   

  •     public
     
    void
     setStudentSex(String studentSex) {  


  •         this
    .studentSex = studentSex;  


  •     }  

  • }  



public class StudentEntity implements Serializable {
private static final long serialVersionUID = 3096154202413606831L;
private ClassEntity classEntity;
private Date studentBirthday;
private String studentID;
private String studentName;
private String studentSex;
public ClassEntity getClassEntity() {
return classEntity;
}
public Date getStudentBirthday() {
return studentBirthday;
}
public String getStudentID() {
return studentID;
}
public String getStudentName() {
return studentName;
}
public String getStudentSex() {
return studentSex;
}
public void setClassEntity(ClassEntity classEntity) {
this.classEntity = classEntity;
}
public void setStudentBirthday(Date studentBirthday) {
this.studentBirthday = studentBirthday;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
}


1.2.3.2创建数据访问接口

Student类对应的dao接口:StudentMapper。

Java代码





  • public
     
    interface
     StudentMapper {  


  •       

  •     public
     StudentEntity getStudent(String studentID);  


  •       

  •     public
     StudentEntity getStudentAndClass(String studentID);  


  •       

  •     public
     List<StudentEntity> getStudentAll();  


  •       

  •     public
     
    void
     insertStudent(StudentEntity entity);  


  •       

  •     public
     
    void
     deleteStudent(StudentEntity entity);  


  •       

  •     public
     
    void
     updateStudent(StudentEntity entity);  


  • }  



public interface StudentMapper {
public StudentEntity getStudent(String studentID);
public StudentEntity getStudentAndClass(String studentID);
public List<StudentEntity> getStudentAll();
public void insertStudent(StudentEntity entity);
public void deleteStudent(StudentEntity entity);
public void updateStudent(StudentEntity entity);
}





1.2.3.3创建SQL映射语句文件




Student类的sql语句文件StudentMapper.xml

resultMap标签:表字段与属性的映射。

Select标签:查询sql。

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.manager.data.StudentMapper"
    >
      


  •   

  •     <
    resultMap
     
    type
    =
    "StudentEntity"
     
    id
    =
    "studentResultMap"
    >
      


  •         <
    id
     
    property
    =
    "studentID"
     
    column
    =
    "STUDENT_ID"
    />
      


  •         <
    result
     
    property
    =
    "studentName"
     
    column
    =
    "STUDENT_NAME"
    />
      


  •         <
    result
     
    property
    =
    "studentSex"
     
    column
    =
    "STUDENT_SEX"
    />
      


  •         <
    result
     
    property
    =
    "studentBirthday"
     
    column
    =
    "STUDENT_BIRTHDAY"
    />
      


  •     </
    resultMap
    >
      


  •       

  •     <!-- 查询学生,根据id -->
      


  •     <
    select
     
    id
    =
    "getStudent"
     
    parameterType
    =
    "String"
     
    resultType
    =
    "StudentEntity"
     
    resultMap
    =
    "studentResultMap"
    >
      


  •         <![CDATA[
     

  •             SELECT * from STUDENT_TBL ST
     

  •                 WHERE ST.STUDENT_ID = #{studentID} 
     

  •         ]]>
       


  •     </
    select
    >
      


  •       

  •     <!-- 查询学生列表 -->
      


  •     <
    select
     
    id
    =
    "getStudentAll"
      
    resultType
    =
    "com.manager.data.model.StudentEntity"
     
    resultMap
    =
    "studentResultMap"
    >
      


  •         <![CDATA[
     

  •             SELECT * from STUDENT_TBL
     

  •         ]]>
       


  •     </
    select
    >
      


  •       

  • </
    mapper
    >
      




<?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.manager.data.StudentMapper">
<resultMap type="StudentEntity" id="studentResultMap">
<id property="studentID" column="STUDENT_ID"/>
<result property="studentName" column="STUDENT_NAME"/>
<result property="studentSex" column="STUDENT_SEX"/>
<result property="studentBirthday" column="STUDENT_BIRTHDAY"/>
</resultMap>
<!-- 查询学生,根据id -->
<select id="getStudent" parameterType="String" resultType="StudentEntity" resultMap="studentResultMap">
<![CDATA[
SELECT * from STUDENT_TBL ST
WHERE ST.STUDENT_ID = #{studentID}
]]>
</select>
<!-- 查询学生列表 -->
<select id="getStudentAll"  resultType="com.manager.data.model.StudentEntity" resultMap="studentResultMap">
<![CDATA[
SELECT * from STUDENT_TBL
]]>
</select>
</mapper>





1.2.3.4创建MyBatis的mapper配置文件


在src/main/resource中创建MyBatis配置文件:mybatis-config.xml。

typeAliases标签:给类起一个别名。com.manager.data.model.StudentEntity类,可以使用StudentEntity代替。

Mappers标签:加载MyBatis中实体类的SQL映射语句文件。
 

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
    =
    "StudentEntity"
     
    type
    =
    "com.manager.data.model.StudentEntity"
    />
      


  •     </
    typeAliases
    >
      


  •     <
    mappers
    >
      


  •         <
    mapper
     
    resource
    =
    "com/manager/data/maps/StudentMapper.xml"
     
    />
      


  •     </
    mappers
    >
      


  • </
    configuration
    >
        




<?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="StudentEntity" type="com.manager.data.model.StudentEntity"/>
</typeAliases>
<mappers>
<mapper resource="com/manager/data/maps/StudentMapper.xml" />
</mappers>
</configuration>





1.2.3.5修改Spring 的配置文件


主要是添加SqlSession的制作工厂类的bean:SqlSessionFactoryBean,(在mybatis.spring包中)。需要指定配置文件位置和dataSource。

和数据访问接口对应的实现bean。通过MapperFactoryBean创建出来。需要执行接口类全称和SqlSession工厂bean的引用。

Xml代码





  • <!-- 导入属性配置文件 -->
      


  • <
    context:property-placeholder
     
    location
    =
    "classpath:mysql.properties"
     
    />
      


  •   

  • <
    bean
     
    id
    =
    "dataSource"
     
    class
    =
    "org.springframework.jdbc.datasource.DriverManagerDataSource"
    >
      


  •     <
    property
     
    name
    =
    "driverClassName"
     
    value
    =
    "${jdbc.driverClassName}"
     
    />
      


  •     <
    property
     
    name
    =
    "url"
     
    value
    =
    "${jdbc.url}"
     
    />
      


  • </
    bean
    >
      


  •   

  • <
    bean
     
    id
    =
    "transactionManager"
     
    class
    =
    "org.springframework.jdbc.datasource.DataSourceTransactionManager"
    >
      


  •     <
    property
     
    name
    =
    "dataSource"
     
    ref
    =
    "dataSource"
     
    />
      


  • </
    bean
    >
      


  •   

  • <
    bean
     
    id
    =
    "sqlSessionFactory"
     
    class
    =
    "org.mybatis.spring.SqlSessionFactoryBean"
    >
      


  •     <
    property
     
    name
    =
    "configLocation"
     
    value
    =
    "classpath:mybatis-config.xml"
     
    />
      


  •     <
    property
     
    name
    =
    "dataSource"
     
    ref
    =
    "dataSource"
     
    />
      


  • </
    bean
    >
      


  •   

  • <!— mapper bean -->
      


  • <
    bean
     
    id
    =
    "studentMapper"
     
    class
    =
    "org.mybatis.spring.MapperFactoryBean"
    >
      


  •     <
    property
     
    name
    =
    "mapperInterface"
     
    value
    =
    "com.manager.data.StudentMapper"
     
    />
      


  •     <
    property
     
    name
    =
    "sqlSessionFactory"
     
    ref
    =
    "sqlSessionFactory"
     
    />
      


  • </
    bean
    >
      




<!-- 导入属性配置文件 -->
<context:property-placeholder location="classpath:mysql.properties" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!— mapper bean -->
<bean id="studentMapper" class="org.mybatis.spring.MapperFactoryBean">
<property name="mapperInterface" value="com.manager.data.StudentMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>


1.2.4测试StudentMapper
  使用SpringMVC测试,创建一个TestController,配置tomcat,访问index.do页面进行测试:

Java代码





  • @Controller
      


  • public
     
    class
     TestController {  


  •   

  •     @Autowired
      


  •     private
     StudentMapper studentMapper;  


  •       

  •     @RequestMapping
    (value = 
    "index.do"
    )  


  •     public
     
    void
     indexPage() {     


  •         StudentEntity entity = studentMapper.getStudent("10000013"
    );  


  •         System.out.println("name:"
     + entity.getStudentName());  


  •     }     

  • }  



@Controller
public class TestController {
@Autowired
private StudentMapper studentMapper;
@RequestMapping(value = "index.do")
public void indexPage() {
StudentEntity entity = studentMapper.getStudent("10000013");
System.out.println("name:" + entity.getStudentName());
}
}

  使用Junit测试:

Java代码





  • 使用Junit测试:  


  • Java代码  

  • @RunWith
    (value = SpringJUnit4ClassRunner.
    class
    )  


  • @ContextConfiguration
    (value = 
    "test-servlet.xml"
    )  


  • public
     
    class
     StudentMapperTest {  


  •       

  •     @Autowired
      


  •     private
     ClassMapper classMapper;  


  •       

  •     @Autowired
      


  •     private
     StudentMapper studentMapper;  


  •       

  •     @Transactional
      


  •     public
     
    void
     getStudentTest(){  


  •         StudentEntity entity = studentMapper.getStudent("10000013"
    );  


  •         System.out.println(""
     + entity.getStudentID() + entity.getStudentName());  


  •           

  •         List<StudentEntity> studentList = studentMapper.getStudentAll();  

  •         for
    ( StudentEntity entityTemp : studentList){  


  •             System.out.println(entityTemp.getStudentName());  

  •         }  

  •           

  •     }  

  • }  



使用Junit测试:
Java代码
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "test-servlet.xml")
public class StudentMapperTest {
@Autowired
private ClassMapper classMapper;
@Autowired
private StudentMapper studentMapper;
@Transactional
public void getStudentTest(){
StudentEntity entity = studentMapper.getStudent("10000013");
System.out.println("" + entity.getStudentID() + entity.getStudentName());
List<StudentEntity> studentList = studentMapper.getStudentAll();
for( StudentEntity entityTemp : studentList){
System.out.println(entityTemp.getStudentName());
}
}
}

  更详细的功能源代码http://limingnihao.javaeye.com/admin/blogs/782190
页面最下面;

二、SQL语句映射文件(1)resultMap

SQL 映射XML
文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如:

Xml代码





  • <
    mappers
    >
      


  •     <
    mapper
     
    resource
    =
    "com/liming/manager/data/mappers/UserMapper.xml"
     
    />
      


  •     <
    mapper
     
    resource
    =
    "com/liming/manager/data/mappers/StudentMapper.xml"
     
    />
      


  •     <
    mapper
     
    resource
    =
    "com/liming/manager/data/mappers/ClassMapper.xml"
     
    />
      


  •     <
    mapper
     
    resource
    =
    "com/liming/manager/data/mappers/TeacherMapper.xml"
     
    />
      


  • </
    mappers
    >
      




<mappers>
<mapper resource="com/liming/manager/data/mappers/UserMapper.xml" />
<mapper resource="com/liming/manager/data/mappers/StudentMapper.xml" />
<mapper resource="com/liming/manager/data/mappers/ClassMapper.xml" />
<mapper resource="com/liming/manager/data/mappers/TeacherMapper.xml" />
</mappers>



SQL 映射XML 文件一些初级的元素:


1. cache – 配置给定模式的缓存

2. cache-ref –
从别的模式中引用一个缓存

3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象

4. sql –
一个可以被其他语句复用的SQL 块

5. insert – 映射INSERT 语句

6. update – 映射UPDATE
语句

7. delete – 映射DELEETE 语句

8. select  -  映射SELECT语句
 




2.1 resultMap


        resultMap 是MyBatis
中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC
不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,可能要上千行的代码。ResultMaps
的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的。
resultMap属性:type为java实体类;id为此resultMap的标识。
 
 resultMap可以设置的映射:


1. constructor – 用来将结果反射给一个实例化好的类的构造器
a) idArg – ID 参数;将结果集标记为ID,以方便全局调用

b) arg
–反射到构造器的通常结果


2. id – ID 结果,将结果集标记为ID,以方便全局调用


3. result – 反射到JavaBean 属性的普通结果


4. association – 复杂类型的结合;多个结果合成的类型
a) nested result mappings – 几resultMap
自身嵌套关联,也可以引用到一个其它上


5. collection –复杂类型集合a collection of complex
types


6. nested result mappings – resultMap
的集合,也可以引用到一个其它上


7. discriminator – 使用一个结果值以决定使用哪个resultMap
a) case – 基本一些值的结果映射的case 情形
i. nested result mappings –一个case
情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。
 
 

2.1.1 id、result

id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。

  最简单的例子:

Xml代码





  • <
    resultMap
     
    type
    =
    "StudentEntity"
     
    id
    =
    "studentResultMap"
    >
      


  •     <
    id
     
    property
    =
    "studentID"
     
    column
    =
    "STUDENT_ID"
    />
      


  •     <
    result
     
    property
    =
    "studentName"
     
    column
    =
    "STUDENT_NAME"
    />
      


  •     <
    result
     
    property
    =
    "studentSex"
     
    column
    =
    "STUDENT_SEX"
    />
      


  •     <
    result
     
    property
    =
    "studentBirthday"
     
    column
    =
    "STUDENT_BIRTHDAY"
    />
      


  • </
    resultMap
    >
      




<resultMap type="StudentEntity" id="studentResultMap">
<id property="studentID" column="STUDENT_ID"/>
<result property="studentName" column="STUDENT_NAME"/>
<result property="studentSex" column="STUDENT_SEX"/>
<result property="studentBirthday" column="STUDENT_BIRTHDAY"/>
</resultMap>

 
 
id、result语句属性配置细节:


属性




描述




 




property





需要映射到
JavaBean


的属性名称。




 




column





数据表的列名或者标签别名。




 




javaType





一个完整的类名,或者是一个类型别名。如果你匹配的是一个
JavaBean

,那
MyBatis


通常会自行检测到。然后,如果你是要映射到一个
HashMap

,那你需要指定
javaType


要达到的目的。




 




jdbcType





数据表支持的类型列表。这个属性只在
insert,update



delete


的时候针对允许空的列有用。
JDBC

需要这项,但
MyBatis


不需要。如果你是直接针对
JDBC


编码,且有允许空的列,而你要指定这项。




 




typeHandler





使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。




 



支持的JDBC类型

       为了将来的引用,MyBatis 支持下列JDBC
类型,通过JdbcType
枚举:

BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR

2.1.2 constructor



       
我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。

       
使用construcotr功能有限(例如使用collection级联查询)。

        上面使用id、result实现的功能就可以改为:

Xml代码





  • <
    resultMap
     
    type
    =
    "StudentEntity"
     
    id
    =
    "studentResultMap"
     
    >
      


  •     <
    constructor
    >
      


  •         <
    idArg
     
    javaType
    =
    "String"
     
    column
    =
    "STUDENT_ID"
    />
      


  •         <
    arg
     
    javaType
    =
    "String"
     
    column
    =
    "STUDENT_NAME"
    />
      


  •         <
    arg
     
    javaType
    =
    "String"
     
    column
    =
    "STUDENT_SEX"
    />
      


  •         <
    arg
     
    javaType
    =
    "Date"
     
    column
    =
    "STUDENT_BIRTHDAY"
    />
      


  •     </
    constructor
    >
      


  • </
    resultMap
    >
      




<resultMap type="StudentEntity" id="studentResultMap" >
<constructor>
<idArg javaType="String" column="STUDENT_ID"/>
<arg javaType="String" column="STUDENT_NAME"/>
<arg javaType="String" column="STUDENT_SEX"/>
<arg javaType="Date" column="STUDENT_BIRTHDAY"/>
</constructor>
</resultMap>

        当然,我们需要定义StudentEntity实体类的构造方法:

Java代码





  • public
     StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){  


  •     this
    .studentID = studentID;  


  •     this
    .studentName = studentName;  


  •     this
    .studentSex = studentSex;  


  •     this
    .studentBirthday = studentBirthday;  


  • }  



public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){
this.studentID = studentID;
this.studentName = studentName;
this.studentSex = studentSex;
this.studentBirthday = studentBirthday;
}


2.1.3 association联合

联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis
自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。

不同情况需要告诉MyBatis
如何加载一个联合。MyBatis 可以用两种方式加载:
1. select: 执行一个其它映射的SQL
语句返回一个Java实体类型。较灵活;

2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
 
例如,一个班级对应一个班主任。

 首先定义好班级中的班主任属性:

Java代码





  • private
     TeacherEntity teacherEntity;  




private TeacherEntity teacherEntity;

2.1.3.1使用select实现联合

 例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。
 这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。


 ClassMapper.xml文件部分内容:

Xml代码





  • <
    resultMap
     
    type
    =
    "ClassEntity"
     
    id
    =
    "classResultMap"
    >
      


  •     <
    id
     
    property
    =
    "classID"
     
    column
    =
    "CLASS_ID"
     
    />
      


  •     <
    result
     
    property
    =
    "className"
     
    column
    =
    "CLASS_NAME"
     
    />
      


  •     <
    result
     
    property
    =
    "classYear"
     
    column
    =
    "CLASS_YEAR"
     
    />
      


  •     <
    association
     
    property
    =
    "teacherEntity"
     
    column
    =
    "TEACHER_ID"
     
    select
    =
    "getTeacher"
    />
      


  • </
    resultMap
    >
      


  •   

  • <
    select
     
    id
    =
    "getClassByID"
     
    parameterType
    =
    "String"
     
    resultMap
    =
    "classResultMap"
    >
      


  •     SELECT * FROM CLASS_TBL CT  

  •     WHERE CT.CLASS_ID
     = #{classID};  


  • </
    select
    >
      




<resultMap type="ClassEntity" id="classResultMap">
<id property="classID" column="CLASS_ID" />
<result property="className" column="CLASS_NAME" />
<result property="classYear" column="CLASS_YEAR" />
<association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/>
</resultMap>
<select id="getClassByID" parameterType="String" resultMap="classResultMap">
SELECT * FROM CLASS_TBL CT
WHERE CT.CLASS_ID = #{classID};
</select>

 TeacherMapper.xml文件部分内容:

Xml代码





<
resultMap
 
type
=<

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304510-1-1.html 上篇帖子: 集成Mybatis 下篇帖子: MyBatis(一)、MyBatis介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表