这是我们的UserMapper.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接口名称-->
<mapper namespace="cn.dai.mapper.UserMapper"> <!-- 我们的SQL语句使用这种标签来实现 -->
<!-- id 是我们的Mapper接口中的 方法名称 -->
<!-- resultType 表示查询的结果类型,因为是List 这里我们直接填写泛型的元素类型就好了 -->
<select id="getUserList" resultType="cn.dai.pojo.User">
/* 这里填写我们的SQL语句 */
SELECT * FROM `user`;
</select> </mapper>

mapper  

  映射配置文件的根标签,有且只能存在一个

namespace  

  是我们所绑定的Mapper接口类

select  

  表示SQL语句的标签,总共是CRUD4种SQL语句标签

  即我们的:

    SELECT

    INSERT

    UPDATE

    DELETE

id  

  我们的对应的接口的方法名称

resultType 

  查询后的结果集类型,是List集合就是我们所泛型的类型

parameterType

  参数类型,填写注入SQL的类型即可

DAO的编写流程 ×

Mapper的编写流程 √

1、编写接口

2、编写抽象SQL方法

3、编写接口映射配置文件

4、编写SQL标签

5、回到核心配置注册映射文件

补全我们的DAO接口,口胡是Mapper

public interface UserMapper {
List<User> getUserList(); User getUserById(int id); int addUser(User user); int updateUserById(User user); int deleteUserById(int id);
}

补全映射配置

<?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接口名称-->
<mapper namespace="cn.dai.mapper.UserMapper"> <!-- 我们的SQL语句使用这种标签来实现 -->
<!-- id 是我们的Mapper接口中的 方法名称 -->
<!-- resultType 表示查询的结果类型,因为是List 这里我们直接填写泛型的元素类型就好了 -->
<select id="getUserList" resultType="cn.dai.pojo.User">
/* 这里填写我们的SQL语句 */
SELECT * FROM `user`;
</select> <!-- parameterType="int" 表示参数类型,也就是说我们只能配置1个参数-->
<select id="getUserById" resultType="cn.dai.pojo.User" parameterType="int">
/* #{user_id} 表示预编译SQL注入,普通SQL注入是 ${} 这个里面的user_id是实体类的,不是数据表的 */
SELECT * FROM `user` WHERE `user_id` = #{user_id};
</select> <!-- 增删改都不需要填写结果类型,因为只返回操作的结果记录数 -->
<insert id="addUser" parameterType="cn.dai.pojo.User" >
/* 这里我们设置的自增,所以主键可以不需要设置,注入实例时主键为null即可 */
INSERT
INTO `user`(user_name,user_password)
VALUES(#{user_name},#{user_password});
</insert> <!-- 修改语句-->
<update id="updateUserById" parameterType="cn.dai.pojo.User" >
UPDATE `user`
SET
user_name = #{user_name},
user_password = #{user_password})
WHERE
user_id = #{user_id};
</update> <!-- 删除语句-->
<delete id="deleteUserById" parameterType="int">
DELETE FROM `user`
WHERE user_id = #{user_id};
</delete>
</mapper>

开始测试【核心配置已经注册了】

发现异常问题

我在这里找了很久才发现,Mybatis会将注释中的注入表达式也会读取

我们将 $ 符号和{}区分开来再进行测试

结果还是报错

因为前面的注释的预编译SQL注入也会读取

这个东西也要区分开来

再次测试,访问成功

实际上是这样映射的

我们可以把映射配置的user_id改成id试试

这样还是能被读取到,也就是说基本类型,只要类型一致,

Mybatis如果匹配不了标识符,就会根据类型匹配

只要符合类型,依然能够查询出来,不过最好还是规范书写

剩余的增删改测试

增加  INSERT

如果实体类对应主键类型是基本类型,在注入实体类对象时,这个主键不可为null,必须赋值,

在我们的数据表的主键约束中设置了自增约束,这个情况就很尴尬了

所以为什么要设置实体类的主键类型为包装类了

可以看到我们的操作结果返回了1,说明操作是成功的

但是,查看数据库之后,并没有这个记录,

这是因为Mybatis的事务管理是默认开启的!!!

执行提交

sqlSession.commit();

再次查看结果,成功

如果要关闭事物可以在获取会话对象时,注入参数为true

修改

写错一个字符都有可能不通过

    @Test
public void queryOne3(){
// 获取会话对象
SqlSession sqlSession = MybatisUtil.getSqlSession();
// 获得映射实现实例
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用接口方法
int r = mapper.updateUserById(new User(17,"阿花","332211"));
System.out.println(r);
// 成功再提交,否则无意义
if ( r > 1) sqlSession.commit();
// 释放资源
sqlSession.close();
}

测试成功

删除

    @Test
public void queryOne4(){
// 获取会话对象
SqlSession sqlSession = MybatisUtil.getSqlSession();
// 获得映射实现实例
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用接口方法
int i = mapper.deleteUserById(17);
System.out.println(i);
if ( i > 1) sqlSession.commit();
// 释放资源
sqlSession.close();
}

测试成功


出现的错误总结:

1、SQL语句注释中的注入表达式也会被Mybatis读取

  所以要小心表达式字符

2、参数的标识设置尽可能的规范

  演示的这段虽然没有出错,

  是因为基本类型Mybatis可以识别匹配,但是要注意!!!

3、Mybatis的事务管理的默认开启的

  除了查询,增删改在执行成功的情况下需要提交

4、SQL语句不要写错.

  我也是没看仔细

5、注意主键映射的Java数据类型

  如果没有在数据表设置自增约束,

  Java的映射数据类型,可以基本int也可以包装类

  如果是自增列,Java对象注入SQL时可以写null,

  int类型也不是不能写,就是主键的编号会打乱【不推荐】


【Mybatis】02 快速入门Part2 补完CRUD的更多相关文章

  1. Mybatis Plus (特性、快速入门、日志、CRUD)

    Mybatis plus 可以节省很多的工作,所有的CRUD JPA yk-mapper Mybatis plus 偷懒的 简介: MyBatis-Plus(opens new window)(简称 ...

  2. mybatis框架快速入门

    通过快速入门示例,我们发现使用mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis要求编写两个配置文件,就可以实现功能.远比我们之前的jdbc方便多了.(我们使用 ...

  3. MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  4. (转) MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  5. SpringData JPA快速入门和基本的CRUD操作以及Specifications条件查询

    SpringData JPA概述: SpringData JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作 ...

  6. springboot笔记02——快速入门quickstart

    前言 学习一个新的框架,往往会用一个quickstart快速入门,这次就写一下springboot的quickstart程序. 开发环境 JDK 1.8 Springboot 2.1.6 Maven ...

  7. Mysql快速入门(看完这篇能够满足80%的日常开发)

    这是一篇mysql的学习笔记,整理结合了网上搜索的教程以及自己看的视频教程,看完这篇能够满足80%的日常开发了. 菜鸟教程:https://www.runoob.com/mysql/mysql-tut ...

  8. mybatis的快速入门

    说明: 在这个部分,会写个简单的入门案例. 然后,会重新写一个,更加严格的程序案例. 一:案例一 1.最终的目录结构 2.新建一个普通的Java项目,并新建lib 在项目名上右键,不是src. 3.导 ...

  9. spring3.0+mybatis+spring快速入门

    一.首先奉上项目目录结构: 说明: dao,mapping,model包下的所有内容可以使用Generator工具自助生成. 具体用法,可以网上学习一下,比较简单,主要做以下工作: 1.提供相关的数据 ...

  10. MyBatis框架——快速入门

    主流的ORM框架(帮助开发者实现数据持久化工作的框架): 1.MyBatis: 半自动化ORM框架,半自动:指框架只完成一部分功能,剩下的工作仍需开发者手动完成. MyBatis 框架没有实现 POJ ...

随机推荐

  1. Python实现字符串模糊匹配

      在一个字符串中,有时需对其中某些内容进行模糊匹配以实现条件的判定,如在"你好,hello,world"中判断是否含有"llo".Python中通过re.se ...

  2. OPA Gatekeeper:Kubernetes的策略和管理

    目录 一.系统环境 二.前言 三.OPA Gatekeeper简介 四.在kubernetes上安装OPA Gatekeeper 五.gatekeeper规则 5.1 使用gatekeeper禁止某些 ...

  3. webpack处理静态资源

    像项目中字体资源是不需要进行打包处理的,可以直接的通过复制方式给打包到目标目录中 # 安装 npm i -D copy-webpack-plugin # 引入 const CopyPlugin = r ...

  4. SpringBoot系列(六)如何使用 MockMvc 或者 RestTemplate 发请求进行单元测试

    本文主要功能: 对最简单的/hello接口,如何编写单元测试用例. 1.首先,要引入以下依赖 <dependency> <groupId>org.springframework ...

  5. fontawesome-webfont.woff:1 Failed to load resource: the server responded with a status of 404 ()

    fontawesome-webfont.woff2:1 Failed to load resource: the server responded with a status of 404 ()fon ...

  6. nordic的nrf52系列——ADC在使用时如何校准增益误差(基于SDK)

    简介:ADC在实际使用的时候都要进行误差校准,那Nordic的nrf52系列如何进行校准,如果不校准又有什么影响尼,接下来我将通过实验进行测试,验证不校准和校准的影响(本测试的基础是,默认输入阻抗和采 ...

  7. H5弹窗底层滑动

    H5弹窗底层滑动 背景 产品提出H5 弹出窗滑动时,底层页面也会跟随滑动,需要调整禁止底层滑动,增加用户体验. 问题产生原因 ios 滑动时有回弹效果 顶层元素滑动默认行为 解决办法 阻止元素的默认( ...

  8. mklink命令使得OneDrive同步任意一个文件夹

      本文介绍利用mklink命令,使得OneDrive自动同步电脑中任意指定文件夹的方法.   OneDrive是由微软提供的云存储和文件同步服务.它提供了大量的云存储空间,允许用户将文件和数据存储在 ...

  9. python UI自动化,怎么在控制台调试代码?

    Chrom 控制台调试脚本 http://testingpai.com/article/1606720137383 可以在任意网页按 F12 进入开发者工具,选择 console 输入 JS 代码: ...

  10. /etc/shadow文件破解,密码破解,md5,SHA256,SHA512破解

    环境 Kali系统 John the Ripper密码破解者 shadow文件解析 文件的格式为: {用户名}:{加密后的口令密码}:{口令最后修改时间距原点(1970-1-1)的天数}:{口令最小修 ...