相比jdbc mybatis在操作数据库方面比jdbc节省了大量的代码,及大量的代码冗余.使得操作起来更加简洁.

在Mapper中分别有着 select,insert, update,delete的这四个标签分别对应着SQL语句中的查询映射,添加映射,修改映射,删除映射.

  1. <select id=""></select>
  2. <insert id=""></insert>
  3. <update id=""></update>
  4. <delete id=""></delete>

不同点

可以看到除了标签,SQL语句的作用不一致,以及除了select返回的数据不是受影响行数之外,其它的都是返回受影响行数,也就是返回的是int类型数据

相同点

都需要传入参数

xml代码如下

  1. <select id="getProvider" resultType="Provider">
  2. SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
  3. WHERE b.providerId=#{id}
  4. </select>
  5. <update id="updatePwd" parameterType="User">
  6. UPDATE `smbms_user` SET `userPassword` = #{userPassword} WHERE `id` = #{id} ;
  7. </update>
  8. <delete id="delUserById" parameterType="Integer">
  9. delete from smbms_user where id=#{id}
  10. </delete>
  11. <insert id="add" parameterType="User">
  12. INSERT INTO `smbms_user`
  13. (`userCode`, `userName`, `userPassword`, `gender`,
  14. `birthday`, `phone`, `address`, `userRole`, `createdBy`,
  15. `creationDate`, `modifyBy`, `modifyDate`)
  16. VALUES(#{userCode},#{userName},#{userPassword},#{gender},
  17. #{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate},
  18. #{modifyBy}, #{modifyDate});
  19. </insert>

接口代码

  1. List<Provider> getProvider(Integer id);
  2. int add(User u);
  3. int updatePwd(User u);
  4. int delUserById(int id);

测试类代码

  1. public static void main(String[] args) {
  2. SqlSession sqlSession=null;
  3. List<Bill> bList = new ArrayList<>();
  4. List<Provider> providers = new ArrayList<>();
  5. try {
  6. sqlSession=MyBatisUtil.createSqlSession();
  7. providers=sqlSession.getMapper(ProviderMapper.class).getProvider(1);for (Provider p : providers) {
  8. for (Bill b : p.getBills()) {
  9. System.out.println(b.getProductName());
  10. }
  11. }
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. logger.debug(e);
  15. }finally {
  16. MyBatisUtil.closeSqlSession(sqlSession);
  17. }
  18. }
  19. @org.junit.Test
  20. public void testAdd() {
  21. logger.debug("testAdd-----");
  22. SqlSession sqlSession =null;
  23. int count=0;
  24. try {
  25. sqlSession = MyBatisUtil.createSqlSession();
  26. User u = new User("测试用户", 1);
  27. u.setUserCode("test001");
  28. u.setUserPassword("123456");
  29. u.setBirthday(Date.valueOf("1999-09-09"));
  30. u.setAddress("测试地址");
  31. u.setGenfer(1);
  32. u.setPhone("19973535706");
  33. u.setCreatedBy(1);
  34. u.setCreationDate(Date.valueOf("1999-09-09"));
  35. count = sqlSession.getMapper(UserMapper.class).add(u);
  36. sqlSession.commit();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. sqlSession.rollback();
  40. }finally {
  41. MyBatisUtil.closeSqlSession(sqlSession);
  42. }
  43. logger.debug("testAdd:"+count);
  44. }
  45. @org.junit.Test
  46. public void testModifyPwd() {
  47. logger.debug("testModifyPwd-----");
  48. SqlSession sqlSession =null;
  49. int count=0;
  50. try {
  51. sqlSession = MyBatisUtil.createSqlSession();
  52. User u = new User("测试用户修改", 1);
  53. u.setUserPassword("123456");
  54. u.setId(15);
  55. count = sqlSession.getMapper(UserMapper.class).updatePwd(u);
  56. sqlSession.commit();
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. sqlSession.rollback();
  60. }finally {
  61. MyBatisUtil.closeSqlSession(sqlSession);
  62. }
  63. logger.debug("testModifyPwd:"+count);
  64. }
  65. @org.junit.Test
  66. public void testdel() {
  67. logger.debug("testdel-----");
  68. SqlSession sqlSession =null;
  69. int count=0;
  70. try {
  71. sqlSession = MyBatisUtil.createSqlSession();;
  72. count = sqlSession.getMapper(UserMapper.class).delUserById(16);
  73. sqlSession.commit();
  74. } catch (Exception e) {
  75. e.printStackTrace();
  76. sqlSession.rollback();
  77. }finally {
  78. MyBatisUtil.closeSqlSession(sqlSession);
  79. }
  80. logger.debug("testdel:"+count);
  81. }

以上一个都传入了参数的,那么我们在来看共同点相同属性也就是parameterType,指的是传入的参数,一种具体的数据类型比如,int,String,自定义的对象等等

注意:传入的参数与SQL语句中参数名两者名称需一致,如果是自定义对象则需与对象中自定义的属性名称一致

此外还有一个属性parameterMap:参数有多个值,并且这多个值之间没有具体的联系,就可以考虑使用parameterMap,或者@param注解

那么再看select中的另外一个属性:resultType指的是返回的数据类型,而除了select其他的都没有,这是因为它们默认就是返回int因此不需要 resultType.

resultMap:必须要自己在这个xml中重新配置一个新的resultMap标签,

注意:当受影响行数为0时返回的值就会是null,因此返回值最好设置成integer而不是int

@Param注解实现多参数

  1. List<Bill> getBill(@Param("id") Integer billId);

使用注解@Parma来传入多个参数,入@Param("id") Integer billId,相当于将该参数重命名为id,在映射的SQL中需要使用#{注解名}

  1. <select id="getBill" parameterType="Integer" resultMap="billResult">
  2. SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
  3. WHERE b.providerId=#{id}
  4. </select>

resultType和resultMap的关联

  在mybatis进行查询映射的时候,其实查询处理的每个字段值都放在一个对应的Map里面,其中关键是字段名,值则是对应的值,当select提供的返回类型属性

是在resultType的时候,My把提升会将Map里面的键值取出赋值给resultType所知道的对象对应的属性(即钓鱼对应的对象里的属性的setter方法进行填充).因此

,当resulttype的时候,直接在后台就能接收到其相应的值.其实mybatis的每个查询映射的返回类型都是resultMap,只是mybatis自动转换成了我们需要的类型

注意:resultType属性和resultMap属性不能同时存在,只能二者选其一

resultMap自定义映射 

  1. <resultMap type="Bill" id="billResult">
  2. <result property="productName" column="productName"/>
  3. <result property="productDesc" column="productDesc"/>
  4. </resultMap>
  5. <select id="getBill" parameterType="Integer" resultMap="billResult">
  6. SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
  7. WHERE b.providerId=#{id}
  8. </select>

resultMap的属性值和子节点

  • id属性:唯一标识符,此id值用于select于是resultMap的属性引用
  • type:表示该resultMap的映射结果类型
  • result节点:用于表示一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询处来的字段对应的值赋给实体对象的那个属性

设置映射级别

  1. <settings>
  2. <!-- 设置自动匹配所有属性 包括collection与association-->
  3. <setting name="autoMappingBehavior" value="FULL"/>
  4. </settings>
  • NONE:禁止自动匹配
  • PARTIAL(默认):自动匹配所以属性,内部嵌套的(association,collection)除外
  • FULL:匹配所有

有了最高映射级别,因此自定义对象中的属性只要数据库中的字段相对应就不需要使用使用resultMap进行手动映射结果了

association

  association:映射到Javabean的某个"复杂类型"属性,比如Javabean类,即Javabean内部嵌套一个复杂数据类型(Javabean)属性,这种情况就属性复杂类型的关联.

如类类,需要注意:association仅处理一对一的关联关系

实体类

  1. private int id;
  2. /**
  3. * 编码
  4. */
  5. private String billCode;
  6. /**
  7. * 名称
  8. */
  9. private String productName;
  10. /**
  11. * 商品描述
  12. */
  13. private String productDesc;
  14. /**
  15. * 商品单位
  16. */
  17. private String productUnit;
  18. /**
  19. * 商品数量
  20. */
  21. private int productCount;
  22. /**
  23. * 商品总额
  24. */
  25. private int totalPrice;
  26. /**
  27. * 是否支付 1 未支付 0 已支付
  28. */
  29. private int isPayment;
  30. /**
  31. * 创建者
  32. */
  33. private String createdBy;
  34. /**
  35. * 创建时间
  36. */
  37. private Date creationDate;
  38. /**
  39. * 更新者
  40. */
  41. private String modifyBy;
  42. /**
  43. * 更新时间
  44. */
  45. private Date modifyDate;
  46. /**
  47. * 供应商id
  48. */
  49. private int providerId;
  50. /**
  51. * 供应商
  52. */
  53. private Provider provider;
  54. // 省略getset方法

SQL映射

  1. <resultMap type="Bill" id="billResult">
  2. <result property="productName" column="productName"/>
  3. <result property="productDesc" column="productDesc"/>
  4. <association property="provider" resultMap="providerresult"></association>
  5. </resultMap>
  6. <resultMap type="Provider" id="providerresult">
  7. <result property="proAddress" column="proAddress"/>
  8. <result property="proName" column="proName"/>
  9. </resultMap>
  10. <select id="getBill" parameterType="Integer" resultMap="billResult">
  11. SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
  12. WHERE b.providerId=#{id}
    </select>

上面只选了部分属性进行映射

association属性

  • property:映射数据库列的实体对象属性,此处为在Bill定义的属性:Provider
  • result:property 映射数据库列的实体对象的属性,此处为Provider,column数控列名或别名

collection

  作用与association非常类似,只不过collection对应的是类型中的集合

  1.   <resultMap type="Bill" id="billResult">
  2. <result property="productName" column="productName"/>
  3. <result property="productDesc" column="productDesc"/>
  4. </resultMap>
  5. <resultMap type="Provider" id="providerresult">
  6. <result property="proAddress" column="proAddress"/>
  7. <result property="proName" column="proName"/>
  8. <collection property="bills" ofType="Bill" resultMap="billResult"></collection>
  9. </resultMap>
  10.   <select id="getProvider" resultMap="providerresult" parameterType="Integer">
  11. SELECT * FROM smbms_bill b JOIN smbms_provider p ON b.providerId=p.id
  12. WHERE b.providerId=#{id}
  13. </select>

collection属性

  • ofType:映射数据库列的实体对象属性,此处为在Bill定义的属性:Provider
  • result:property 映射数据库列的实体对象的属性,此处为Provider,column数控列名或别名

resultType

Mybatis中的增删改查的更多相关文章

  1. mybatis中的增删改查操作

    在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...

  2. Spring Boot 使用Mybatis注解开发增删改查

    使用逆向工程是遇到的错误 错误描述 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): c ...

  3. Mybatis实现简单增删改查

    Mybatis的简单应用 学习内容: 需求 环境准备 代码 总结: 学习内容: 需求 使用Mybatis实现简单增删改查(以下是在IDEA中实现的,其他开发工具中,代码一样) jar 包下载:http ...

  4. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  5. Mybatis入门之增删改查

    Mybatis入门之增删改查 Mybatis如果操作成功,但是数据库没有更新那就是得添加事务了.(增删改都要添加)----- 浪费了我40多分钟怀疑人生后来去百度... 导入包: 引入配置文件: sq ...

  6. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  7. MyBatis -- 对表进行增删改查(基于注解的实现)

    1.MyBatis对数据库表进行增/删/改/查 前一篇使用基于XML的方式实现对数据库的增/删/改/查 以下我们来看怎么使用注解的方式实现对数据库表的增/删/改/查 1.1  首先须要定义映射sql的 ...

  8. SpringMVC,MyBatis商品的增删改查

    一.需求 商品的增删改查 二.工程结构 三.代码 1.Mapper层 (1) ItemsMapperCustom.java package com.tony.ssm.mapper; import ja ...

  9. 基于SSM之Mybatis接口实现增删改查(CRUD)功能

    国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...

随机推荐

  1. 练习十一:兔子数量计算—斐波那契实例

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少? 通过数学分析我们知道,兔子的规律为数列1,1,2 ...

  2. ProtocBuffer安装

    学习protocolhttp://www.jianshu.com/p/fa126a8535a0 mac安装protocbuff: 下边总结一下安装流程: 查看官方文档源码在 https://githu ...

  3. SpringMVC08AnnotationException 注解异常

    1.配置web.xml文件 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...

  4. MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析

    MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析 注:MATLAB版本--2016a,作图分析部分见<MATLAB之折线图.柱状图.饼图以及常用绘图技巧> 一.现状模式下的模型 % ...

  5. SHOW SLAVE STATUS 详解

    MySQL同步功能由3个线程(master上1个,slave上2个)来实现.执行 DE>START SLAVEDE> 语句后,slave就创建一个I/O线程.I/O线程连接到master上 ...

  6. python之__init__使用方法

    定义类的时候,若是添加__init__方法,那么在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初使化.比如:class testClass: def __init__(self ...

  7. cms-帖子静态化

    实现帖子静态化和实现友情链接静态化一致, 1.首先建立帖子类别的实体类: package com.open1111.entity; /** * 帖子类别实体 * @author user * */pu ...

  8. pta 编程题14 Huffman Codes

    其它pta数据结构编程题请参见:pta 题目 题目给出一组字母和每个字母的频数,因为哈夫曼编码不唯一,然后给出几组编码,因为哈夫曼编码不唯一,所以让你判断这些编码是否符合是哈夫曼编码的一种. 解题思路 ...

  9. Python核心编程——正则表达式

    本篇博客都是我认真读之后写的,有些地方和书上的语句一样…… 1.简介 正则表达式为高级的文本模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称regex)是一些由字符 ...

  10. nginx搭建流媒体服务器

    1.安装PCRE库 到www.pcre.org 下载pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.37 ./configure make ...