Java基础入门day72

day72

mybatis

mybatis的实现方式

三种实现方式:

  • 纯xml方式,namespace随便写,id随便写,只要保证整个项目namespace+id唯一即可

  • xml+接口的方式,namespace必须是接口的全路径,id必须是接口的方法名,结合第一种方式,接口中不允许存在重载的方法

  • 纯注解方式,注册时需要在mybatis的核心配置文件中设置mapper的class,或者mappers下面配置package

xml+接口方式
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
​
 <settings>
     <!--日志实现-->
     <setting name="logImpl" value="STDOUT_LOGGING"/>
 </settings>
​
 <environments default="development">
     <environment id="development">
         <transactionManager type="JDBC"/>
         <dataSource type="POOLED">
             <property name="driver" value="com.mysql.jdbc.Driver"/>
             <property name="url" value="jdbc:mysql://localhost:3306/mi?useSSL=false&amp;characterEncoding=UTF-8"/>
             <property name="username" value="root"/>
             <property name="password" value="Abc@1234"/>
         </dataSource>
     </environment>
 </environments>
 <mappers>
     <mapper resource="com/saas/dao/ProductsMapper.xml"/>
<!--        <mapper class="com.saas.dao.IProductDaoAnnotation"/>-->
<!--        <package name="com.saas.dao"/>-->
 </mappers>
</configuration>

在mybatis-config的核心配置文件中,设置mappers节点,里面放mapper节点,mapper标签中使用resource属性加入xml文件路径

package com.saas.pojo;
​
import lombok.Data;
​
@Data
public class Product {
 private int cid     ;
 private String title   ;
 private String subtitle;
 private String wtype   ;
 private String img     ;
 private String cdesc   ;
 private double oprice  ;
 private double nprice  ;
 private int tid     ;
}
package com.saas.dao;
​
import com.saas.pojo.Product;
​
import java.util.List;
​
public interface IProductDao {
​
 List<Product> getAllProducts();
​
 Product getProductById(int i);
​
 int updateProduct(Product product);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.saas.dao.IProductDao">
 <select id="getAllProducts" resultType="com.saas.pojo.Product">
     select * from products
 </select>
​
 <select id="getProductById" resultType="com.saas.pojo.Product">
     select * from products where cid = #{cid}
 </select>
​
 <update id="updateProduct">
     update products set title = #{title}, subtitle = #{subtitle}, wtype = #{wtype} , img = #{img} ,
         cdesc = #{cdesc} , oprice = #{oprice}, nprice = #{nprice}, tid = #{tid}  where cid = #{cid}
 </update>
</mapper>

这里要特别注意:

namespace必须是接口的全路径

id必须是接口中的每个方法的方法名

由于之前mybatis中不能存在同namespace+id的场景,所以接口中不允许存在重载方法

package com.saas.dao;
​
import com.saas.pojo.Product;
import com.saas.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
​
import java.util.List;
​
public class TestProducts {
​
 private SqlSession session = null;
​
 @Test
 public void testGetAllProducts() {
​
     session = SessionUtil.getSession();
​
     IProductDao iProductDao = session.getMapper(IProductDao.class);
​
     List<Product> list = iProductDao.getAllProducts();
​
     for (Product p : list) {
         System.out.println(p);
     }
​
     SessionUtil.closeSession(session);
 }
​
 @Test
 public void testGetProductById() {
     session = SessionUtil.getSession();
     IProductDao iProductDao = session.getMapper(IProductDao.class);
     Product product = iProductDao.getProductById(1);
     System.out.println(product);
     SessionUtil.closeSession(session);
 }
​
 @Test
 public void testUpdateProduct() {
     session = SessionUtil.getSession();
     IProductDao iProductDao = session.getMapper(IProductDao.class);
​
     Product product = new Product();
     product.setCid(3);
     product.setTitle("iphone");
     product.setOprice(16999);
     product.setNprice(12999);
     product.setCdesc("iphone 15");
     product.setTid(1);
     product.setSubtitle("iphone15promax");
     product.setImg("ip15.jpg");
     product.setWtype("taobao");
​
     int i = iProductDao.updateProduct(product);
​
     System.out.println(i > 0);
​
     SessionUtil.closeSession(session);
 }
}

这里注意,我们需要结束SqlSession对象的getMapper()方法,方法参数设置接口的类对象,来得到接口对象

一旦有了接口对象,则借助该接口对象调用接口中的方法即可完成所有的crud功能

测试完成其crud功能

纯注解方式

按照之前两种方式,最直接的结果是,每个crud方法最终都对应一个正确的SQL语句即可,所以注解方式更“直接”

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
​
 <settings>
     <!--日志实现-->
     <setting name="logImpl" value="STDOUT_LOGGING"/>
 </settings>
​
 <environments default="development">
     <environment id="development">
         <transactionManager type="JDBC"/>
         <dataSource type="POOLED">
             <property name="driver" value="com.mysql.jdbc.Driver"/>
             <property name="url" value="jdbc:mysql://localhost:3306/mi?useSSL=false&amp;characterEncoding=UTF-8"/>
             <property name="username" value="root"/>
             <property name="password" value="Abc@1234"/>
         </dataSource>
     </environment>
 </environments>
 <mappers>
<!--        <mapper resource="com/saas/dao/ProductsMapper.xml"/>-->
     <mapper class="com.saas.dao.IProductDaoAnnotation"/>
<!--        <package name="com.saas.dao"/>-->
 </mappers>
</configuration>

在mybatis的核心配置文件中,mappers节点放入mapper子节点,mapper标签中使用class属性来实现主责功能

或者在mappers节点中放入package子节点,里面写name为包名,那就意味着这个包下的所有dao类都可以被一次性注册到mybatis的核心工厂之上

package com.saas.dao;
​
import java.util.List;
import com.saas.pojo.Product;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
​
public interface IProductDaoAnnotation {
​
 @Select("select * from products")
 List<Product> getAllProducts();
​
//    @Select("select * from products limit #{param1}, #{param2}")
//    @Select("select * from products limit #{arg0}, #{arg1}")
 @Select("select * from products limit #{si}, #{ps}")
 List<Product> getProductsByPage(@Param("si") int si, @Param("ps") int ps);
​
​
 @Select("select * from products where cid = #{cid}")
 Product getProductById(int cid);
​
 @Insert("insert into products(title,subtitle,wtype,oprice,tid,img,cdesc,nprice) " +
         " values(#{title},#{subtitle},#{wtype},#{oprice},#{tid},#{img},#{cdesc},#{nprice})")
 int saveProduct(Product product);
}

第三种调用方式与第二种类似

需要借助SqlSession对象的getMapper()方法,将接口的类对象传入后得到接口对象

一旦有了接口对象,则通过接口对象的crud方法完成对应的curd功能

mybatis传参

无参:SQL语句里面不写占位符

一参:SQL语句里面#{}里面写任意合法的标识符

多参:

  • 对象传参

  • map传参

  • arg0, arg1, arg2

  • param1, param2, param3

  • @Param(“si”), @Param("si")

config配置

properties

<properties resource="db.properties">
</properties>

settings

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="safeResultHandlerEnabled" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
<setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
<setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
<setting name="callSettersOnNulls" value="false"/>
<setting name="returnInstanceForEmptyRow" value="false"/>
<setting name="logPrefix" value="exampleLogPreFix_"/>
<setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/>
<setting name="proxyFactory" value="CGLIB | JAVASSIST"/>
<setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/>
<setting name="useActualParamName" value="true"/>
<setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/>
</settings>

类型别名

 <typeAliases>
     <typeAlias type="com.saas.pojo.Product" alias="Product"/>
     <package name="com.saas.pojo"/>
 </typeAliases>

环境配置

<environments default="development">
 <environment id="development">
     <transactionManager type="JDBC"/>
     <dataSource type="POOLED">
         <property name="driver" value="${driver}"/>
         <property name="url" value="${url}"/>
         <property name="username" value="${user}"/>
         <property name="password" value="${pass}"/>
     </dataSource>
 </environment>
</environments>

其中datasource的type有三个值:

  • unpooled:不使用连接池

  • pooled:使用连接池

  • jndi:需要额外配置应用服务器

其中transactionManager的type值有两个:

  • JDBC: jdbc自身的提交或者回滚来实现事务

  • MANAGED:由容器自动决定事务的提交或者回滚

映射器

    <mappers>
<!--        <mapper resource="com/saas/dao/ProductsMapper.xml"/>-->
        <mapper class="com.saas.dao.IProductDaoAnnotation"/>
<!--        <package name="com.saas.dao"/>-->
    </mappers>

映射器的配置分为两大类

  • mapper子节点

    • resource,配置xml文件的相对路径

    • url: 配置xml文件的 绝对路径

    • class:配置映射的文件类

  • package子节点:该包下是所有类都会被自动映射

mapper映射

  • cache – 该命名空间的缓存配置。

  • cache-ref – 引用其它命名空间的缓存配置。

  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。

  • parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。

  • sql – 可被其它语句引用的可重用语句块。

  • insert – 映射插入语句。

  • update – 映射更新语句。

  • delete – 映射删除语句。

  • select – 映射查询语句。

	<sql id="allPro">
        select * from products
    </sql>

    <select id="getAllProducts" resultType="abc">
        <include refid="allPro"/>
    </select>

    <select id="getProductById" resultType="abc">
        <include refid="allPro"/>
        where cid = #{cid}
    </select>

    <select id="getProductsByPage" resultType="abc">
        <include refid="allPro"/>
        limit #{si}, #{ps}
    </select>

    <update id="updateProduct">
        update products set title = #{title}, subtitle = #{subtitle}, wtype = #{wtype} , img = #{img} ,
            cdesc = #{cdesc} , oprice = #{oprice}, nprice = #{nprice}, tid = #{tid}  where cid = #{cid}
    </update>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/753347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「2024抢先看」6款免费的ai变声器,助你开麦就变声

你是否也曾想模仿电视剧中的明星说话&#xff0c;或者想像泰勒一样有着独特的嗓音呢&#xff1f;通过免费版ai变声器&#xff0c;你可以轻松实现实时变声&#xff0c;将你的声音转换为专业且动听的声音&#xff0c;让身边的朋友对你刮目相看。在本文中&#xff0c;小编将分享20…

服务器日志事件ID4107:从自动更新 cab 中提取第三方的根目录列表失败,错误为: 已处理证书链,但是在不受信任提供程序信任的根证书中终止。

在查看Windows系统日志时&#xff0c;你是否有遇到过事件ID4107错误&#xff0c;来源CAPI2&#xff0c;详细信息在 http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab 从自动更新 cab 中提取第三方的根目录列表失败&#xff0c;…

简单的本地局域网的前后端接口联调

由于项目被赶进度了&#xff0c;急于前后端联调接口&#xff0c;但是我又没钱买服务器&#xff08;主要我也不会部署&#xff09;&#xff0c;所以我这里就紧急找一个后端的大神朋友请教了一下&#xff1a;苏泽SuZe-CSDN博客 提示&#xff1a;这里不讲后端怎么写接口、前端怎么…

C#——里氏转换详情

里氏转换 里氏转换就是派生类的对象赋值给父类对象&#xff0c;反之则不行 实例 : 先创键一个类然后继承 调用

双路视频同屏显示(拼接)-基于野火Zynq7020开发板

前情提要 米联客FDMA驱动OV5640摄像头—基于野火Zynq7020开发板 本文在此基础上&#xff0c;实现了双路视频拼接。将ov5640输出的1024600的图像数据缩放为512600&#xff0c;分两路写入ddr3&#xff0c;并且显示在1024*600的RGB屏幕中。 纯FPGA也可以按此方法实现。 总体BLOC…

【C++ 初阶路】--- 类和对象(末)

目录 一、const成员1.1 取地址及const取地址操作符重载 二、再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字 三、static成员3.1 概念3.2 特性 四、友元4.1 友元函数4.2 友元类 五、内部类六、匿名对象 一、const成员 将const修饰的“成员函数”称之为const成…

Qt creator实现一个简单计算器

目录 1 界面设计 2 思路简介 3 代码 目录 1 界面设计 ​2 思路简介 3 代码 3.1 widget.h 3.2 widget.c 4 完整代码 在这里主要记载了如何使用Qt creator完成一个计算器的功能。该计算器可以实现正常的加减乘除以及括号操作&#xff0c;能实现简单的计算器功能。 1 界…

北京站圆满结束!MongoDB Developer Day上海站,周六见!

上周六 MongoDB Developer Day首站北京站 80位开发者与MongoDB一起度过了充实的一天 专题讲座➕动手实操➕专家面对面交流 从数据建模、进阶查询技巧 到Atlas搜索与向量搜索 让参会伙伴们直呼“满满的技术干货&#xff01;” 全体参会者与工作人员合影 MongoDB Developer …

【unity笔记】五、UI面板TextMeshPro 添加中文字体

Unity 中 TextMeshPro不支持中文字体&#xff0c;下面为解决方法&#xff1a; 准备字体文件&#xff0c;从Windows系统文件的Fonts文件夹里拖一个.ttf文件&#xff08;C盘 > Windows > Fonts &#xff09; 准备字库文件,新建一个文本文件&#xff0c;命名为“字库”&…

Vue组件化、单文件组件以及使用vue-cli(脚手架)

文章目录 1.Vue组件化1.1 什么是组件1.2 组件的使用1.3 组件的名字1.4 嵌套组件 2.单文件组件2.1 vue 组件组成结构2.1.1 template -> 组件的模板结构2.1.2 组件的 script 节点2.1.3 组件的 style 节点 2.2 Vue组件的使用步骤2.2.1 组件之间的父子关系2.2.2 使用组件的三个步…

低代码+定制:优化项目管理的新方案

引言 在当今快速变化的商业环境中&#xff0c;企业需要更加灵活、高效的项目管理工具。低代码平台作为一种新的开发方式&#xff0c;因其能够快速构建应用程序而受到广泛关注。与此同时&#xff0c;软件定制开发仍然是满足特定复杂需求的重要手段。在项目管理中&#xff0c;低代…

建筑可视化中使用云渲染的几大理由

在建筑行业中&#xff0c;可视化技术已成为不可或缺的一部分。无论是设计方案的展示、施工进度的模拟&#xff0c;还是最终效果的呈现&#xff0c;建筑可视化都发挥着至关重要的作用。 建筑可视化是指通过计算机技术和图形学算法&#xff0c;将建筑设计、规划和施工过程中的数据…

社交风潮塑造者:探索用户在Facebook的影响力

在当今数字化社会中&#xff0c;Facebook不仅是人们社交互动的主要平台&#xff0c;更是塑造社交风潮和文化趋势的重要力量。本文将从另一个角度深入探讨用户在Facebook上的影响力&#xff0c;探索其如何通过个人行为和互动&#xff0c;影响和改变社会的各个方面。 个人表达和内…

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐&#xff0c;充当着区域政府或园区的千里眼和顺风耳&#xff0c;可以用来捕捉与区域经济发展相关的信息&#xff0c;也可以用来倾听企业的诉求&#xff0c;更是成为了区域深抓企业服务的多面手。 同时&#xff0c;一站式…

AI 卖货主播大模型:Streamer-Sales 销冠!MoneyPrinterTurbo :简直就是营销号的梦想工具!

AI 卖货主播大模型&#xff1a;Streamer-Sales 销冠!MoneyPrinterTurbo &#xff1a;简直就是营销号的梦想工具&#xff01; AI 卖货主播大模型&#xff1a;Streamer-Sales 销冠! 项目简介 Streamer-Sales 销冠 —— 卖货主播大模型 是一个能够根据给定的商品特点从激发用户购…

linux中 nginx+tomcat 部署方式 tomcat挂掉设置自动启动

在Linux环境下&#xff0c;要实现当Tomcat挂掉后自动重启&#xff0c;可以通过编写Shell脚本结合cron定时任务或者使用系统守护进程&#xff08;如Systemd、Upstart或SysVinit&#xff09;来完成。 使用Shell脚本和cron定时任务 编写检查并重启Tomcat的Shell脚本&#xff1a;首…

我的创作纪念日学期总结

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; 关于博主 目录 &#x1f308;前言&#x1f525;我的期末考试&#x1f525;我的学期总结&#x1f525;对未来的展望&#x1f308;结语 &#x1f308;前言 本篇博客主要内容&#xff1a;博…

maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包

一 、springboot jar包 maven的pom文件 1 在resources下放了一些文件想打进去jar包 2 在lib下放了其他稀奇古怪jar包文件想打进去jar包 编写如下引入jar <build><!-- 打包名称 --><finalName>${project.artifactId}</finalName><resources><…

在预训练语言模型主流架构

文章目录 编码器-解码器架构因果解码器架构前缀解码器架构在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式,并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-d…

重磅!UOSDN焕新,开启创新之旅!

亲爱的开发者们 经过精心打磨和优化 全新改版的UOSDN&#xff08;统信开发者支持网络&#xff09; 已经正式上线啦&#xff01; 我们致力于为您打造一个更加便捷、高效、富有创意和互动性的开发平台&#xff0c;详情&#x1f449;https://uosdn.uniontech.com/ 以UOSDN作为载…