【精选】框架初探篇之——MyBatis的CRUD及配置文件

MyBatis增删改查

在这里插入图片描述

MyBatis新增

在这里插入图片描述

新增用户
  1. 持久层接口添加方法

    void add(User user);
  2. 映射文件添加标签

    <insert id="add" parameterType="com.mybatis.pojo.User">insert into user(username,sex,address) values(# {username},# {sex},# {address})
    </insert>
  3. 编写测试方法

    @Test
    public void testAdd() throws Exception {InputStream is= Resources.getResourceAsStream("SqlMapConfig.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(is);SqlSession session = factory.openSession();UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User("程序员", "男", "上海");userMapper.add(user);// 提交事务session.commit();session.close();is.close();
    }

注意:

  1. 当接口方法的参数类型为POJO类型时,SQL语句中绑定参数时使用# {POJO的属性名}即可。
  2. MyBatis事务默认手动提交,所以在执行完增删改方法后,需要手动调用SqlSession对象的事务提交方法,否则数据库将不发生改变。

MyBatis修改

优化测试类

我们发现MyBatis的测试方法在操作数据库前都需要获取代理对象,操作数据库后都需要释放资源,可以利用Junit的前置后置方法,优化测试类代码。

InputStream is = null;
SqlSession session = null;
UserMapper userMapper = null;@Before
public void before() throws IOException {// (1)读取核心配置文件is = Resources.getResourceAsStream("SqlMapConfig.xml");// (2)创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();// (3)SqlSessionFactoryBuilder对象获取SqlSessionFactory对象SqlSessionFactory factory = builder.build(is);// (4)SqlSessionFactory对象获取SqlSession对象session = factory.openSession();// (5)获取代理对象userMapper = session.getMapper(UserMapper.class);
}@After
public void after() throws IOException {// 释放资源session.close();is.close();
}

这样Junit就会自动执行获取代理对象和释放资源的方法。

修改用户
  1. 持久层接口添加方法

    void update(User user);
  2. 映射文件添加标签

    <update id="update" parameterType="com.mybatis.pojo.User">update userset username = #{username},sex    = #{sex},address=#{address}where id = #{id}
    </update>
  3. 编写测试方法

    @Test
    public void testUpdate(){User user = new User(8,"程序员1","女","深圳");userMapper.update(user);session.commit();
    }

MyBatis删除、根据Id查询

删除用户
  1. 持久层接口添加方法

    void delete(int userId);
    
  2. 映射文件添加标签

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

    注:当方法的参数类型是简单数据类型时,#{}中可以写任意名称

    • 简单数据类型:基本数据类型、字符串等
  3. 编写测试方法

    @Test
    public void testDelete(){userMapper.delete(8);session.commit();
    }
根据ID查询用户
  1. 持久层接口添加方法

    User findById(int userId);
    
  2. 映射文件添加标签

    <select id="findById" parameterType="int" resultType="com.mybatis.pojo.User">select * from user where id = #{userId}
    </select>
  3. 编写测试方法

    @Test
    public void testFindById(){User user = userMapper.findById(1);System.out.println(user);
    }

MyBatis模糊查询

使用#定义参数
  1. 持久层接口添加方法

    List<User> findByNameLike(String username);
    
  2. 映射文件添加标签

    <select id="findByNameLike" parameterType="string" resultType="com.mybatis.user.User">select * from user where username like #{name}
    </select>
    
  3. 编写测试方法

    @Test
    public void testFindByNameLike(){List<User> users = userMapper.findByNameLike("%王%");for (User user:users){System.out.println(user);}
    }

我们看到在映射文件中,parameterType的值为string而没有写java.lang.String,这是为什么呢?

  • 参数/返回值类型为基本数据类型/包装类/String等类型时,我们可以写全类名,也可以写别名。
数据类型别名
byte_byte
long_long
short_short
int_int
int_integer
double_double
float_float
boolean_boolean
Stringstring
Bytebyte
Longlong
Shortshort
Integerint/integer
Doubledouble
Floatfloat
Booleanboolean
Datedate
BigDecimaldecimal/bigdecimal
Objectobject
Mapmap
HashMaphashmap
Listlist
ArrayListarraylist
Collectioncollection
Iteratoriterator
使用$定义参数

模糊查询如果不想在调用方法时参数加%,可以使用拼接参数的方式设置Sql:

<select id="findByUsernameLike" parameterType="string" resultType="com.mybatis.pojo.User">select * from user where username like '%${value}%'
</select>

测试方法写法如下:

@Test
public void testFindByNameLike(){List<User> users = userMapper.findByUsernameLike("张三");users.forEach(System.out::println);
}

#和$的区别:

  1. #表示sql模板的占位符,$表示将字符串拼接到sql模板中。
  2. #可以防止sql注入,一般能用#就不用$。
  3. ${}内部的参数名必须写value。
使用< bind>定义参数

如果使用#还不想在调用方法的参数中添加%,可以使用<bind>标签,<bind>标签允许我们在 Sql语句以外创建一个变量,并可以将其绑定到当前的Sql语句中。用法如下:

<select id="findByUsernameLike" parameterType="string" resultType="com.mybatis.pojo.User"><bind name="likeName" value="'%'+username+'%'"/>select * from user where username like #{likeName}
</select>

测试方法写法如下:

@Test
public void testFindByNameLike(){List<User> users = userMapper.findByUsernameLike("张三");users.forEach(System.out::println);
}

MyBatis分页查询

分页查询时,Sql语句使用limit关键字,需要传入开始索引和每页条数两个参数。MyBatis的多参数处理有以下方式:

顺序传参

Sql中的参数使用arg0,arg1…或param1,param2…表示参数的顺序。此方法可读性较低,在开发中不建议使用。

  1. 持久层接口方法

    /*** 分页查询* @param startIndex 开始索引* @param pageSize 每页条数* @return*/
    List<User> findPage(int startIndex,int pageSize);
    
  2. 映射文件

    <select id="findPage" resultType="com.mybatis.mapper.User">select * from user limit #{arg0},#{arg1}
    </select><select id="findPage" resultType="com.mybatis.mapper.User">select * from user limit #{param1},#{param2}
    </select>
    
  3. 测试类

    @Test
    public void testFindPage(){List<User> users = userMapper.findPage(0,3);users.forEach(System.out::println);
    }
    
@Param传参

在接口方法的参数列表中通过@Param定义参数名称,在Sql语句中通过注解中所定义的参数名称指定参数位置。此方式参数比较直观的,推荐使用。

  1. 持久层接口方法

    List<User> findPage1(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);
    
  2. 映射文件

    <select id="findPage1" resultType="com.mybatis.mapper.User">select * from user limit #{startIndex},#{pageSize}
    </select>
    
  3. 测试类

    @Test
    public void testFindPage1(){List<User> users = userMapper.findPage1(3,3);users.forEach(System.out::println);
    }
    
POJO传参

自定义POJO类,该类的属性就是要传递的参数,在SQL语句中绑定参数时使用POJO的属性名作为参数名即可。此方式推荐使用。

  1. 自定义POJO

    public class PageQuery {private int startIndex;private int pageSize;// 省略getter/setter/构造方法
    }
  2. 持久层接口方法

    List<User> findPage2(PageQuery pageQuery);
  3. 映射文件

    <select id="findPage2" resultType="com.mybatis.pojo.User" parameterType="com.mybatis.pojo.PageQuery">select * from user limit #{startIndex},#{pageSize}
    </select>
  4. 测试类

    @Test
    public void testFindPage2(){PageQuery pageQuery = new PageQuery(3, 3);List<User> users = userMapper.findPage2(pageQuery);users.forEach(System.out::println);
    }
Map传参

如果不想自定义POJO,可以使用Map作为传递参数的载体,在SQL语句中绑定参数时使用Map的Key作为参数名即可。此方法推荐使用。

  1. 持久层接口方法

    List<User> findPage3(Map<String,Object> params);
  2. 映射文件

    <select id="findPage3" resultType="com.mybatis.pojo.User" parameterType="map">select * from user limit #{startIndex},#{pageSize}
    </select>
  3. 测试类

    @Test
    public void testFindPage3(){Map<String,Object> params = new HashMap();params.put("startIndex",0);params.put("pageSize",4);List<User> users = userMapper.findPage3(params);users.forEach(System.out::println);
    }

MyBatis聚合查询、主键回填

查询用户总数
  1. 持久层接口方法

    int findCount();
    
  2. 映射文件

    <select id="findCount" resultType="int">select count(id) from user
    </select>
    
  3. 测试类

    @Test
    public void testFindCount(){System.out.println(userMapper.findCount());
    }
    
主键回填

有时我们需要获取新插入数据的主键值。如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。

  1. 持久层接口方法

    void add(User user);
    
  2. 映射文件

    <insert id="add" parameterType="com.mybatis.user.User"><!-- keyProperty:主键属性名,keyColumn:主键列名,resultType:主键类型,order:执行时机 --><selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">SELECT LAST_INSERT_ID();</selectKey>insert into user(username,sex,address) values(#{username},#{sex},#{address})
    </insert>
    

    SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键值,只适用于自增主键,且必须和insert语句一起执行。

  3. 测试类

    @Test
    public void testAdd(){User user = new User("×××", "男", "北京");userMapper.add(user);session.commit();System.out.println(user.getId());
    }

MyBatis配置文件

在这里插入图片描述

< properties>标签

MyBatis配置文件结构:

-configuration-properties(属性)-property-settings(全局配置参数)-setting-plugins(插件)-plugin-typeAliases(别名)-typeAliase-package-environments(环境)-environment-transactionManager(事务管理)-dataSource(数据源)-mappers(映射器)-mapper-package
properties

属性值定义。properties标签中可以定义属性值,也可以引入外部配置文件。无论是内部定义还是外部引入,都可以使用 ${name} 获取值。

例如:我们可以将数据源配置写到外部的db.properties中,再使用properties标签引入外部配置文件,这样可以做到动态配置数据源。

  1. 编写db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=root
  2. 在配置文件中引入db.properties

    <properties resource="db.properties"></properties><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment>
    </environments>

当然我们也可以将数据源数据通过<properties>配置到MyBatis配置文件内,但这样做没什么意义。

<properties><property name="jdbc.driver" value="com.mysql.jdbc.Driver"></property><property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis"></property><property name="jdbc.username" value="root"></property><property name="jdbc.password" value="root"></property>
</properties><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment>
</environments>

< settings>标签

<settings>是配置MyBatis运行时的一些行为的,例如缓存、延迟加载、命名规则等一系列控制性参数。后期我们会使用该标签配置缓存和延迟加载等。

< plugins>标签

<plugins>是配置MyBatis插件的。插件可以增强MyBatis功能,比如进行sql增强,打印日志,异常处理等。后期我们会使用该标签配置分页插件。

< typeAliases>标签

MyBatis对常用类有默认别名支持,比如java.lang.Stirng的别名为string。除此之外,我们也可以使用<typeAliases>设置自定义别名。

为一个类配置别名
<typeAliases><typeAlias type="全类名" alias="别名"></typeAlias>
</typeAliases>

此时我们即可在映射文件中使用自定义别名,如:

  1. 配置文件:

    <typeAliases><typeAlias type="com.mybatis.pojo.User" alias="User">     </typeAlias>
    </typeAliases>
    
  2. 映射文件:

    <select id="findAll" resultType="User">select * from user
    </select>
    
为一个所有包下的所有类配置别名
<typeAliases><package name="包名"></package>
</typeAliases>

此时该包下的所有类都有了别名,别名省略包名,和类名相同。如:

  1. 配置文件:

    <typeAliases><package name="com.mybatis.pojo"></package>
    </typeAliases>
    
  2. 映射文件:

    <select id="findPage2" resultType="User" parameterType="PageQuery">select * from user limit #{startIndex},#{pageSize}
    </select>
    

< environments>标签

<environments>可以为MyBatis配置数据环境。

事务管理
<environments default="mysql"><environment id="mysql"><!-- JDBC:使用JDBC的提交和回滚 MANAGED:不做事务处理--><transactionManager type="JDBC"></transactionManager></environment>
</environments>
连接池
<environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><!-- 连接池设置 --><dataSource type="POOLED"><!-- 数据源设置... --></dataSource></environment>
</environments>

dataSource的type属性:

  • POOLED:使用连接池管理连接,使用MyBatis自带的连接池。
  • UNPOOLED:不使用连接池,直接由JDBC连接。
  • JNDI:由JAVAEE服务器管理连接,如果使用Tomcat作为服务器则使用Tomcat自带的连接池管理。

< mappers>标签

<mappers>用于注册映射文件或持久层接口,只有注册的映射文件才能使用,共有四种方式都可以完成注册:

  1. 使用相对路径注册映射文件

    <mappers><mapper resource="com/mybatis/mapper/UserMapper.xml"/>
    </mappers>
    
  2. 使用绝对路径注册映射文件

    <mappers>  <mapper url="file:///C:\Users\a\IdeaProjects\mybatiscase\mybatisDemo1\src\main\resources\com\mybatis\mapper\UserMapper.xml"/> 
    </mappers>
    
  3. 注册持久层接口

    <mappers>  <mapper class="com.mybatis.mapper.UserMapper"/> 
    </mappers>
    
  4. 注册一个包下的所有持久层接口

    <mappers><package name="com.mybatis.mapper"/>
    </mappers>
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法&#xff1a; 第一步&#xff1a;需要自备华硕6个底包工厂安装包&#xff08;EDN.KIT.OFS.SWP.HDI.TLK&#xff09;或者自己备份的iso/esd/wim等镜像恢复 支持系列&#xff1a; 灵耀系列原装系统 无畏系列原装系统 枪…

小程序中的大道理之三--对称性和耦合问题

再继续扒 继续 前一篇 的话题, 在那里, 提到了抽象, 耦合及 MVC, 现在继续探讨这些, 不过在此之前先说下第一篇里提到的对称性. 注: 以下讨论建立在前面的基础之上, 为控制篇幅起见, 这里将不再重复前面说到的部分, 如果您还没看过前两篇章, 阅读起来可能会有些困难. 这是第一…

壳牌——利用人工智能应对新能源转型

荷兰皇家壳牌(Shell)最初是一家卖贝壳的商店&#xff0c;截至 2018 年&#xff0c;它是全球收入排名第五的公司。它的业务范围涵盖从勘探和钻探到提炼和零售的整个燃料供应链。壳牌在石油、天然气、生物燃料、风能和太阳能等端到端燃料生产领域处于世界领先地位。 当前&#x…

【21年扬大真题】编写程序,去除掉字符串中所有的星号。

【21年扬大真题】 编写程序&#xff0c;去除掉字符串中所有的星号。 int main() {int i 0;int j 0;char arr[30] {0};char brr[30] {0};printf("请输入一个字符串:");gets(arr);for (i 0;i < 30;i){if (arr[i] ! *) {brr[j] arr[i];j;}}int tmp j;for (i …

【Amazon】安装卸载AWS CLI操作流程(Windows 、Linux系统)

AWS 命令行界面&#xff08;AWS CLI&#xff09;是用于管理 AWS 产品的统一工具。只需要下载和配置一个工具&#xff0c;您就可以使用命令行控制多个 AWS 产品并利用脚本来自动执行这些服务。 AWS CLI v2 提供了多项新功能&#xff0c;包括改进的安装程序、新的配置选项&#…

高清动态壁纸软件Live Wallpaper Themes 4K mac中文版功能

Live Wallpaper & Themes 4K mac是一款提供各种高清动态壁纸和主题的应用程序。该应用程序提供了大量的动态壁纸和主题&#xff0c;包括自然、动物、城市、抽象等各种类别&#xff0c;可以满足用户不同的需求。除了壁纸和主题之外&#xff0c;该应用程序还提供了许多其他功…

判断序列Series中的值是否都不一样 PandasSeries中的方法:is_unique()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断序列Series中的值是否都不一样 PandasSeries中的方法&#xff1a; is_unique() 选择题 请问下列程序运行的的结果是&#xff1a; import pandas as pd s1 pd.Series([1,2,3]) print("…

Odoo16系统忘记Master密码的解决方法

1 打开项目配置文件../Odoo 16.0.20231119/server/odoo.conf 2 找到admin_passwd 开头的行&#xff0c;删除该行&#xff0c;或者在该行前面添加英文半角分号;注释掉本行 3 重启odoo服务&#xff0c;然后访问页面如&#xff1a;http://localhost:8069/web 4 选择数据库是&am…

Windows核心编程 跨进程操作

目录 进程A拿到进程B句柄是否能用 句柄的权限 关于句柄表 跨进程使用句柄-继承 CreateProcess&#xff1a;bInheritHandles OpenProcess FindWinodw GetCurrentProcess 跨进程使用句柄-拷贝 跨进程操作内存 WriteProcessMemory VirtualProtectEx ReadProcessMemo…

浏览器缓存控制讲解

缓存的作用 在你访问互联网中的任何资源其所产生的任何链路中的每一个节点几乎都会进行缓存&#xff0c;整个缓存体系和细节十分复杂。比如浏览器缓存&#xff0c;服务器缓存&#xff0c;代理服务器缓存&#xff0c;CDN缓存等。 但是缓存又十分重要&#xff0c;不可缺少&…

NX二次开发UF_CURVE_ask_curve_struct_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_struct_data Defined in: uf_curve.h int UF_CURVE_ask_curve_struct_data(UF_CURVE_struct_p_t curve_struct, int * type, double * * curve_data ) overview…

情感对话机器人的任务体系

人类在处理对话中的情感时&#xff0c;需要先根据对话场景中的蛛丝马迹判断出对方的情感&#xff0c;继而根据对话的主题等信息思考自身用什么情感进行回复&#xff0c;最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发&#xff0c;情感对话机器人需要完成以下几…

从0开始学习JavaScript--深入了解JavaScript框架

JavaScript框架在现代Web开发中扮演着关键角色&#xff0c;为开发者提供了丰富的工具和抽象层&#xff0c;使得构建复杂的、高性能的Web应用变得更加容易。本文将深入探讨JavaScript框架的核心概念、常见框架的特点以及它们在实际应用中的使用。 JavaScript框架的作用 JavaSc…

STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理

一、概述 本文主要介绍如何配置USART接收中断&#xff0c;使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例&#xff0c;配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。 乒乓缓存的设计应用场景&#xff1a;当后面…

【ceph】如何打印一个osd的op流程,排查osd在干什么

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

canvas高级动画001:文字瀑布流

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

elk 简单操作手册

1.1. 基础概念 EFK不是一个软件,而是一套解决方案,开源软件之间的互相配合使用,高效的满足了很多场合的应用,是目前主流的一种日志系统。 EFK是三个开源软件的缩写,分别表示:Elasticsearch , Filebeat, Kibana , 其中Elasticsearch负责日志保存和搜索,Filebeat负责收集日志,Ki…

EI期刊完整程序:MEA-BP思维进化法优化BP神经网络的回归预测算法,可作为对比预测模型,丰富内容,直接运行,免费

适用平台&#xff1a;Matlab 2020及以上 本程序参考中文EI期刊《基于MEA⁃BP神经网络的建筑能耗预测模型》&#xff0c;程序注释清晰&#xff0c;干货满满&#xff0c;下面对文章和程序做简要介绍。 适用领域&#xff1a;风速预测、光伏功率预测、发电功率预测、碳价预测等多…

eclipse项目移到idea上部署运行

1.配置web模块 另外&#xff0c;模块这里&#xff0c;也要加上Spring 2.配置Artifact &#xff08;用于tomcat&#xff09; 就是从上面配置的web模块&#xff0c;产生的工件 3.添加lib 一般是在web-inf/lib &#xff0c; 遇到的坑&#xff1a; jdk版本问题&#xff0c;这里…

使用STM32+SPI Flash模拟U盘

试验目的&#xff1a;使用STM32F103C8T6 SPI Flash&#xff08;WSQ16&#xff09;实现模拟U盘的功能 SPI Flash读写说明&#xff1a; Step1 设置SPI1 用于读取SPI Flash&#xff1b; Step2&#xff1a;设置SPI Flash 的使能信号 Step3&#xff1a;使能USB通信 Step4&#xf…