我们知道在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(); 
        }  
    

最新文章

  1. Struts框架2ActionError类 内部资料 请勿转载 谢谢合作
  2. solr 3.5.0 与 tomcat 7.0.5 整合配置
  3. (转载)数据库出现ORA-00283/ORA-01610的问题
  4. ASP.NET中GridView控件删除数据的两种方法
  5. mysql查询优化(持续更新中)
  6. 【bzoj3160】万径人踪灭
  7. ruby 字符串学习2
  8. cadence原理图绘制方法
  9. node.js 模块之url和querystring模块
  10. Prototypes analyze(二叉排序树,不同树形个数)
  11. Cocos2d—X游戏开发之CCTableView详解(十一)
  12. Alamofire源码解读系列(一)之概述和使用
  13. 借助csv用PHP生成excel文件
  14. java获取当前上一周、上一月、上一年的时间
  15. 《Linux命令行与shell脚本编程大全》第十五章 呈现数据
  16. java jdk动态代理(proxy)
  17. [Java复习] 复习知识点
  18. 手工搭建web项目
  19. Java获取数据库表 字段 存储的部分数据
  20. 关于对springboot程序配置文件使用jasypt开源工具自定义加密

热门文章

  1. Redis探索之路(六):Redis的常用命令
  2. Keepalived+LVS+nginx搭建nginx高可用集群
  3. 关于canvas绘制图像模糊问题
  4. unity 打包Apk生成签名证书keystore
  5. NX二次开发-获取UG界面窗口句柄UF_UI_get_default_parent
  6. Python sorted list的实现
  7. 使用Windbg调试内核
  8. (转)Python学习笔记(1)__name__变量
  9. nodejs--express安装失败的原因
  10. Activiti学习笔记8 — UserTask私有任务的使用