zoukankan      html  css  js  c++  java
  • mybatis框架中XxxxMaper.xml的文件

    我们知道在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(); 
            }  
        
  • 相关阅读:
    hdu 1240:Asteroids!(三维BFS搜索)
    hdu 2199:Can you solve this equation?(二分搜索)
    hdu 1195:Open the Lock(暴力BFS广搜)
    【ACM
    hrbustoj 1161:Leyni(树状数组练习)
    时间作为横轴的图表(morris.js)超越昨天的自己系列(8)
    Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
    Sharded实现学习-我们到底能走多远系列(32)
    初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)
    一致性哈希算法 应用场景(转)
  • 原文地址:https://www.cnblogs.com/Magic-Li/p/11754605.html
Copyright © 2011-2022 走看看