Mybatis(一)

spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用 集成spring,hibernate,并且自写了一个sql的解析器,只有controller和service层,非常方便 立即下载

1.MyBatis简介

作用:封装了JDBC操作,简化数据库访问代码
封装功能如下:
①–封装了获取连接,执行SQL,释放连接
②–封装了SQL参数设置

insert into emp(name,age) values(?,?)  
---->
insert into emp (name,age) values (#{name},#{age})

③–封装了记录映射成实体对象过程
(实体类属性名与查询结果集ResultSet中列名保持一致)

2. 流程

未整合spring的mybatis

①src/SqlMapConfig.xml主配置文件,整合spring后,就在spring的配置中配
②entity(POJO)
③xml中配sql(通常给每个xml还写一个接口,不写也不会错)

主配置

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration             
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" 
      "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<!-- 配置环境变量 --> 
<configuration>
    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" 
                    value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql:///javaweb?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <!-- 配置mappers,即加载SQL定义文件 -->

    <mappers>
        <mapper resource="cn/whbing/mybatis/entity/EmpSqlMapper.xml" />
    </mappers>

</configuration> 

entity

public class Emp implements Serializable{
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;
    ... ...

mapper ( EmpSqlMapper.xml )

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="cn.whbing.mybatis.entity.EmpSqlMapper">

    <select id="findAll" 
        resultType="cn.whbing.mybatis.entity.Emp">
        select * from emp
    </select>

    <select id="findLikeName" 
        parameterType="string"
        resultType="cn.whbing.mybatis.entity.Emp">
        select * from emp 
        where name like #{name}
    </select>

    <select id="findById" parameterType="int"
        resultType="cn.whbing.mybatis.entity.Emp">
        select * from emp 
        where id=#{id}
    </select>

    <insert id="save" parameterType="cn.whbing.mybatis.entity.Emp">
        insert into emp(name,salary,age) values (#{name},#{salary},#{age})----①
    </insert>

    <delete id="delete" parameterType="int">
        delete from emp where id=#{eid}
    </delete>

    <update id="updateSalary" parameterType="cn.whbing.mybatis.entity.Emp">
        update emp set salary=#{salary} where id=#{id}
    </update>


</mapper>

注:多参数时,如①,#{}中的内容和实体类字段一样。

测试

通过SqlSessionFactoryBuilder获得SqlSessionFactory再获得SqlSession的过程,我们可以将其单独写成工具类(单例模式),然后获取session操作。

public class MyBatisUtil {
    public static SqlSession getSqlSession(){
        String resource = "SqlMapConfig.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = TestEmp.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //获取SqlSession
        SqlSession session = factory.openSession();
        return session;
    }
}
public class TestEmp {
    public static void main(String[] args) throws IOException {
        SqlSession session = MyBatisUtil.getSqlSession();
        List<Emp> list =session.selectList("findAll");
        for (Emp emp : list) {
            System.out.println(emp.getName());
        }
        Emp emp2=session.selectOne("findById",12);
        System.out.println(emp2.getName());
        List<Emp> list3=session.selectList("findLikeName","%志%");
        for (Emp emp3 : list3) {
            System.out.println(emp3.getName());
        }
        ... ...

改进

  1. 若只需要实体中很多字段的很少个字段,封装成实体类会导致很多字段为空。
    可以封装成map
    CostMapper.xml:
    <select id="findMap" resultType="map">
        select cost_id,name from cost 
    </select>

测试:

List<Map<String,Object>> list=session.selectList("findMap");
for (Map<String, Object> map : list) {               
    System.out.println(map.get("cost_id")+":"+map.get("name"));
}

进阶:Mapper映射器接口规则

1.返回数据类型
–实体对象
–Map集合
–基本值

2.Mapper映射器接口规则
a.根据SQL定义的id属性当接口方法名
b.根据SQL定义的parameterType类型当方法参数类型
c.根据SQL定义的resultType类型定义方法返回类型
  (多行使用List<泛型>; 单行使用泛型)
d.将SQL定义文件的namespace属性指定成包名.接口名

1.CostMapper.xml

这里写图片描述
1.DAO接口
这里写图片描述

3.说明:为什么接口和xml对应起来呢?

相当于xml中的操作是对接口的实现方法。Xml相当于给我们做了实现类。那么如何获得这个对象呢?
CostDao costDao=session.getMapper(CostDao.class);
System.out.println(costDao.getClass());
结果:class com.sun.proxy.$Proxy0
Proxy0就相当于实现类。
接下来就可以用实例调用方法,如costDao.findAll();

4.测试使用映射器接口后的方法:

costDao=session.getMapper(CostDao.class);
List list=costDao.findAll();
for (Cost cost : list) {
System.out.println(cost.getName());
}

2. 整合spring的mybatis

spring.xml的配置(直接在spring的注配置中配)

<!-- 要获得mapper(及接口)和Sqlsession才可以得到dao的对象 -->
<bean id="costDao"class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="cn.whbing.dao.CostDao"></property>
    <property name="sqlSessionFactory" ref="ssf"></property>
</bean>   

<!-- 创建sqlsessionfacory -->
<beanid="ssf"class="org.mybatis.spring.SqlSessionFactoryBean">
    <propertyname="dataSource"ref="dbcp"></property>
    <propertyname="mapperLocations"value="classpath:cn/whbing/sql/*.xml"></property>
</bean>

<!-- 定义dbcp的DataSource -->
<beanid="dbcp"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="username"value="root">
    </property>
    <property name="password"value="root">
    </property>
    <property name="url"
    value="jdbc:mysql:///javaweb?useUnicode=true&amp;characterEncoding=utf8">
    </property>
    <property name="driverClassName"
       value="com.mysql.jdbc.Driver">
    </property>
</bean>
说明:上述第二步中加载了mybatis每个表的xml,相当于完成了mybatis的主配置xml文件。因此不再需要mybatis主配置xml文件。

测试:

public class CostDaoTest {
   public staticvoid main(String[] args) {
      ApplicationContext ac= new ClassPathXmlApplicationContext("spring.xml");
      CostDao costDao=ac.getBean("costDao",CostDao.class);
      List<Cost> list=costDao.findAll();
      for (Cost cost : list) {
         System.out.println(cost.getName());
      }
   }
}

原理

http://blog.youkuaiyun.com/hupanfeng/article/details/9068003/

http://www.cnblogs.com/caiguoqing/p/6889394.html

http://blog.youkuaiyun.com/ykzhen2015/article/details/50315027

linux arm64 Debian12移植操作手册 2023年6月10号Debian官方出了debian12 arm64版本的。如果需要完全适配这个系统的话,需要linux6.10版本。应客户的需求,需要在Debian11升级为Debian12版本。 阅读详情

相关推荐

radsystems的激活(破解)和使用

上个文章讲述了radsystems的下载,但是只有30天的免费使用权,这篇文章将会讲解如何破解激活radsystems。注意:如果不想去官网下载的话,点击安装包的exe文件。不要急,打开我给你们的安装包,点击crack。如果提示done则完成(我的是激活过的)注意:这是8.7版本的。点击generate。

weixin_65144487的博客 3514

通用DAO之MyBatis封装,封装通用的增删改查(二)

曾经发过一篇文章,大概写的就是阿海多么多么厉害,见到某位同事在Hibernate的基础上封装了一下,就以一己之力开发什么什么框架,最后写了个超大的一坨的事。 那么,后续篇来了。阿海不是自负之人,当之前的CRUD框架并没有达到理想的结果时,阿海转向了Mybatis封装。别问我为什么不是Hibernate。我本来就不喜欢Hibernate,即使在之前的一家公司一直被强制性的约束使用Hibernate时

Only丿阿海的专栏 5万+

国内合规开通ChatGPT Plus实操指南:银行卡绑卡与支付全解析

ChatGPT Plus 是 OpenAI 官方推出的高级订阅服务,基于 GPT-4o 多模态大模型提供语音交互、图像理解与长上下文处理能力。其核心使用前提在于完成合规的国际支付绑定,而非网络接入方式。技术原理上,OpenAI 采用 Stripe 支付网关进行风控校验,重点匹配银行跨境权限、卡片类型(仅支持 Visa/Mastercard/Amex 信用卡)、BIN 号段及地理位置一致性。该机制决定了95%的绑卡失败源于银行端配置缺失或卡片不兼容,而非网络问题。实际应用中,PayPal 作为中间支付层可显著

chuannaoxuan4674的博客 1916

【MyBatis】MyBatis是封装了jdbc操作

sql mapper文件的标签书写 <select id="selectStudentById" parameterType="int" resultType="com.bjpowernode.domain.Student"> select id,name, email,age from student where id=${studentId} </select> MyBatis是封装了jdbc操作 使用#{}之后, mybatis执行sql是使用的jdbc中的P

AloneYue优快云 1089

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1678

STM32F407 HAL库 LIN DMA 配置实战与汽车电子应用解析

本文详细解析了STM32F407 HAL库在LIN总线通信中的DMA配置实战,重点介绍了硬件自动处理断点检测、同步场和校验和的优势。通过具体代码示例和汽车电子应用案例(如车窗控制、座椅调节),阐述了如何利用DMA提升通信效率与稳定性,为成本敏感的汽车电子系统提供高效解决方案。

study的专栏 968

Mybatis+注解+反射 封装一个通用的查询条件工具类

注解:在实体类上写上注解描述这个字段在数据库的字段名,还有查询方式,是等于查询还是小于查询。目前只做了部分的查询功能,后面还会继续完善,另外,我的个人博客也升级了,欢迎大家访问。mybatis:使用它的查询类,IService。反射:调用方法,反射获取字段上注解的信息生成。

weixin_43900374的博客 1084

CloudSat卫星数据高效下载与自动化处理指南

本文详细介绍了CloudSat卫星数据的高效下载与自动化处理方法,包括交互式图形界面和wget批量下载技巧,以及使用Python脚本实现自动化处理和数据质量控制。内容涵盖从数据准备到实战应用的完整流程,特别适合气象研究和气候建模领域的工作者提升工作效率。

weixin_28700411的博客 232

Mybatis 进行简单通用的封装

配置文件当Spring和Mybatis集成时,可以利用通配符的形式注册Mapper配置文件 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property

wwhhff11 7371

【PINN高级教程】 第1讲:函数空间与逼近理论

结论:在解决偏微分方程(PDE)时,解往往属于某个 Sobolev 空间 HsHs,其正则性受限于 PDE 的系数与边界条件;而 PINN 在训练过程中实际上是在逼近 Barron 空间中的函数。由于 Barron 空间允许高频信息的压缩,PINN 可以在参数规模较小的情况下捕捉到 PDE 解所需的细节,但其正则性保证仍然比 Sobolev 更弱。因此,在设计 PINN 时,需要通过正则化或网络结构(如残差连接、归一化层)来“逼近”Sobolev 正则性。

u012133341的博客 236

麒麟服务器操作系统QT系列软件工具手册

对Qt提供的开发工具进行了一系列的优化之后,在日常的修复bug和维护框架的过程中,桌面研发对Qt的基础软件库也进行了部分优化工作,包括qtbase、qtwayland、qtscript、qt4-x11等Qt基础组件,涉及的Qt框架版本主要涉及到5.9和5.12两个版本。qt 的翻译,是由 ts 文件生成 qm 文件然后进行翻译,国产操作系统上qt 的翻译是由单独的qttranslations包中进行维护,其次部分汉化问题也是qt组件维护工作的一部分,qt的翻译机制如图4-7所示。

太极淘的博客 542

一,初始 MyBatis-Plus

学习 MyBatis -Plus 之前,我们可以先来简单的,稍微的,回顾一下,MyBatis 框架的一些问题:这里只是简单的回顾,关于MyBatis 的更多详细内容大家可以移步至:✏️✏️✏️MyBatis_ChinaRainbowSea的博客-优快云博客我们来简单思考一下,MyBatis 框架的开发效率怎么样?开发效率也就是我们使用这款框架开发的速度快不快,是否简单好用易上手。Mapper 接口提供一个抽象方法。Mapper 接口对应的映射配置文件提供对应的标签和SQL语句。

weixin_61635597的博客 2236

手把手教你五种方案配置Obsidian免费同步,全平台通用(支持Alist/OpenList)

Obsidian是一款优秀的Markdown笔记工具,但官方同步服务每年近700元让人望而却步💸 本文整理了5种免费同步方案,涵盖苹果生态专属方案、多网盘插件同步、版本管理同步、点对点同步、自建实时同步等不同场景📱💻 每种方案都附有详细配置步骤,助你找到最适合的同步方式✨

XiaoqiangClub的博客 1832

一张图搞懂Mybatis! 真的只需要一张图!

没错, 真的只是一张图!

Coinker的博客 221

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Mybatis详解(一)

本章主要讲述了mybatis的使用方式,分为SqlSessionFactory的配置、获取SqlSession对象、获取Mapper接口、再到获取Mapper中的操作数据库的方法,最终实现对数据库的操作。

Bennett的博客 631

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

mybatis返回某一字段_Mybatis

原始JDBC存在的问题数据库连接,释放频繁造成系统资源浪费,影响系统性能。sql语句在代码中硬编码,不易维护查询结果封装到实体需要手动封装解决办法使用数据库连接池初始化连接资源将sql语句抽取到xml配置文件中使用反射,内省等底层技术,自动将实体与表的字段进行映射MybatisMybatis是一个基于java的持久层框架,内部封装了jdbc,使开发者只需要关注sql语句本身。通过xml或者注解的方...

weixin_29005499的博客 1106

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

(一)什么是Mybatis?

环境说明: jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Junit 1.什么是Mybatis MyBatis 是一款优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数

Fate的博客 252

Mybatis的一、二级缓存

Mybatis的一、二级缓存 Mybatis缓存 Mybatis包含一个非常强大的查询缓存特性,它可以非常方便的制定和配置缓存,缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存、二级缓存 1、默认情况下,只有一级缓存开启(SqlSession级别的缓存,也称为本地缓存。Connection关闭之后就失效了) 2、耳机缓存需要手动开启和配置,它基于namespace级别的缓存。 3、为了提高扩展性,Mybatis定义了缓存接口Cache来自定义缓存。 一级缓存 一级缓存也

weixin_45416687的博客 410

【MyBatis 源码拆解系列】JVM 级别缓存能力设计:MyBatis 的一、二级缓存如何设计?

最后在总结一下,MyBatis 设计了一级缓存、二级缓存,虽然二级缓存我们并不使用,但是可以了解他的一个设计原理,这里总结一下重点内容:二级缓存:二级缓存是跨 SqlSession 级别的,因此是在 MappedStatement 中存储,MappedStatement 是解析 xml 文件时构建的,因此生命周期和 MyBatis 是一直的,因此可以跨 SqlSession二级缓存的能力支持是通过来完成的,用到了装饰器模式,BaseExecutor 提供一些公有的一级缓存能力。

qq_45260619的博客 1566

Mybatis(一):Mybatis是什么

一、概述 Mybatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注sql本身。 我们原来使用JDBC操作数据库,需要手动的写代码去注册驱动、获取connection、获取statement等等,现在Mybaits帮助我们把这些事情做了,我们只需要关注我们的业务sql即可,这样可以提高我们的开发效率。 MyBatis属于半自动的ORM框架 二、Mybatis架构 SqlMapConfig.xml SqlMapConfig.xml文件是M...

qq_35382207的博客 1万+

详解MyBatis之篇一

详解如何使用MyBatis操作数据库。

. 1万+

一、Mybatis 简介

● 简介 ● 持久层框架对比 ● 快速入门(基于Mybatis3方式)

走在bug的路上 6677

MyBatis一、MyBatis简介

MyBatis

优快云全栈领域优秀博主,阿里云博客专家,工信部权威认证物联网技术开发工程师,曾30分钟高分通过C语言二级,两天手撸代码完成EasyX飞机大战,靠接软件私活一个月换苹果电脑 1279

Mybatis一、二级缓存的简单理解

Mybatis一、二级缓存的简单理解

sadjoker2048的博客 1080

MyBatis学习一

MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 几乎消除了 JDBC 代码和参数的手动设置以及 结果集的检索。MyBatis 使用简单的 XML 或注解进行配置,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射到数据库中的记录。与其他 ORM 框架不同,MyBatis 并没有将 Java 对象与数据库表关联起来,而是将方法与 SQL 语句关联。

wangqiang996的博客 1099

实验一 基于Mybatis的CRUD

select id="selectAll" resultType="com.adada.shiyanyi.pojo.Heroes">:定义了一个名为selectAll的查询操作,resultType属性指定了查询结果应该被映射到的Java类型,即com.adada.shiyanyi.pojo.Heroes。System.out::println是一个方法引用,它引用了System.out.println方法,该方法将对象的toString方法的返回值打印到控制台。7.编写Heroes类。

wenmou1111的博客 836
上一篇: SpringMVC(1)
下一篇: 各种排序算法
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值