MyBatis基础使用

MyBatis首页icon-default.png?t=N7T8https://mybatis.net.cn/

MyBatis细节注意,让你更加熟悉MyBatisicon-default.png?t=N7T8https://blog.csdn.net/m0_61160520/article/details/137173558?spm=1001.2014.3001.5501

1.项目目录

 2.数据库

CREATE DATABASE `mybatis-example`;USE `mybatis-example`;CREATE TABLE `t_emp`(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id)
);INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("lamu",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("leimu",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("486",777.77);

3.依赖导入pom.xml

<dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,不需要导入连接池,mybatis自带! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope></dependency>
</dependencies>

 4.实体类

@Data
public class Employee {private Integer empId;private String empName;private Double empSalary;@Overridepublic String toString() {return "Employee{" +"empId=" + empId +", empName='" + empName + '\'' +", empSalary=" + empSalary +'}';}
}

5.定义mapper接口

public interface EmployeeMapper {Employee queryById(Integer id);//int返回值用于接受受影响的行数int insertEmployee(Employee employee);//根据工资查询员工信息List<Employee> queryBySalary(Double salary);//根据员工姓名和工资查询员工信息List<Employee> queryByNameAndSalary(@Param("param1") String name, @Param("param2") Double salary);//插入员工数据,传入的是一个map(name=员工的名字,salary=员工的薪水)//mapper接口中不允许重载!!! 方法名重复了  id名重复了!int insertEmpMap(Map data);//员工插入int insertEmp(Employee employee);
}

6.准备MyBatis配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!-- 开启了 mybatis的日志输出,选择使用system进行控制台输出--><setting name="logImpl" value="STDOUT_LOGGING"/><!--开启驼峰式自动映射 数据库 a_column->java aColumn --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 定义自己类的别名 --><typeAliases><!-- 单独定义 --><!--        <typeAlias type="com.example.pojo.Employee" alias="hahaha" />--><!-- 批量将包下的类给与别名,别名就是类的首字母小写! --><package name="com.example.pojo"/></typeAliases><!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一个具体的环境 --><environment id="development"><!-- Mybatis的内置的事务管理器MANAGED  不会自动开启事务!  | JDBC 自动开启事务  , 需要自己提交事务!--><transactionManager type="JDBC"/><!-- 配置数据源type=POOLED  mybatis帮助我们维护一个链接池 | UNPOOLED  每次都新建或者释放链接--><dataSource type="POOLED"><!-- 建立数据库连接的具体信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!-- Mapper注册:指定Mybatis映射文件的具体位置 --><!-- mapper标签:配置一个具体的Mapper映射文件 --><!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --><!--      对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 --><mapper resource="mappers/EmployeeMapper.xml"/></mappers></configuration>

7.定义mapper xml

- 方法名和SQL的id一致
- 方法返回值和resultType一致
- 方法的参数和SQL的参数一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--  namespace =  mapper对应接口的全限定符 -->
<mapper namespace="com.example.mapper.EmployeeMapper"><select id="queryById" resultType="com.example.pojo.Employee">select emp_id empId , emp_name empName , emp_salary empSalaryfrom t_emp where emp_id = ${id}</select><insert id="insertEmployee">insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})</insert><!--zai配置中typeAliases标签声明批量将包下的类给与别名,别名就是类的首字母小写--><select id="queryBySalary" resultType="Employee">select emp_id empId , emp_name empName , emp_salary empSalaryfrom t_emp where emp_salary = #{ salary }</select><!--场景3: 传入多个简单类型数据如何取值 key!可以不可以随便写? 不可以!按照形参名称获取? 也不可以!方案1: 注解指定  @Param注解  指定多个简单参数的key   key = @Param("value值")  [推荐]方案2: mybatis默认机制argo arg1 .... 形参左到右依次对应 argo arg1..(name,salary) name-> key = arg0  salary -> key = arg1param1 param2 ....(name,salary) name-> key = param1  salary -> key = param2--><select id="queryByNameAndSalary" resultType="Employee">select emp_id empId , emp_name empName , emp_salary empSalaryfrom t_emp where emp_name = #{param1} and emp_salary = #{param2}</select>
<!--    <select id="queryByNameAndSalary" resultType="com.example.pojo.Employee">-->
<!--        select emp_id empId , emp_name empName , emp_salary empSalary-->
<!--        from t_emp where emp_name = #{arg0} and emp_salary = #{arg1}-->
<!--    </select>--><!-- 场景4: 传入map 如何指定key的值key = map的key即可!--><insert id="insertEmpMap">insert into t_emp (emp_name , emp_salary )  values (#{name},#{salary});</insert><!--输出:场景1: 返回单个简单类型如何指定  resultType的写法! 返回值的数据类型!!resultType语法:1.类的全限定符号2.别名简称mybatis给我们提供了72种默认的别名!这些都是我们常用的Java数据类型!  [java的常用数据类型]基本数据类型 int  double  -> _int _double包装数据类型 Integer Double  -> int integer double集合容器类型 Map List  HashMap -> 小写即可 map list hashmap扩展:如果没有没有提供的需要自己定义或者写类的全限定符号给自己声明的类如何定义别名:mybatis-config.xml给类单独定义别名!!!<typeAliases><typeAlias type="com.example.pojo.Employee" alias="hahaha" /></typeAliases>批量设置:<typeAliases>批量将包下的类给与别名,别名就是类的首字母小写!<package name="com.example.pojo"/></typeAliases>扩展,如果不想使用批量的别名,可以使用注解给与名字!@Alias("hahaha")--><select id="queryNameById" resultType="string">select emp_name from t_emp where emp_id = #{id}</select><select id="querySalaryById" resultType="_double">select emp_salary from t_emp where emp_id = #{id}</select><!--场景2: 返回单个自定义类类型//返回单个自定义实体类型Employee queryById(Integer id);resultType : 返回值类型即可默认要求:查询,返回单个实体类型,要求列名和属性名要一致!这样才可以进行实体类的属性映射!但是可以进行设置,设置支持驼峰式自动映射!emp_id  -> empId ===  empIdmybatis-config.xml<setting name="mapUnderscoreToCamelCase" value="true"/>--><select id="queryById1" resultType="employee" >select  *from t_emp where emp_id = ${id}</select><!-- 场景3: 返回map当没有实体类可以使用接值的时候!我们可以使用map接受数据!key - > 查询的列value -> 查询的值--><select id="selectEmpNameAndMaxSalary" resultType="map">SELECTemp_name 员工姓名,emp_salary 员工工资,(SELECT AVG(emp_salary) FROM t_emp) 部门平均工资FROM t_emp WHERE emp_salary=(SELECT MAX(emp_salary) FROM t_emp)</select><!--场景4: 返回的是集合类型如何指定//查询工资高于传入值的员工姓名们 200List<String> queryNamesBySalary(Double salary);//查询全部员工信息List<Employee> queryAll();Employee queryById();切记: 返回值是集合。resultType不需要指定集合类型,只需要指定泛型即可!!为什么?mybatis -> ibatis -> selectOne 单个  | selectList 集合 ->  selectOne中 调用 [ selectList ]--><select id="queryNamesBySalary" resultType="string">select emp_name from t_emp where emp_salary > #{ salary }</select><select id="queryAll" resultType="employee">select * from t_emp</select><!--场景5: 主键回显 获取插入数据的主键1. 自增长主键回显 mysql  auto_increment//员工插入int insertEmp(Employee employee);useGeneratedKeys="true" 我们想要数据库自动增强的主键值keyColumn="emp_id" 主键列的值!!!keyProperty="empId" 接收主键列值的属性!!!--><insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">insert into t_emp (emp_name,emp_salary)value(#{empName},#{empSalary});</insert><!--期望,非自增长的主键,交给mybatis帮助我们维护!--><insert id="insertxxx"><!-- 插入之前,先指定一段sql语句,生成一个主键值!order="before|after" sql语句是在插入语句之前还是之后执行!resultType = 返回值类型keyProperty = 查询结果给哪个属性赋值//自己维护主键String id = UUID.randomUUID().toString().replaceAll("-", "")teacher.settId(id);--><selectKey order="BEFORE" resultType="string" keyProperty="tId">SELECT  REPLACE(UUID(),'-','');</selectKey>INSERT INTO teacher (t_id,t_name)VALUE(#{tId},#{tName});</insert><!--Teacher queryById(String tId);列名和属性不一致如何解决:方案1: 别名  select t_id tId , t_name tName from teacher where t_id = #{tId}方案2: 开启驼峰式映射  <setting name="mapUnderscoreToCamelCase" value="true"/>t_id  tId 自动映射方案3: resultMap自定义映射  (resultType和resultMap二选一)resultType按照规则自动映射  按照是否开启驼峰式映射,自己映射属性和列名! 只能映射一层结构!深层次的对象结构无法映射,多表查询的时候结果无法映射!Order                  -   数据库orderId                        order_idorderName                      order_nameOrderItem orderItemitem_id           item_idresultMap标签,自定义映射关系,可以深层次可以单层次!!!--><!-- 声明resultMap标签,自己定义映射规则id标识 -> select resultMap="标识"type   -> 具体的返回值类型 全限定符和别名 | 集合只写泛型即可<id 主键映射关系<result 普通列的映射关系--><resultMap id="tMap" type="employee"><id column="emp_id" property="empId" /><result  column="emp_name" property="empName"/></resultMap><select id="queryById2"  resultMap="tMap">select * from teacher where t_id = #{tId}<!--select t_id tId , t_name tName from teacher where t_id = #{tId}--></select>
</mapper>

8.测试

public class MyBatisTest {@Testpublic void test() throws IOException {//读取外部配置文件InputStream ips = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(ips);//openSession自动开启事务,不会自动提交 !//openSession(true)自动开启事务,自动提交事务!  不需要sqlSession.commit();SqlSession session = sf.openSession(true);EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);Employee employee = new Employee();employee.setEmpSalary(8888.0);employee.setEmpName("艾米莉亚");System.out.println(employee.getEmpId());System.out.println("----------------------");int rows =  mapper.insertEmp(employee);System.out.println("rows = " + rows);System.out.println(employee.getEmpId());session.close();}
}

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

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

相关文章

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

vue3+threejs新手从零开发卡牌游戏(二十):添加卡牌被破坏进入墓地逻辑

在game目录下新建graveyard文件夹存放墓地相关代码&#xff1a; game/graveyard/p1.vue&#xff0c;这里主要设置了墓地group的位置&#xff1a; <template><div></div> </template><script setup lang"ts"> import { reactive, ref,…

【刷题】 二分查找入门

送给大家一句话: 总有一天&#xff0c;你会站在最亮的地方&#xff0c;活成自己曾经渴望的模样—— 苑子文 & 苑子豪《我们都一样 年轻又彷徨》 二分查找入门 1 前言2 Leetcode 704. 二分查找2.1 题目描述2.2 算法思路 3 Leetcode 34. 在排序数组中查找元素的第一个和最后…

求组合背包II(acwing)

题目描述&#xff1a; 给定n组循问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod (1e9 7)的值&#xff0c;。 输入格式&#xff1a; 第一行包含整数n。 接下来2行&#xff0c;每行包含一组a和b。 输出格式&#xff1a; …

Leetcode 4.1

LeetCode 热题 100 贪心算法1.买卖股票的最佳时机2.跳跃游戏3.跳跃游戏 II4.划分字母区间 区间合并1.合并区间 贪心算法 1.买卖股票的最佳时机 买卖股票的最佳时机 买的那天一定是卖的那天之前的最小值。 每到一天&#xff0c;维护那天之前的最小值即可。 在题目中&#xff0…

面试题:MySQL 优化篇

定位慢查询 &#x1f496; 开源工具 调试工具&#xff1a;Arthas&#xff08;阿尔萨斯&#xff09;运维工具&#xff1a;Prometheus&#xff08;普罗米修斯&#xff09;、Skywalking &#x1f496; MySQL 慢查询日志 # 开启 MySQL 慢查询日志开关 slow_query_log1 # 设置慢…

微信小程序wx.navigateTo无法跳转到Component组件问题解决。(共享元素动画必备)

关于Component构造器官方是有文档说明的&#xff0c;然后官方文档内部也给出了组件是可以通过像pages一样跳转的。但是官方文档缺少了必要的说明&#xff0c;会引起wx.navigateTo无法跳转到组件问题&#xff01; 扫码查看小程序&#xff0c;可以体验效果&#xff1a; 以下是官方…

ElementUI表格table组件实现单选及禁用默认选中效果

在使用ElementUI&#xff0c;需要ElementUI表格table组件实现单选及禁用默认选中效果, 先看下效果图&#xff1a; 代码如下&#xff1a; <template><el-tableref"multipleTable":data"tableData"tooltip-effect"dark"style"widt…

C语言之位段

1.位段的声明 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如&#xff1a; struct A {int _a:2;int _b:5;int _c:10;int _d:30; }; A 就是一个位段类型…

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…

商品服务 - 三级分类

1.递归查询树形结构 Overridepublic List<CategoryEntity> listWithTree() {//1.查出所有分类List<CategoryEntity> all this.list();//2.组装成父子的属性结构List<CategoryEntity> level1Menus all.stream().filter(c -> c.getParentCid().equals(0L)…

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】 题目描述&#xff1a;解题思路一&#xff1a;一边算前缀和一边统计。这里用哈希表统计前缀和出现的次数&#xff0c;那么和为k的子数组的个数就是当前前缀和-k的个数&#xff0c;即preSums[presum - k]。画个图表述就是&a…

FPGA之状态机学习

作为一名逻辑工程师&#xff0c;掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求&#xff0c;状态机设计的好坏能够直接影响到设计系统的稳定性&#xff0c;所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

Java封装最佳实践:打造高内聚、低耦合的优雅代码~

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、封装 1.1 封装的概念 面向对象程序三大…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了&#xff0c;既然低代码很好&#xff0c;为什么突然又自己架构起后端了呢&#xff1f;我有一句话叫低代码…

【数据结构】优先级队列——堆

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

数码管时钟--LABVIEW编程

一、程序的前面板 1.获取系统时钟&#xff0c;年月日&#xff0c;时分秒&#xff0c;用14个数码管显示。 2.闹钟设定小时和分钟。 二、程序的后面板 三、程序运行图 四、程序源码 源程序可以在百度网盘自行下载&#xff0c;地址链接见下方。 链接&#xff1a;https://pan.b…

开源,微信小程序-超级计算器T3000 简介

笔者于四年前自学微信小程序开发&#xff0c;这个超级计算器T3000就是当时的练习作品。超级计算器T3000的功能有很多&#xff0c;其中的核心技术是矩阵计算&#xff0c;使用的工具库是math.js&#xff0c;其次是复杂运算和分式运算。关于math.js的使用&#xff0c;可以参考另一…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

图片标注编辑平台搭建系列教程(4)——fabric几何定制渲染

背景 标注的几何&#xff0c;有时需要一些定制化的渲染样式&#xff0c;例如&#xff0c;线中间展示箭头&#xff0c;表示方向。本期教程教大家如何实现fabric几何定制化渲染。 带箭头的线 fabric提供了一些原生的几何&#xff0c;例如Point、Polyline、Polygon。同时提供了…