今日课程内容介绍

第二章 Mybatis的curd(基于代理dao的方式)

2.1 回顾自定义Mybatis的流程

  1. 流程图
  • 不管使用哪种方式都只干了两件事:

    1. 查询结果,封装结果集
    2. 创建代理对象,调用查询结果
  1. 总结(自定义不是重点,重点还是如何去实现与执行Mybatis的使用)

2.2 xml和注解重点流程【重点】

  1. 不要拘泥于某个技术点来得到某些内容
  2. 主要关注的是从里面拿出什么内容来解决什么内容【如下】
    1. 获取到连接数据库的信息
    2. 拿到映射配置的信息(映射配置里面提供的信息)
    3. xml配置信息中

      1. 获取时所必须的key->唯一标志
      2. 封装到哪里去的->全限定类名
      3. 执行什么样的SQL语句
    4. 注解配置信息中【关键就是User要怎么拿到】

      1. 获取时所必须的key->唯一标志
      2. 封装到哪里去的->User
      3. 执行什么样的SQL语句
    • User要怎么拿到【了解】

      • 后面就是取出信息存到mappers里面

        • 目的:可以在创建代理对象的时候可以拿到我们想要的信息
    1. 创建代理对象,调用查询结果

2.3 回顾Mybatis的环境搭建【重点】

2.3.1 xml的

  1. 新建项目,什么都不选
  2. 组名和自定义名
  3. 导入依赖坐标(日志操作配置去day1中复制)
  4. 在java文件夹中创建实体类
  5. 在Resource文件夹中创建Mybatis的主配置文件
    1. 复制Config的约束
        <?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">
    
    1. mappers配置方式决定使用xml还是注解
  6. 创建dao的接口
  7. 对应着dao接口包来创建映射配置文件(必须一级一级来创建:否则会以点分隔创建成一个文件夹)
    1. 复制Mapper的约束(叫mapper和dao是一样的,根据个人习惯)
        <?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">
    


8. 至此,环境搭建完成【下面写测试类来测试】

2.3.2 注解的

  • 注: 与2.3.1中(1, 2, 3, 4)步骤相同
  1. 在Resource文件夹中创建Mybatis的主配置文件

    1. 复制Config的约束
        <?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">
    
    1. mappers配置方式决定使用xml还是注解

      • 需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
  2. 创建dao的接口
    • 在dao接口的方法上使用@Select注解,并且指定SQl语句
  3. 注解不需要xml映射配置文件
  4. 至此,环境搭建完成【下面写测试类来测试】
  • 注:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式,不管使用XML还是注解的方式。

    • 但是Mybatis是支持写dao实现的。

2.4 Mybatis的CRUD 保存操作

2.4.1 xml的

  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
    • 没有id是因为它是自增长的
  3. 在测试类中新增一个方法
    • 这里每个方法都需要做1,2,3,4,6步骤,所有都提了出来(优化代码)
    • 测试保存操作最后面要用到,提交事务操作(否则会回滚)
        public class MybatisTest {private InputStream in;private SqlSession sqlSession;private IUserDao userDao;/*** 来执行一些初始化的操作(减少重复代码)* * 这时候要有一些变量写到外面*/@Before //用于在测试方法执行之前执行public void init() throws Exception{//1. 读取配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml"); //会抛出异常//2. 创建SqlSessionFactory工厂(他是一个接口,需要找他的实现)/*SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(in);*/SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//3. 使用工厂产生SqlSession对象sqlSession = factory.openSession();//4. 使用SqlSession创建Dao接口的代理对象userDao = sqlSession.getMapper(IUserDao.class);}/*** 用来干释放资源*/@After //用于在测试方法执行之后执行public void destroy() throws Exception{/*** 测试保存操作最后面要用到*///提交事务(否则会回滚)sqlSession.commit();//6. 释放资源sqlSession.close();in.close(); //也会抛出异常}/*** 入门案例* 总体思路:* 读取配置文件来准备一个工厂来生产一个对象,这个对象用于为我们提供Dao的实现,有了实现就可以用来执行方法** 要点:* 1. 用代理的方式不用写Dao的实现* 2. IUserDao.xml配置当中,必须要说清楚封装到哪里去{<select id="findAll" resultType="com.kami.domain.User">}*/@Testpublic void testFindAll(){//5. 使用代理对象执行方法List<User> users = userDao.findAll();for(User user : users){System.out.println(user);}}/*** 测试保存操作*/@Testpublic void stestSave() throws Exception {User user = new User();user.setUsername("Mybatis saveUser");user.setAddress("银川市西夏区");user.setSex("男");user.setBirthday(new Date());//5. 使用代理对象保存方法userDao.saveUser(user);}}
    
  • 注:当保存操作,存中文出现乱码的时候【重点】

    1. 打开SqlMapConfig.xml
    2. 修改url后面的value值
        <property name="url" value="jdbc:mysql://localhost:端口号/数据库名称?characterEncoding=utf-8"/>
    

2.4.2 注解的

  1. 在IUserDao接口中写方法
  2. SqlMapConfig.xml改成注解
  3. 在测试类中新增一个方法
    • 前面部分同xml的配置

2.5 Mybatis的CRUD 修改与删除操作

2.5.1 xml的

  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法

2.5.2 注解的

  1. 在IUserDao接口中写方法
  2. SqlMapConfig.xml改成注解
  3. 在测试类中新增方法
    • 前面部分同xml的配置

2.6 Mybatis的CRUD 查询一个和模糊查询(07)

2.6.1.1 xml的方式:查询一个的操作

  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法

2.6.1.2 注解的方式:查询一个的操作

  1. 在IUserDao接口中写方法
  2. 在测试类中新增方法

2.6.2.1 xml的方式:模糊查询的操作

  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法

2.6.2.2 注解的方式:模糊查询的操作

  1. 在IUserDao接口中写方法
  2. 在测试类中新增方法

2.7 Mybatis的CRUD 查询返回一行一列

2.7.1 XML的方式:查询总用户数

  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法

2.7.2 注解的方式:查询总用户数

  1. 在IUserDao接口中写方法
  2. 在测试类中新增方法

***以上是所有的CRUD操作

2.8 上面要注意的几点细节

2.8.1 模糊查询的另一种写法【了解,实际开发用上面的】

  1. IUserDao.xml配置中另一种写法
    <!-- 根据名称模糊查询(这里提供不了模糊查询的%,在测试类中提供) --><select id="findByName" parameterType="String" resultType="com.kami.domain.User"><!-- 原来的-->select * from user where username like #{uname}<!-- 另一种写法-->select * from user where username like '%${value}%'</select>
  1. 在测试类中的修改
    @Testpublic void testFindByName(){//5. 使用代理对象保存方法//List<User> users = userDao.findByName("%王%");//另一种写法中已经提供了%,这里就不需要写了List<User> users = userDao.findByName("王");for(User user : users){System.out.println(user);}}
  1. 两者的区别
  • 注:PreparedStatement 使用crud的知识点

    1. PreparedStatement可以提高执行的效率(因为它有预编译的功能)
    2. PreparedStatement可以防止sql注入,但是要求?(参数占位符)赋值的方式才可以。

2.8.2 保存操作的细节:获取保存数据的id

  • 新增用户后,同时还要返回当前新增用户的id
  1. 在IUserDao.xml的保存用户中新增配置
  2. 执行结果:

第三章 Mybatis的参数深入

  • 首先了解:OGNL表达式(apache公司开发的):

    1. 它是通过对象的取值方法来获取数据。在写法上把get给省略了。
    2. #{}或者${}括号中的值为pojo属性名称

3.1 使用实体类的包装对象作为查询条件【重点】

  • 实际开发中常用到:【由多个对象产生的查询条件】
  1. 在IUserdao接口中写方法

        /*** 根据queryVo的条件查询用户* @param vo* @return*/int findUserByVo(QueryVo vo);
    
  2. 实际还是要根据名称来模糊查询,只不过查询的条件被封装到一个对象里面了
  3. 在映射配置IUserDao.xml中配置
        <!-- 根据QueryVo的条件查询用户--><select id="findUserByVo" resultType="int" parameterType="com.kami.domain.QueryVo">select * from user where username like #{user.username}</select>
    
  4. 在测试类中新增方法
        /*** 测试使用QueryVo作为查询条件*/@Testpublic void testFindByVo(){QueryVo vo = new QueryVo();User user = new User();user.setUsername("%王%");vo.setUser(user);//5. 使用代理对象保存方法List<User> userByVo = userDao.findUserByVo(vo);for(User u : userByVo){System.out.println(u);}}
    

3.2 Mybatis的输出结果封装

3.2.1 resultType(输出类型)

  1. 输出简单类型(查询总记录条数)
  2. 输出pojo对象(查询一个)
  3. 输出pojo列表(查询所有)
  • 注:当我们使用【查询封装】的时候,要求实体类必须和数据库的列名保持一致

    • 如果不一致(保存为例->删除,改都一样):

      1. 经过对后面的名称及keyProperty(id名)的修改

        • 能正常使用
    • 如果不一致->查询
      1. 结果:除了name之外的内容都为null
    • 除了name能封装,其他都为null的原因:
      1. 所有的属性都没有对象,所以封装不进去
      2. name能封装进去的原因:MySQL数据库在Windows系统下不区分大小写。实力类和数据库name名称相互匹配成功。(其他的完全不一样)
      3. 但是在Linux系统下MySQL数据库是区分大小写的。所以在Linux中name也封装不进去。
    • 解决方法:
      1. 在SQL语句中其别名【执行效率最高】
          <!-- 查询所有 --><select id="findAll" resultType="com.kami.domain.User">select id as userId, username as userName, address as userAddress, sex as userSex, birthday as userBirthday from user;</select>
      
      1. Mybatis提供了一种配置方式并使用【开发效率更高】

        1. IUserDao.xml中写好
            <!-- 配置 查询结果的列名和实体类的属性名的对应关系--><resultMap id="userMap" type="com.kami.domain.User"><!-- 主键字段的对应--><id property="userId" column="id"></id><!-- 非主键字段的对应--><result property="userName" column="username"></result><result property="userAddress" column="address"></result><result property="userSex" column="sex"></result><result property="userBirthday" column="birthday"></result></resultMap>
        
        1. 查询所有的配置中将resultType替换成resultMap属性
            <!-- 查询所有 --><select id="findAll" resultMap="userMap">select * from user;</select>
        

第四章 Mybatis实现DAO层开发

  1. 自己来写dao的实现类->【实际开发不自己来写】
  2. 注:PreparedStatement对象,它的执行方法

第五章 SqlMapConfig.xml配置文件

  1. properties

    • 注:URL与URI的区别
  2. typeAliases标签和package标签

    • 注:Mappers下的package标签

详细的原文

详页连接

05_02_Mybatis||day02_Mybatis第二天||(总结篇,原文很详细)相关推荐

  1. 不少人都想了解网络安全培训内容有哪些?这篇文章会很详细的告诉你

    现在大学生工作难找,究其原因无非是学历和技能受限造成的,大环境再怎么变化,其实大家心知肚明,只要有高学历+高技术,体面高薪的工作很多. 现在企业招人,更愿意要高技术而不是高学历的求职者,所以导致一种怪 ...

  2. 有 Bug 不会调试 ? 这篇文章很详细 !

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:bojiangzhou 出处:http://www.cnbl ...

  3. UIBOT调试时步入的快捷键_有 Bug 不会调试 ? 这篇文章很详细 !

    一.Debug 开篇 二.基本用法 & 快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中断 Debug <Java 2019 超 ...

  4. 介绍一篇关于session的好文章,写的很详细

    介绍一篇关于session的好文章,写的很详细 目录: 一.术语session 二.HTTP协议与状态保持 三.理解cookie机制 四.理解session机制 五.理解javax.servlet.h ...

  5. 这篇文章很好的诠释了为什么安全框架如此重要?

    本文讲的是这篇文章很好的诠释了为什么安全框架如此重要?,很多安全公司没有研究.开发和实现各种各样的项目框架不也运营的还行么?那我们为什么还要专门弄个团队来干这事儿呢?然而,"运营得还行&qu ...

  6. 一篇很详细的OCA认证流程(一问一答版)

    这是一篇很详细的OCA认证流程.一般少有人注意到写OCA的流程,因为一般人都不考OCA,直接考OCP了.不过,想要了解一下的同学也应该可以从这篇文章中找到想要了解的知识. 提问:网上怎么报名呢?网上注 ...

  7. 偶然发现的一篇相见很晚的文章:如何学好游戏编程

    今天偶然发现一篇介绍如何学好游戏编程的文章,相见恨晚呀,特转载,转帖地址:http://new.qzone.qq.com/79134054/blog/1226580538#!. <如何学好游戏编 ...

  8. 智能车百度赛道培训第二弹-算法篇

    智能车百度赛道培训第二弹--算法篇来袭!接住了吗?往下看!

  9. 生日祝福小程序_广告配音剪映零基础入门教程第二十六篇:如何给朋友制作生日祝福视频...

    经常听到小伙伴问到生日祝福视频怎么做,当然我想既然要为他人做生日祝福视频,那么这个人必定是自己身边比较重要的人,而生日又是每个人都是非常重要的,在这种充满意义的时刻,我们想给自己极其重要的人送上一份祝 ...

最新文章

  1. 生物信息学常见数据格式 • fasta • fastq • gff/gtf 练习题
  2. 安装openssh 到 am5728 板子上
  3. bzoj2154: Crash的数字表格
  4. C语言程序设计答案黄保和编,C语言程序设计答案(黄保和编)第5章.pdf
  5. HTTP请求过滤器FreeBSD accf_http)
  6. 最有效的七大性能测试技术
  7. 新美国安全中心报告:中国在量子技术中占据了重要优势
  8. Cisco1721的简单配置
  9. c代码格式化_Python 只用一行代码,可以实现哪些事儿?
  10. 华南技术盛会:BingoDay2017在天河人才港盛大举行
  11. ubuntu linux指南 管理篇,Ubuntu Linux指南:管理篇 译者序
  12. 渗透测试-网页接口加密暴破
  13. 春招面试的总结与自我反省
  14. 35岁以上的大龄程序员们,后来都干什么去了?
  15. VC2010 MFC程序制作Flash动画欢迎界面
  16. mysql 回滚sql_Mysql误操作后使用binlog2sql快速回滚
  17. 虎牙直播怎么换html5,虎牙直播怎么换徽章-虎牙直播更换粉丝徽章的方法 - 河东软件园...
  18. mysql主从配置duxi_配置MySQL主从复制(一主一从)
  19. 新手入门linux必看
  20. 【剑指offer-54】20190907/03 字符流中第一个不重复的字符

热门文章

  1. 国美金融贷款函数计算编译器,国美金融贷款优化工作
  2. 卖房不必亲自跑腿,交给代理更轻松---代理模式
  3. 超级计算机总决赛,世界大学生超级计算机竞赛总决赛在武汉落幕,hust夺冠
  4. 二手房简约改造 90平开阔舒适之家
  5. 【命名实体识别(NER)】(1):命名实体识别综述
  6. uni-app小程序里用echarts-for-wx-uniapp,dispatchAction不起作用
  7. Arduino UNO驱动micro SD卡读写模块
  8. 微信公众号投票思路,可以使用任何语言搞定!
  9. ComponentScan
  10. hdu2063过山车(二分图最大匹配)