Mybatis学习笔记--2:CRUD操作与动态代理

2023-11-12

增删改查对应Mapper配置文件里的标签。

select、update、delete、insert

1.封装MyBatisUtils工具类

public class MybatisUtils {
    public static final  SqlSessionFactory sessionFactory;
    static {
        //1.sqlSessionFactoryBuilder 加载配置文件
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //2.读取配置文件
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //3.获取session工厂
        sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
    }

    public static SqlSession openSession(){
        return sessionFactory.openSession();
    }

}

2.编写Mapper文件

<?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="myTest">
    <!--根据cust_id查询客户-->
    <select id="queryCustomerById" parameterType="Int"
            resultType="com.hbuas.sw.entity.Customer">
	  SELECT * FROM `customer` WHERE cust_id  = #{cust_id}
	</select>

    <!--查询所有-->
	<select id="queryAllCustomer" resultType="com.hbuas.sw.entity.Customer">
	   SELECT * FROM `customer`
	</select>
	<!--根据用户名模糊查询客户-->
	<select id="querytCustomerByName" parameterType="String" resultType="com.hbuas.sw.entity.Customer.Customer">
		select * from customer where cust_name like #{name};
	</select>

	<!--添加-->
	<insert id="insertCustom" parameterType="com.hbuas.sw.entity.Customer.Customer">

		/*获取插入的最后一个id*/
		<selectKey keyColumn="cust_id" keyProperty="cust_id" resultType="Integer" order="AFTER">
			select last_insert_id()
		</selectKey>

		insert into `customer`(cust_name,cust_profession,cust_phone,email)
		values (#{cust_name},#{cust_profession},#{cust_phone},#{email})
	</insert>

	<!--更新-->
	<update id="updateCustomer" parameterType="com.hbuas.sw.entity.Customer.Customer">
		update `customer` set cust_name=#{cust_name} where cust_id=#{cust_id}
	</update>

	<!--删除操作-->
	<delete id="deleteCustomer" parameterType="com.hbuas.sw.entity.Customer.Customer">
		delete from `customer` where cust_id=#{cust_id}
	</delete>
</mapper>

3.测试

//增
public void insert(){
        SqlSession sqlSession = MybatisUtils.openSession();
        Customer customer = new Customer();
        customer.setCust_name("司马懿");
        customer.setCust_phone("18912344331");
        sqlSession.insert("insertCustom",customer);
        //当要改动数据库当中的记录时,执行sql时要自己提交事务
        //手动提交事务
        sqlSession.commit();
        System.out.println(customer);
        sqlSession.close();
    }

//删
 public void delete(){
        SqlSession sqlSession = MybatisUtils.openSession();
        //删除之前要先看看有没有这条数据
        Customer customer = sqlSession.selectOne("queryCustomerById", 12);
        sqlSession.delete("deleteCustomer",customer);
        sqlSession.commit();
        sqlSession.close();
    }
//改
    public void update(){
        SqlSession sqlSession = MybatisUtils.openSession();
        Customer customer = sqlSession.selectOne("queryCustomerById", 12);
        customer.setCust_name("曹操");
        sqlSession.update("updateCustomer",customer);
        sqlSession.commit();
        sqlSession.close();
    }
//查(模糊查询)
public void test3(){
        SqlSession sqlSession = MybatisUtils.openSession();
        List<Customer> customers = sqlSession.selectList("querytCustomerByName", "%李%");
        for (Customer customer : customers) {
            System.out.println(customer);
        }
        sqlSession.close();
    }

名词解释

 parameterType:指定输入参数类型,mybatis从输入对象中获取参数值拼接在sql中

resultType: 指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为

#{}和${}
    #{}

  •         表示一个占位符号,通过#{}可以实现向占位符中设置值
  •         自动进行java类型和jdbc类型转换
  •         #{}可以有效防止sql注入
  •         #{}可以接收简单类型值或pojo属性值
  •         如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称

 ${}

  •         表示拼接sql串
  •         通过${}可以将parameterType传入的内容拼接在sql中,不进行jdbc类型转换
  •         ${}可以接收简单类型值或pojo属性值
  •         如果parameterType传输单个简单类型值,${}括号中只能是“value”

 

     /* #{}
      mapper:  select * from customer where cust_name like '%#{name}%';
      解析后:  select * from customer where cust_name like '%?%';
        表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值
       
        ***********************************************************************
         ${}
         mapper:  select * from customer where cust_name like '%${value}%';
         解析后: select * from customer where cust_name like '%李%';
        表示拼接sql串    
        * */

=====================分割线==========================

原始的Dao方式进行CRUD已经结束,下面接触一个新的概念Mapper动态代理

我们要新建一个DAO包;然后新建一个接口文件:

1.要求

  •  namespace必须和DAO接口类路径一致 
  •  id必须和DAO接口方法名一致
  • parameterType必须和接口方法参数类型一致
  • resultType必须和接口方法返回值类型一致

所以 我们新建一个CustomerMapping.java的接口文件

/*
    mapper接口编写规则:
    1.namespace必须和Mapper接口类路径一致
    2.id必须和Mapper接口方法名一致
    3.parameterType必须和接口方法参数类型一致
    4.resultType必须和接口方法返回值类型一致
**/
public interface CustomerMapper {
    /*
    * 根据cust_id查询客户
    * */
    public Customer queryCustomerById(Integer id);

    /*
    * 查询所有
    * */
    public List<Customer>queryAllCustomer();

    /*
    * 根据用户名模糊查询客户
    * */
    public List<Customer>querytCustomerByName(String name);

    /*
    * 添加
    * */
    public void insertCustom(Customer customer);

    /*
    * 更新
    * */
    public void updateCustomer(Customer customer);

    /*
    * 删除
    * */
    public void deleteCustomer(Customer customer);
}

修改我们的mapper配置文件的namespace

<?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.hbuas.sw.mapper.CustomerMapper">

	......

</mapper>

匹配的过程:(约定的过程)
1.根据 接口名 找到 mapper.xml文件(根据的是namespace=接口全类名)
2.根据 接口的方法名 找到 mapper.xml文件中的SQL标签 (方法名=SQL标签Id值)

以上2点可以保证: 当我们调用接口中的方法时,
程序能自动定位到 某一个Mapper.xml文件中的sqL标签
Test.java

SqlSession sqlSession = MybatisUtils.openSession();
CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
Customer customer = mapper.getCustomerWithID(2,"李白");
System.out.println(customer);
sqlSession.close();

通过session对象获取接口,再调用该接口中的方法,程序会自动执行该方法对应的SQL。

 

转载于:https://my.oschina.net/u/4152684/blog/3065253

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis学习笔记--2:CRUD操作与动态代理 的相关文章

随机推荐

  • Python爬虫:百度数据轻松抓取!

    百度是全球最大的中文搜索引擎 每天都有海量的数据被用户输入和查询 这些数据蕴含着巨大的商业价值 作为一名数据分析师或者算法工程师 如何利用这些数据来提升工作效率和商业竞争力呢 这时候 我们需要一种叫做 爬虫 的技术手段来帮助我们 本文将介绍
  • 关于vuepress打包之后页面样式丢失问题两种解决方案

    问题描述 最近打算使用vuepress为公司项目集成一下前端开发文档 在打包的时候遇到了样式丢失的问题 在网络上参考了一些解决方案 记录一下自己遇到的问题 有什么不足的地方多多指教 集成打包之后 打开入口文件展示页面如下 在本地直接运行的页
  • Java项目:眼镜商城系统(java+SSM+JSP+jQuery+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 管理员角色包含以下功能 管理员登录 管理员管理 管理商城会员 新闻公告管理 眼睛类型管理 城市信息管理 连锁配镜店管理 眼镜商品管理 用户订单管理 管理用户的评价信息等功能 用户角色包含以下功
  • 蓝桥杯2013年第四届真题-公式求值

    题目描述 输入n m k 输出下面公式的值 其中C n m是组合数 表示在n个人的集合中选出m个人组成一个集合的方案数 组合数的计算公式如下 输入格式 输入的第一行包含一个整数n 第二行包含一个整数m 第三行包含一个整数k 数据规模和约定
  • 通过H5(浏览器/WebView/其他)唤起本地app

    前两天接到一个无线的需求 我这个小白可是忙活了好几天 在页面上有一个连接 如果用户安装了APP 则点击打开对应的APP如果用户没有安装 则点击打开对应的设置连接 上网搜索了一下 基本都说可以实现 但是实际情况却不乐观 当然只是其中的一个需求
  • Http的body变空格的问题解决方案

    最近在做iOS的内购功能 需要把内购的凭证转化为base64传给服务器 服务器再去AppStore的接口进行二次验证 这中间有一个问题是base64编码的字符串里有 号 这样的字符 传到服务器上 号 字符就变成空格字符了 原因是我们在进行h
  • 建设数据仓库的八个步骤

    摘要 建立数据仓库是一个解决企业问题的过程 业务人员往往不懂如何建立和使用数据仓库 发挥其决策支持的作用 信息部门的人员往往又不懂业务 不知道应该建立哪些决策主题 关键词 数据仓库 元数据 建设数据仓库 建立数据仓库是一个解决企业问题的过程
  • Windows下搭建FTP服务器

    一 什么是ftp FTP 是File Transfer Protocol 文件传输协议 的英文简称 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 它也是一个应用程序 Application 基于不同的操作系统有不
  • 课程笔记1

    一 密码学原理 1 密码学中的哈希函数被称为cryptographic hash function 它具有三点性质 1 哈希碰撞 collision resistance 对于不相等的x和y 对应的哈希值H x H y 没有有效的办法人为地
  • VMWare Fusion虚拟机安装与配置教程

    很多时候 我们都有用虚拟机的需求 比如用着Mac突然有一个软件只支持Windows 并且还需要与macOS上的软件搭配使用 况且你没有Windows电脑 这个时候虚拟机就能帮上大忙 在macOS上 笔者用的是MacBook Air 所以这里
  • 刷脸支付不需要媒介将进一步推动消费升级

    从现金 银行卡 到现在的手机支付移动支付 支付媒介不断发生变化 并最终以手机这样的通用媒介代替了现金 银行卡这样的专用媒介 同时也是一个逐渐脱媒的过程 现在支付宝主推的刷脸支付则相当于在用户端完全不再需要媒介 这也将进一步推动消费升级 4月
  • Vue中如何定义一个全局变量(Trick)

    img class lazyload lazybanner 页面中图片使用懒加载 默认图片想通过全局变量实现 实现方案 Vue filter default img function str return 你的图片路径 img class
  • 【CSDN竞赛第17期】简要题解 92.5分

    目录 1 判断胜负 简单字符串 题目 题解 比赛时代码 2 买铅笔 简单算数 题目 题解 代码 3 拯救爱情 得分70 题目 题解 比赛时代码 4 拯救公主 中国剩余定理 或 模拟 题目 题解 模拟 中国剩余定理 比赛时代码 1 判断胜负
  • mongo 复制一个表的数据到另一个表中

    club表 id ObjectId 592e94fee820cc1813f0b9a2 id 1 name test club preload 表 id ObjectId 592e94fee820cc1813f07383 club id 1
  • 使用python爬取英雄联盟官方英雄皮肤图片

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可
  • EA使用教程

    文章目录 创建新工程 属性设置 导出图片到剪切板 时序图中取消消息后面自动生成的括号 在文本框中回车 取消流程图的背景渐变 导出更清晰图片 组合片段 设置字体和字体大小 官方教程地址 https sparxsystems cn enterp
  • 详解C#中的反射

    反射 Reflection 2008年01月02日 星期三 11 21 两个现实中的例子 1 B超 大家体检的时候大概都做过B超吧 B超可以透过肚皮探测到你内脏的生理情况 这是如何做到的呢 B超是B型超声波 它可以透过肚皮通过向你体内发射B
  • Web开发中的AJAX技术介绍

    读音 e j ks AJAX即 Asynchronous JavaScript and XML 异步JavaScript和XML AJAX并非缩写词 而是由Jesse James Gaiiett创造的名词 是指一种创建交互式网页应用的网页开
  • 软件大厂,环境检测思路和规避思路,安卓改机应该改什么数据和参数,安卓boot内核修改 环境检测对抗 部分参数解析

    前言 现在大厂的设备指纹层出不穷 但是想要确保稳定性和唯一性高精准其实也挺难的一件事 有的是通过设备信息比重进行的设备ID唯一值确认 比如A设备信息占比10 B设备信息占比20 当比重超过60 以上 设备指纹才会发生变化 这样的好处就是当你
  • Mybatis学习笔记--2:CRUD操作与动态代理

    增删改查对应Mapper配置文件里的标签 select update delete insert 1 封装MyBatisUtils工具类 public class MybatisUtils public static final SqlSe