我们知道在mybatis框架中,config.xml中会关联到许多的XxxxMapper的xml文件,这些文件又对应着一个个的接口,来观察下这些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.briup.mappers.StudentMapper">
 
首先是如何执行sql语句
<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,PHONE) VALUES(#{studId},#{name},#{email},#{phone})
</insert>
ID属性为insertStudent,可以在当前xml文件中的名空间 com.briup.mappers.StudentMapper.insertStudent中唯一标识该sql语句。parameterType 属性是一个完全限定类名或者是一个类型别名alias。
可以如下调用这个sql语句:
  int count =  sqlSession.insert("com.briup.mappers.StudentMapper.insertStudent", student); 
sqlSession.insert() 方法返回执行 INSERT 语句后所影响的行数。
或者使用映射接口Mapper来调用:
        public interface Student Mapper{
int insertStudent(Student student);
}
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int count = mapper.insertStudent(student);
 
INSERT插入,(自动生成主键)
在INSERT语句中,可以自动生成主键列 STUD_ID 的值。
使用useGeneratedKeys和keyProperty属性让数据库生成auto_increment列的值,并将生成的值设置到其中一个输入对象属性内,如下所示:
    <insert id="insertStudent2" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">
INSERT INTO STUDENTS(NAME, EMAIL, PHONE) VALUES(#{name},#{email},#{phone})
</insert>
这里STUD_ID列值将会被数据库自动生成(如mysql),并且生成的值会被设置到student对象的studId属性上
注意:
        有些数据库,如oracle,并不支持AUTO_INCREMENT列,但是oracle中可以使用序列来生成主键值。
        例如:使用序列my_seq来生成SUTD_ID主键值。使用如下代码来生成主键:
        drop sequence my_seq;
        create sequence my_seq; 
    <insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT my_seq.nextval FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>
这里使用了<selectKey>标签来获取主键值,并将值保存到Student对象的studId 属性上。属性order="before" 表示,MyBatis将取得序列的下一个值作为主键值,并且在执行INSERT语句之前将值设置到studId属性上。
 
update and delete
    <update id="updateStudent" parameterType="Student">
UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, PHONE=#{phone}
WHERE STUD_ID=#{studId}
</update>
<delete id="deleteStudent" parameterType="int">
DELETE FROM STUDENTS WHERE STUD_ID=#{id}
</delete>
注意:在insert updata delete 标签中都没有resultType这种属性,但是并不能说使用这三种SQL语句对应的方法就没有返回值 ,我们可以在接口中为这三种方法添加int类型的参数,返回的是一个int类型的值,这个值表示SQL语句执行后影响的行数。
 
SELECT 查询语句
        MyBatis真正强大的功能,在于映射SELECT查询结果到java的各种类型上。说到查询,就不能不提映射结果集,有一对一映射,一对多映射,多对多映射。
        一个简单的select查询配置,如下所示:
    <select id="findStudentById" parameterType="int"
resultType="Student">
SELECT STUD_ID, NAME, EMAIL, PHONE
FROM STUDENTS
<!--这里的#{}中的值,如果传的是myBatis中封装的类型,比如int,Integer,那么这里的#{}中的值是做形参,命名不限-->
<!--如果是pojo类型的参数传入另当别论-->
WHERE STUD_ID=#{studId}
</select>
 像这样写存在一个问题,在Student类型中如果没有STUD_ID属性与查询出来的值对应,我们可以给这个列起个别名,如果自己封装了resultMap那就另说
SELECT STUD_ID AS STUDID, NAME, EMAIL, PHONE  FROM STUDENTS  WHERE STUD_ID=#{studId} 
 
MyBatis执行返回多条结果的SELECT语句查询
如下所示:
    <select id="findAllStudents" resultType="Student">
SELECT STUD_ID AS studId, NAME,EMAIL, PHONE
FROM STUDENTS
</select>
注意:在这里虽然返回值仍然写的是Student 但是结果集是个List<Student>类型的集合,mybatis会将查询到的结果集中的数据,一条条封装成Student对象,再将这一个个Student对象存入集合中返回
 
注意,除了List集合类型,也可以使用其他类型的集合类,如Set,Map等。
       
   MyBatis会根据集合的类型,采用适当的集合实现,如下所示:
 
        对于List,Collection,Iterable类型,
            MyBatis将返回java.util.ArrayList 
            如果查询出多个条数据,resultType指定封装的类型,那么可以直接将方法的返回值声明为list集合接收
        
  对于Map类型,
            MyBatis 将返回java.util.HashMap 
            这里注意是返回一个键值对,还是多个键值对
            一个键值对---查询出一条数据:列名做K,值做V,如果查出了多个属性,就在map中存放了多个K-V对
            返回值声明为HashMap集合接收
            
            多个键值对---查询出多条数据:可以使用List<HashMap<K,V>>存放,一条数据对应一个HashMap
            返回值声明为List<HashMap<K,V>>集合接收
        
        对于Set类型,
            MyBatis 将返回java.util.HashSet 
 
        对于SortedSet类型
            MyBatis将返回java.util.TreeSet -->
 
结果集映射 resultMap
        resultMap被用来将SELECT语句的结果集映射到java对象的属性中。
        
        在映射文件中,可以先定义出结果集映射resultMap,然后在一些SELECT语句上引用这个resultMap。
     
        MyBatis的结果集映射resultMap非常强大,可以使用它指定sql查询出的结果集,会被怎么处理并封装成对象,也可以使用它完成复杂查询的映射,例如一对一、一对多关系的SELECT语句。
 
        resultMap标签中的属性:
        id  属性值在当前名空间内是唯一的。
        type属性值是指定封装成的类型的全限定名或者是别名。这个属性要和方法的返回值相同
 
<resultMap id="StudentResult" type="com.briup.pojo.Student">
   <!--<id>子标签和<result>标签功能相同,但是<id>用来映射的是表中的主键。-->
 <id property="studId" column="stud_id" />
<!-- <result>子标签用来将一个resultset列映射到对象的一个属性中。-->
<result property="name" column="name" />
<result property="email" column="email" />
<result property="phone" column="phone" />
</resultMap>
注意1,在<select>标签中,使用的是resultMap属性,而不是resultType属性。
        当<select>标签中配置了resutlMap属性,MyBatis会根据resutlMap标签中定义的列名与对象属性名的 【对应关系】 来自动填充对象中的属性值。
        
 注意2,resultType和resultMap二者只能用其一,不能同时使用。
        resultType属性指的是结果集将自动封装成什么类型。这时候默认表中列的名字和类中属性名字一致。
        resultMap 属性指的是结果集将按照<resultMap>标签中定义的 【对应关系】 来封装数据。
 
    
最后再次说下sql语句的执行方式
 
1.通过字符串,调用映射文件中的SQL语句
        字符串形式为:
        映射文件的namespace + sql语句的id
        
        例如:
            SqlSession sqlSession = MyBatisSqlSessionFactory.openSession(); 
            try{ 
                Student student = sqlSession.selectOne("com.briup.mappers.StudentMapper.findStudentById", 1); 
                System.out.println(student);
            } 
            finally { 
                sqlSession.close(); 
            } 

这种方式容易出错,因为需要自己编写字符串,我们需要检查映射文件中namespace,以及sql语句定义中对参数和返回值的要求,以保证输入的参数类型和结果返回类型是有效的。-->

2.MyBatis中还可以通过使用映射接口Mapper,调用映射文件中的sql。
        sql映射文件中的namespace和映射接口的全限定名要保持一致。
        <mapper namespace="com.briup.mappers.StudentMapper"> 
        
        sql映射文件中的sql语句id值和映射接口中的方法名要保持一致。
        sql语句配置的parameterType属性和映射接口中对应的方法的参数类型保持一致。
        sql语句配置的returnType属性和映射接口中对应的方法的返回值类型保持一致。
         <select id="findStudentById" parameterType="int" resultType="Student"> 
 
        例如:映射接口StudentMapper.java
        package com.briup.mappers; 
        public interface StudentMapper{ 
            Student findStudentById(Integer id); 
        } 
 
        通过映射接口,调用映射文件中的SQL语句。
        代码如下:
        SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();  
        try { 
            StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); 
            Student stu = studentMapper.findStudentById(1); 
        } 
        finally { 
            sqlSession.close(); 
        }  
    

mybatis框架中XxxxMaper.xml的文件的更多相关文章

  1. SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释(转)

    原文:https://blog.csdn.net/yijiemamin/article/details/51156189# 这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文 ...

  2. 0927-转载:SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释

    这篇文章暂时只对框架中所要用到的配置文件进行解释说明,而且是针对注解形式的,框架运转的具体流程过两天再进行总结. spring+springmvc+mybatis框架中用到了三个XML配置文件:web ...

  3. SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释

    这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文件并没有进行过多的说明,很多人知其然不知其所以然,经过几天的搜索和整理,今天总算对其中的XML配置文件有了一定的了解,所以拿 ...

  4. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  5. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  6. Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

    在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...

  7. 【mybatis】使用mybatis框架中踩过的坑

    好久没来记录一下自己的学习情况,最近都在学框架,今天来记录一下关于mybatis框架的学习过程中碰过的一些问题: 以下内容可能稍微有点凌乱,因为是把之前遇到过的错误或异常都集中一起了,不过我已经把问题 ...

  8. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案

    运行环境:Spring框架整合MaBitis框架 问题叙述: 在Spring配置文件applicationContext-mybatis.xml中配置好mybatis之后 <?xml versi ...

  9. 优化mybatis框架中的查询用户记录数的案例

    通过对mybatis框架的中核心接口和类的分析,发现之前写的那个小demo是有问题的.现在对其进行部分优化. 如果存在多个功能的时候,势必会有很多重复的代码,如,创建sqlsession对象,关闭sq ...

随机推荐

  1. spring boot 项目启动无法访问,排查

    查看docker日志,后台应用正常启动,定时任务正常执行,但是前端无法访问到后端接口,点击提示系统错误,解压出项目二级域名,访问域名,报错:Kong Error,说明Kong路由转发没有绑定项目端口, ...

  2. 「题解」:07.16NOIP模拟T1:礼物

    问题 A: 礼物 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼 ...

  3. 2019hdu第二场

    10:签到求n!取模 #include <iostream> #include <iterator> #include <algorithm> typedef lo ...

  4. C++之判断字符串是否是数字

    文章转载自https://blog.csdn.net/Richard__Ting/article/details/80772174 判断是否为数字 #include <iostream> ...

  5. NX二次开发-UFUN工程图表格注释section转tag函数UF_TABNOT_ask_tabular_note_of_section

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  6. 良田高拍仪集成vue项目

    一.硬件及开发包说明: 产品型号为良田高拍仪S1800A3,集成b/s系统,适用现代浏览器,图片使用BASE64数据.开发包的bin文件下的video.flt文件需要和高拍仪型号的硬件id对应,这个可 ...

  7. bash字符串前导美元符号的作用

    problem bash内置变量IFS作为内部单词分隔符,其默认值为<space><tab><newline>, 我想设置它仅为\n,于是: OLD_IFS=$IF ...

  8. git rm --cached (解决:modified: .idea/workspace.xml,git idea 操作完之后不能pull)

    错误解决:modified: .idea/workspace.xml 这个错误是本地的.idea提交到了远端. 解决办法: .gitignore文件加上: .dea/workspace.xml 可是. ...

  9. 新建的maven项目里没有src

    百度上搜到一个网友的一句话:没筷子你就不吃饭了是吧 若有所思 自己新建一个src文件 然后, 由于已经转换,因此上图没有sources选项 然后就可以在文件中随意编写文件 如果想添加package,直 ...

  10. 剑指offer——26反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头.   题解: 每次只反转一个节点,先记住cur->next, 然后pre->cur,即可;   class Solution { pu ...