Java后端开发——Mybatis实验

文章目录

  • Java后端开发——Mybatis实验
    • 一、MyBatis入门程序
      • 1.创建工程
      • 2.引入相关依赖
      • 3.数据库准备
      • 4.编写数据库连接信息配置文件
      • 5.创建POJO实体
      • 6.编写核心配置文件和映射文件
    • 二、MyBatis案例:员工管理系统
      • 1.在mybatis数据库中创建employee表
      • 2.创建持久化类Employee
      • 3.编写映射文件
      • 4.添加映射文件路径配置。
      • 5.编写MyBatisUtils工具类
      • 6.编写测试类
    • 三、动态SQL测试实验
      • 1.创建映射文件CustomerMapper.xml
      • 2.在映射文件CustomerMapper.xml中
      • 3.添加使用<where>元素执行动态SQL元素
      • 4.添加使用<trim>元素执行动态SQL元素
      • 5.添加使用<set>元素执行更新操作的动态SQL
    • 四、复杂查询操作实验
      • 1.添加使用<foreach>元素迭代数组
      • 2.添加使用<foreach>元素迭代List集合执行批量查询操作的动态SQL
      • 3.添加使用<foreach>元素迭代Map集合执行批量查询操作的动态SQL。

Java后端开发——Mybatis实验

一、MyBatis入门程序

1.创建工程

在Eclipse中,创建名称为mybatis的工程
在这里插入图片描述

2.引入相关依赖

在这里插入图片描述

3.数据库准备

create database mybatis charset=utf8;

在这里插入图片描述

4.编写数据库连接信息配置文件

在项目的src目录下创建数据库连接的配置文件,这里将其命名为db.properties,在该文件中配置数据库连接的参数。

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&
characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=root

在这里插入图片描述

5.创建POJO实体

在项目的src/main/java目录下创建com.javaweb.pojo包,在com.javaweb.pojo包下创建User类,该类用于封装User对象的属性。

package com.javaweb.pojo;

public class Customer {
private Integer id; private String username; // 主键ID、客户名称
private String jobs; private String phone; // 职业、电话
// 省略getter/setter

@Override
public String toString() {
return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]"; }

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getJobs() {
return jobs;
}

public void setJobs(String jobs) {
this.jobs = jobs;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}
}

6.编写核心配置文件和映射文件

在项目的src目录下创建MyBatis的核心配置文件,该文件主要用于项目的环境配置,如数据库连接相关配置等。核心配置文件可以随意命名,但通常将其命名为mybatis-config.xml。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration 核心根标签-->
<configuration>
<!--引入数据库连接的配置文件-->
<properties resource="db.properties"/>
<!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
<environments default="mysql">
<!--environment配置数据库环境 id属性唯一标识-->
<environment id="mysql">
<!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource数据源信息 type属性 连接池-->
<dataSource type="POOLED">
<!-- property获取数据库连接的配置信息 -->
<property name="driver" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
</environments>
<!-- mappers引入映射配置文件 -->
<mappers>
<!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 -->
<mapper resource="com/javaweb/dao/CustomerMapper.xml"></mapper>
</mappers>
</configuration>

二、MyBatis案例:员工管理系统

1.在mybatis数据库中创建employee表

并在employee表中插入几条数据

use mybatis;
create table user(
    id int primary key auto_increment,
    name varchar(20) not null,
    age int not null
);
insert into user values(null,'张三',20),(null,'李四',18);

在这里插入图片描述

2.创建持久化类Employee

并在类中声明id(编号)、name(姓名)、age(年龄)和position(职位)属性,以及属性对应的getter/setter方法

package com.javaweb.bean;
public class Employee {
private Integer id; 
private String name; 
private Integer age; 
private String position; 
// 省略getter/setter方法
@Override
public String toString() {
return "Employee{" + "id=" + id + ", name=" + name +
", age=" + age + ", position=" + position +'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getPosition() {
return position;
}

public void setPosition(String position) {
this.position = position;
}
}

3.编写映射文件

创建映射文件EmployeeMapper.xml,该文件主要用于实现SQL语句和Java对象之间的映射。

<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.javaweb.mapper.EmployeeMapper">
<select id="findById" parameterType="Integer" resultType="com.javaweb.pojo.Employee"> 
select * from employee where id = #{id}
</select>
<insert id="add" parameterType="com.javaweb.pojo.Employee">
insert into employee(id,name,age,position) values (#{id},#{name},#{age},#{position})
</insert>
</mapper> 

4.添加映射文件路径配置。

在mybatis-config.xml映射文件的元素下添加EmployeeMapper.xml映射文件路径的配置。

<mapper 
resource="com/javaweb/mapper/EmployeeMapper.xml">
</mapper>

5.编写MyBatisUtils工具类

创建MyBatisUtils工具类,该类用于封装读取配置文件信息的代码。

public class MyBatisUtils {
      private static SqlSessionFactory sqlSessionFactory = null;
      static {	try {
	// 使用MyBatis提供的Resources类加载MyBatis的配置文件
	Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
	// 构建SqlSessionFactory工厂
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
      } catch (Exception e) { e.printStackTrace();}
      }
       public static SqlSession getSession() {//获取SqlSession对象的静态方法
	return sqlSessionFactory.openSession();
      }
} 

6.编写测试类

(1)在项目src/test/java目录下创建Test包,在Test包下创建MyBatisTest测试类,用于程序测试。在MyBatisTest测试类中添加findByIdTest()方法,用于根据id查询员工信息。
(2)在MyBatisTest测试类中添加insertTest()方法,用于插入员工信息。
(3)在MyBatisTest测试类中添加updateTest()方法,用于更新员工信息。
(4)在MyBatisTest测试类中添加deleteTest()方法,用于删除员工信息。

package com.javaweb.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import com.javaweb.pojo.Customer;
import com.javaweb.utils.MybatisUtils;

class MyBatisTest {

	@Test
	public void findCustomerByNameAndJobsTest() {
	SqlSession session = MybatisUtils.getSession();
	Customer customer = new Customer();customer.setUsername("jack");customer.setJobs("teacher");
	List<Customer> customers = session.selectList("com.javaweb.dao.CustomerMapper.findCustomerByNameAndJobs",customer);
	for (Customer customer2 : customers) {
	    System.out.println(customer2);
	}
	session.close();
	}
	
	@Test
	public void findCustomerByNameOrJobsTest() {
	SqlSession session = MybatisUtils.getSession();
	Customer customer = new Customer();
	customer.setUsername("tom");
	customer.setJobs("teacher");
	List<Customer> customers = session.selectList("com.javaweb.dao.CustomerMapper.findCustomerByNameOrJobs",customer);
	for (Customer customer2 : customers) {
		System.out.println(customer2);
	}
	session.close();
	}
	@Test
	public void findCustomerByNameAndJobs2Test() {
	SqlSession session = MybatisUtils.getSession();
	Customer customer = new Customer();customer.setUsername("jack");customer.setJobs("teacher");
	List<Customer> customers = session.selectList("com.javaweb.dao.CustomerMapper.findCustomerByNameAndJobs2",customer);
	for (Customer customer2 : customers) {
	    System.out.println(customer2);
	}
	session.close();
	}
	@Test
	public void findCustomerByNameAndJobs3Test() {
	SqlSession session = MybatisUtils.getSession();
	Customer customer = new Customer();customer.setUsername("jack");customer.setJobs("teacher");
	List<Customer> customers = session.selectList("com.javaweb.dao.CustomerMapper.findCustomerByNameAndJobs3",customer);
	for (Customer customer2 : customers) {
	    System.out.println(customer2);
	}
	session.close();
	}
	@Test
	public void updateCustomerBySetTest() {		
	    SqlSession sqlSession = MybatisUtils.getSession();
	    Customer customer = new Customer();  
	    customer.setId(3);
	    customer.setPhone("13311111234");
	    int rows = sqlSession.update("com.javaweb.dao"
	            + ".CustomerMapper.updateCustomerBySet", customer);
	    if(rows > 0) {System.out.println("您成功修改了"+rows+"条数据!");
	    } else { System.out.println("执行修改操作失败!!!");
	    }sqlSession.commit();sqlSession.close();
	}
	@Test
	public void findByArrayTest() {
	     SqlSession session = MybatisUtils.getSession(); 
	     Integer[] roleIds = {2,3}; // 创建数组,封装查询id
	     List<Customer> customers =       session.selectList("com.javaweb.dao.CustomerMapper.findByArray", roleIds);	
	     for (Customer customer : customers) {
	           System.out.println(customer);
	      }
	       session.close();
	}

}

三、动态SQL测试实验

1.创建映射文件CustomerMapper.xml

在映射文件中,根据客户姓名和年龄组合条件查询客户信息,使用元素编写该组合条件的动态SQL,测试并显示结果。

<select id="findCustomerByNameOrJobs" parameterType="com.javaweb.pojo.Customer"
resultType="com.javaweb.pojo.Customer">
select * from t_customer where 1=1
<choose>
<!--条件判断 -->
<when test="username !=null and username !=''">
and username like concat('%',#{username}, '%')
</when>
<when test="jobs !=null and jobs !=''">
and jobs= #{jobs}
</when>
<otherwise>
and phone is not null
</otherwise>
</choose>
</select>

2.在映射文件CustomerMapper.xml中

添加使用、、元素执行动态SQL,测试并显示结果。

<?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.javaweb.dao.CustomerMapper">
<!-- <if>元素使用 -->
<select id="findCustomerByNameAndJobs" parameterType="com.javaweb.pojo.Customer"
resultType="com.javaweb.pojo.Customer">
select * from t_customer where 1=1 
<if test="username !=null and username !=''">
and username like concat('%',#{username}, '%')
</if>
<if test="jobs !=null and jobs !=''">
and jobs= #{jobs}
</if> 
</select>
<!--<choose>(<when><otherwise>)元素使用 -->
<select id="findCustomerByNameOrJobs" parameterType="com.javaweb.pojo.Customer"
resultType="com.javaweb.pojo.Customer">
select * from t_customer where 1=1
<choose>
<!--条件判断 -->
<when test="username !=null and username !=''">
and username like concat('%',#{username}, '%')
</when>
<when test="jobs !=null and jobs !=''">
and jobs= #{jobs}
</when>
<otherwise>
and phone is not null
</otherwise>
</choose>
</select>
<update id="updateCustomerBySet" parameterType="com.javaweb.pojo.Customer">update t_customer 
<set>
<if test="username !=null and username !=''">
username=#{username},</if>
<if test="jobs !=null and jobs !=''"> jobs=#{jobs},</if>
<if test="phone !=null and phone !=''">phone=#{phone},</if>
</set> where id=#{id}
</update> 
</mapper>

在这里插入图片描述

3.添加使用元素执行动态SQL元素

在映射文件CustomerMapper.xml中,添加使用元素执行动态SQL元素,测试并显示结果。

<select id="findCustomerByNameAndJobs2" 
          parameterType="com.javaweb.pojo.Customer"
          resultType="com.javaweb.pojo.Customer">
    select * from t_customer
    <where>
        <if test="username !=null and username !=''">
            and username like concat('%',#{username}, '%')</if>
        <if test="jobs !=null and jobs !=''">
            and jobs= #{jobs}</if>
    </where></select>

4.添加使用元素执行动态SQL元素

在映射文件CustomerMapper.xml中,添加使用元素执行动态SQL元素,测试并显示结果。

<select id="findCustomerByNameAndJobs3" 
          parameterType="com.javaweb.pojo.Customer"
          resultType="com.javaweb.pojo.Customer">
    select * from t_customer
   <trim prefix="where" prefixOverrides="and" >
        <if test="username !=null and username !=''">
            and username like concat('%',#{username}, '%')</if>
        <if test="jobs !=null and jobs !=''">
            and jobs= #{jobs}</if></trim>
</select>

5.添加使用元素执行更新操作的动态SQL

在映射文件CustomerMapper.xml中,添加使用元素执行更新操作的动态SQL。

<update id="updateCustomerBySet" parameterType="com.itheima.pojo.Customer">update t_customer 
    <set>
        <if test="username !=null and username !=''">
            username=#{username},</if>
        <if test="jobs !=null and jobs !=''">  jobs=#{jobs},</if>
        <if test="phone !=null and phone !=''">phone=#{phone},</if>
    </set> where id=#{id}
</update> 

在这里插入图片描述

四、复杂查询操作实验

1.添加使用元素迭代数组

在映射文件CustomerMapper.xml中,添加使用元素迭代数组执行批量查询操作的动态SQL。

<select id="findByList" parameterType="java.util.Arrays"
         resultType="com.javaweb.pojo.Customer">
    select * from t_customer where id in
    <foreach item="id" index="index" collection="list" 
               open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

在这里插入图片描述

2.添加使用元素迭代List集合执行批量查询操作的动态SQL

在映射文件CustomerMapper.xml中,添加使用元素迭代List集合执行批量查询操作的动态SQL。

<select id="findByList" parameterType="java.util.Arrays"
         resultType="com.javaweb.pojo.Customer">
    select * from t_customer where id in
    <foreach item="id" index="index" collection="list" 
               open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

在这里插入图片描述

3.添加使用元素迭代Map集合执行批量查询操作的动态SQL。

在映射文件CustomerMapper.xml中,添加使用元素迭代Map集合执行批量查询操作的动态SQL。

<select id="findByMap" parameterType="java.util.Map"
        resultType="com.javaweb.pojo.Customer">
    select * from t_customer where jobs=#{jobs} and id in
    <foreach item="roleMap" index="index" collection="id" open="(" 	separator="," close=")"> #{roleMap}
    </foreach>
</select>

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

使用pyinstaller打包生成exe(解决gradio程序的打包问题)

解决 [Errno 2] No such file or directory: gradio_client\types.json 问题&#xff0c;不需要手动创建hook文件 解决 FileNotFoundError: [Errno 2] No such file or directory: gradio\blocks_events.pyc 问题&#xff0c;不需要将pyi文件重命名为pyc文件 最终实现gradio程…

基于uniapp封装的table组件

数据格式 tableData: [{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},/* {title: "2",elcInfo: [{…

强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)提供Python代码

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

MySql 1170-BLOB/TEXT 错误

MySql 1170-BLOB/TEXT column idused in key specification without a key length 原因&#xff1a;由于将主键id设置为 text类型&#xff0c;所以导致主键 的长度&#xff0c;没有设置。 解决方案&#xff1a;方案1&#xff1a;将主键id设置为varchar 类型的,设置对应的长度…

new mars3d.graphic.ModelEntity({clampToGround:true,模型不贴地处理办法

问题&#xff1a; 1.new mars3d.graphic.ModelEntity({clampToGround:true,时&#xff0c;发现模型不贴地 2.推断原因是模型可能建模的时候&#xff0c;坐标原点数据不正确&#xff0c;无法贴地。 解决方案&#xff1a; <一>.在Mars3d的模型编辑调整页面&#xff0c;进…

【习题】应用程序框架

判断题 1. 一个应用只能有一个UIAbility。错误(False) 正确(True)错误(False) 2. 创建的Empty Ability模板工程&#xff0c;初始会生成一个UIAbility文件。正确(True) 正确(True)错误(False) 3. 每调用一次router.pushUrl()方法&#xff0c;页面路由栈数量均会加1。错误(Fal…

盖子的c++小课堂——第二十三讲:背包问题

前言 又是一次漫长的更新&#xff08;我真不是故意的aaaaaaaaaaaaaaa&#xff09;&#xff0c;先不多说了&#xff0c;直接给我~坐下~说错了说错了&#xff0c;直接开始~ 背包问题----动态规划 背包问题&#xff08;knapsack problem&#xff09; 动态规划&#xff08;dyna…

【Redis】非关系型数据库之Redis的主从复制、哨兵和集群高可用

目录 一、主从复制、哨兵、集群的区别 二、主从复制 2.1主从复制的作用 2.2主从复制的原理 2.3主从复制的实操 步骤一&#xff1a;环境准备 步骤二&#xff1a;安装Redis以及配置文件修改 Redis的主从配置文件都一样 步骤四&#xff1a;验证主从复制 三、哨兵 3.1哨兵…

numpy100练习题,包含相应使用函数解释

取自github开源项目&#xff1a;numpy100题 文章目录 1. 导入numpy库并简写为 np (★☆☆)2. 打印numpy的版本和配置说明 (★☆☆)3. 创建一个长度为10的空向量 (★☆☆)4. 如何找到任何一个数组的内存大小&#xff1f; (★☆☆)5. 如何从命令行得到numpy中add函数的说明文档?…

2024年1月9日学习总结

目录 学习目标学习内容联邦学习基础&#xff1a;why, what, howwhy&#xff1f;what&#xff1f;how&#xff1f; 联邦学习的例子——CIFAR-10数据集&#xff08;分类问题&#xff09;1、import libararies2、hyper-parameters3、加载并且划分数据4、创建神经网络模型5、helper…

Spark Core--加强

RDD的持久化 RDD缓存 当RDD被重复使用&#xff0c;或者计算该RDD比较容易出错&#xff0c;而且需要消耗比较多的资源和时间的时候&#xff0c;我们就可以将该RDD缓存起来。 主要作用: 提升Spark程序的计算效率 注意事项: RDD的缓存可以存储在内存或者是磁盘上&#xff0c;甚至…

RBAC权限管理概念

基于RBAC模型的权限设计&#xff1a;如何设计系统权限体系&#xff1f; | 人人都是产品经理 一&#xff0c;什么是RBAC RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念。取消了用户和权限的直接关联&#xff0c;改为通过用户关联角色、角色关联权限的…

虾皮如何查看自己的店铺

在虾皮&#xff08;Shopee&#xff09;平台上查看自己的店铺是非常重要的&#xff0c;因为它可以帮助您了解店铺的运营情况、管理商品和处理客户服务等。下面是在虾皮平台上查看店铺的步骤&#xff1a; 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff08;复制…

nn网络层-卷积层

一、1d/2d/3d Convolution 卷积运算&#xff1a;卷积核在输入信号&#xff08;图像&#xff09;上滑动&#xff0c;相应位置上进行乘加卷积核&#xff1a;又称为滤波器&#xff0c;过滤器&#xff0c;可认为是某种模式&#xff0c;某种特征。卷积过程类似于用一个模版去图像上…

【JAVA】怎么确保一个集合不能被修改

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 示例&#xff1a; 不可修改的List&#xff1a; 不可修改的Set&#xff1a; 不可修改的Map&#xff1a; 结语 我的其他博…

强化学习在生成式预训练语言模型中的研究现状简单调研

1. 绪论 本文旨在深入探讨强化学习在生成式预训练语言模型中的应用&#xff0c;特别是在对齐优化、提示词优化和经验记忆增强提示词等方面的具体实践。通过对现有研究的综述&#xff0c;我们将揭示强化学习在提高生成式语言模型性能和人类对话交互的关键作用。虽然这些应用展示…

STM32F103C8T6内部自带Bootloader模式之使用FlyMcu烧写程序

简介 实现自己的Bootloader前, 使用一下STM32内部自带的Bootloader对STM进行烧写 步骤 下载FlyMCU 参考 普中STM32-PZ6806L 使用FlyMcu串口烧录程序 Boot选择 Boot0->1 , Boot1->0 进到系统存储器 打开FlyMCU 1 选择串口波特率 2 选择程序 3 不需要使用辅助引脚 4 开…

Linux网络配置与抓包工具介绍

目录 一、配置命令 1. ifconfig 1.1 概述信息解析 1.2 常用格式 2. ip 2.1 ip link 数据链路层 2.2 ip addr 网络层 2.3 路由 3. hostname 3.1 临时修改主机名 3.2 永久修改主机名 4. route 5. netstat 6. ss 7. ping 8. traceroute 9. nslookup 10. 永久修…

书生·浦语大模型全链路开源体系 学习笔记 第三课

huggingface-cli: command not found 按照该文档解决即可 https://github.com/huggingface/huggingface_hub/issues/1079 具体如下&#xff1a; 1、确保环境已将安装huggingface-cli 2、版本需要旧版&#xff0c;pip install huggingface_hub0.20.1 3、再按如下执行 # T…

WCF几种寄宿方式IIS、Winform、控制台、Windows服务

WCF寄宿方式是一种非常灵活的操作,可以在IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。本文分别对这几种方式进行详细介绍并开发例子进行说明,以求大家对WCF寄宿的方式进行全面的认识和了解。 1、 WC…