05_02_Mybatis||day02_Mybatis第二天||(总结篇,原文很详细)
今日课程内容介绍
第二章 Mybatis的curd(基于代理dao的方式)
2.1 回顾自定义Mybatis的流程
- 流程图
- 不管使用哪种方式都只干了两件事:
- 查询结果,封装结果集
- 创建代理对象,调用查询结果
- 总结(自定义不是重点,重点还是如何去实现与执行Mybatis的使用)
2.2 xml和注解重点流程【重点】
- 不要拘泥于某个技术点来得到某些内容
- 主要关注的是从里面拿出什么内容来解决什么内容【如下】
- 获取到连接数据库的信息
- 拿到映射配置的信息(映射配置里面提供的信息)
- xml配置信息中
- 获取时所必须的key->唯一标志
- 封装到哪里去的->全限定类名
- 执行什么样的SQL语句
- 注解配置信息中【关键就是User要怎么拿到】
- 获取时所必须的key->唯一标志
- 封装到哪里去的->User
- 执行什么样的SQL语句
- User要怎么拿到【了解】
- 后面就是取出信息存到mappers里面
- 目的:可以在创建代理对象的时候可以拿到我们想要的信息
- 后面就是取出信息存到mappers里面
- 创建代理对象,调用查询结果
- 获取到连接数据库的信息
2.3 回顾Mybatis的环境搭建【重点】
2.3.1 xml的
- 新建项目,什么都不选
- 组名和自定义名
- 导入依赖坐标(日志操作配置去day1中复制)
- 在java文件夹中创建实体类
- 在Resource文件夹中创建Mybatis的主配置文件
- 复制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">
- mappers配置方式决定使用xml还是注解
- 创建dao的接口
- 对应着dao接口包来创建映射配置文件(必须一级一级来创建:否则会以点分隔创建成一个文件夹)
- 复制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)步骤相同
- 在Resource文件夹中创建Mybatis的主配置文件
- 复制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">
- mappers配置方式决定使用xml还是注解
- 需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
- 需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
- 创建dao的接口
- 在dao接口的方法上使用@Select注解,并且指定SQl语句
- 在dao接口的方法上使用@Select注解,并且指定SQl语句
- 注解不需要xml映射配置文件
- 至此,环境搭建完成【下面写测试类来测试】
- 注:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式,不管使用XML还是注解的方式。
- 但是Mybatis是支持写dao实现的。
2.4 Mybatis的CRUD 保存操作
2.4.1 xml的
- 在IUserDao接口中写方法
- 在映射配置IUserDao.xml中配置
- 没有id是因为它是自增长的
- 没有id是因为它是自增长的
- 在测试类中新增一个方法
- 这里每个方法都需要做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);}}
- 注:当保存操作,存中文出现乱码的时候【重点】
- 打开SqlMapConfig.xml
- 修改url后面的value值
<property name="url" value="jdbc:mysql://localhost:端口号/数据库名称?characterEncoding=utf-8"/>
2.4.2 注解的
- 在IUserDao接口中写方法
- SqlMapConfig.xml改成注解
- 在测试类中新增一个方法
- 前面部分同xml的配置
- 前面部分同xml的配置
2.5 Mybatis的CRUD 修改与删除操作
2.5.1 xml的
- 在IUserDao接口中写方法
- 在映射配置IUserDao.xml中配置
- 在测试类中新增方法
2.5.2 注解的
- 在IUserDao接口中写方法
- SqlMapConfig.xml改成注解
- 在测试类中新增方法
- 前面部分同xml的配置
- 前面部分同xml的配置
2.6 Mybatis的CRUD 查询一个和模糊查询(07)
2.6.1.1 xml的方式:查询一个的操作
- 在IUserDao接口中写方法
- 在映射配置IUserDao.xml中配置
- 在测试类中新增方法
2.6.1.2 注解的方式:查询一个的操作
- 在IUserDao接口中写方法
- 在测试类中新增方法
2.6.2.1 xml的方式:模糊查询的操作
- 在IUserDao接口中写方法
- 在映射配置IUserDao.xml中配置
- 在测试类中新增方法
2.6.2.2 注解的方式:模糊查询的操作
- 在IUserDao接口中写方法
- 在测试类中新增方法
2.7 Mybatis的CRUD 查询返回一行一列
2.7.1 XML的方式:查询总用户数
- 在IUserDao接口中写方法
- 在映射配置IUserDao.xml中配置
- 在测试类中新增方法
2.7.2 注解的方式:查询总用户数
- 在IUserDao接口中写方法
- 在测试类中新增方法
***以上是所有的CRUD操作
2.8 上面要注意的几点细节
2.8.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>
- 在测试类中的修改
@Testpublic void testFindByName(){//5. 使用代理对象保存方法//List<User> users = userDao.findByName("%王%");//另一种写法中已经提供了%,这里就不需要写了List<User> users = userDao.findByName("王");for(User user : users){System.out.println(user);}}
- 两者的区别
- 注:PreparedStatement 使用crud的知识点
- PreparedStatement可以提高执行的效率(因为它有预编译的功能)
- PreparedStatement可以防止sql注入,但是要求?(参数占位符)赋值的方式才可以。
2.8.2 保存操作的细节:获取保存数据的id
- 新增用户后,同时还要返回当前新增用户的id
- 在IUserDao.xml的保存用户中新增配置
- 执行结果:
第三章 Mybatis的参数深入
- 首先了解:OGNL表达式(apache公司开发的):
- 它是通过对象的取值方法来获取数据。在写法上把get给省略了。
- #{}或者${}括号中的值为pojo属性名称
- 它是通过对象的取值方法来获取数据。在写法上把get给省略了。
3.1 使用实体类的包装对象作为查询条件【重点】
- 实际开发中常用到:【由多个对象产生的查询条件】
- 在IUserdao接口中写方法
/*** 根据queryVo的条件查询用户* @param vo* @return*/int findUserByVo(QueryVo vo);
- 实际还是要根据名称来模糊查询,只不过查询的条件被封装到一个对象里面了
- 在映射配置IUserDao.xml中配置
<!-- 根据QueryVo的条件查询用户--><select id="findUserByVo" resultType="int" parameterType="com.kami.domain.QueryVo">select * from user where username like #{user.username}</select>
- 在测试类中新增方法
/*** 测试使用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(输出类型)
- 输出简单类型(查询总记录条数)
- 输出pojo对象(查询一个)
- 输出pojo列表(查询所有)
- 注:当我们使用【查询封装】的时候,要求实体类必须和数据库的列名保持一致
- 如果不一致(保存为例->删除,改都一样):
- 经过对后面的名称及keyProperty(id名)的修改
- 能正常使用
- 经过对后面的名称及keyProperty(id名)的修改
- 如果不一致->查询
- 结果:除了name之外的内容都为null
- 结果:除了name之外的内容都为null
- 除了name能封装,其他都为null的原因:
- 所有的属性都没有对象,所以封装不进去
- name能封装进去的原因:MySQL数据库在Windows系统下不区分大小写。实力类和数据库name名称相互匹配成功。(其他的完全不一样)
- 但是在Linux系统下MySQL数据库是区分大小写的。所以在Linux中name也封装不进去。
- 解决方法:
- 在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>
- Mybatis提供了一种配置方式并使用【开发效率更高】
- 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>
- 查询所有的配置中将resultType替换成resultMap属性
<!-- 查询所有 --><select id="findAll" resultMap="userMap">select * from user;</select>
- 如果不一致(保存为例->删除,改都一样):
第四章 Mybatis实现DAO层开发
- 自己来写dao的实现类->【实际开发不自己来写】
- 注:PreparedStatement对象,它的执行方法
第五章 SqlMapConfig.xml配置文件
- properties
- 注:URL与URI的区别
- 注:URL与URI的区别
- typeAliases标签和package标签
- 注:Mappers下的package标签
- 注:Mappers下的package标签
详细的原文
详页连接
05_02_Mybatis||day02_Mybatis第二天||(总结篇,原文很详细)相关推荐
- 不少人都想了解网络安全培训内容有哪些?这篇文章会很详细的告诉你
现在大学生工作难找,究其原因无非是学历和技能受限造成的,大环境再怎么变化,其实大家心知肚明,只要有高学历+高技术,体面高薪的工作很多. 现在企业招人,更愿意要高技术而不是高学历的求职者,所以导致一种怪 ...
- 有 Bug 不会调试 ? 这篇文章很详细 !
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:bojiangzhou 出处:http://www.cnbl ...
- UIBOT调试时步入的快捷键_有 Bug 不会调试 ? 这篇文章很详细 !
一.Debug 开篇 二.基本用法 & 快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中断 Debug <Java 2019 超 ...
- 介绍一篇关于session的好文章,写的很详细
介绍一篇关于session的好文章,写的很详细 目录: 一.术语session 二.HTTP协议与状态保持 三.理解cookie机制 四.理解session机制 五.理解javax.servlet.h ...
- 这篇文章很好的诠释了为什么安全框架如此重要?
本文讲的是这篇文章很好的诠释了为什么安全框架如此重要?,很多安全公司没有研究.开发和实现各种各样的项目框架不也运营的还行么?那我们为什么还要专门弄个团队来干这事儿呢?然而,"运营得还行&qu ...
- 一篇很详细的OCA认证流程(一问一答版)
这是一篇很详细的OCA认证流程.一般少有人注意到写OCA的流程,因为一般人都不考OCA,直接考OCP了.不过,想要了解一下的同学也应该可以从这篇文章中找到想要了解的知识. 提问:网上怎么报名呢?网上注 ...
- 偶然发现的一篇相见很晚的文章:如何学好游戏编程
今天偶然发现一篇介绍如何学好游戏编程的文章,相见恨晚呀,特转载,转帖地址:http://new.qzone.qq.com/79134054/blog/1226580538#!. <如何学好游戏编 ...
- 智能车百度赛道培训第二弹-算法篇
智能车百度赛道培训第二弹--算法篇来袭!接住了吗?往下看!
- 生日祝福小程序_广告配音剪映零基础入门教程第二十六篇:如何给朋友制作生日祝福视频...
经常听到小伙伴问到生日祝福视频怎么做,当然我想既然要为他人做生日祝福视频,那么这个人必定是自己身边比较重要的人,而生日又是每个人都是非常重要的,在这种充满意义的时刻,我们想给自己极其重要的人送上一份祝 ...
最新文章
- 生物信息学常见数据格式 • fasta • fastq • gff/gtf 练习题
- 安装openssh 到 am5728 板子上
- bzoj2154: Crash的数字表格
- C语言程序设计答案黄保和编,C语言程序设计答案(黄保和编)第5章.pdf
- HTTP请求过滤器FreeBSD accf_http)
- 最有效的七大性能测试技术
- 新美国安全中心报告:中国在量子技术中占据了重要优势
- Cisco1721的简单配置
- c代码格式化_Python 只用一行代码,可以实现哪些事儿?
- 华南技术盛会:BingoDay2017在天河人才港盛大举行
- ubuntu linux指南 管理篇,Ubuntu Linux指南:管理篇 译者序
- 渗透测试-网页接口加密暴破
- 春招面试的总结与自我反省
- 35岁以上的大龄程序员们,后来都干什么去了?
- VC2010 MFC程序制作Flash动画欢迎界面
- mysql 回滚sql_Mysql误操作后使用binlog2sql快速回滚
- 虎牙直播怎么换html5,虎牙直播怎么换徽章-虎牙直播更换粉丝徽章的方法 - 河东软件园...
- mysql主从配置duxi_配置MySQL主从复制(一主一从)
- 新手入门linux必看
- 【剑指offer-54】20190907/03 字符流中第一个不重复的字符