MyBatis学习二------CRUD(增删改查)

本文介绍MyBatis核心配置文件中的mappers标签及其使用方式,包括资源路径、URL、类及包批量注册等配置。同时涵盖通过MyBatis进行CRUD操作的具体实践,包括SQL映射文件配置与接口映射两种方式,并详细讲解如何获取不同数据库类型的主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文内容:

1、关于Mybatis核心配置文件的三个标签environments、databaseIdProvider、mappers将会在本文中进行使用

          environments:数据库连接环境的切换

          databaseIdProvider:支持多数据库厂商

          mappers:映射文件

2、Mybatis的CRUD操作:

    ①根据批量注册接口的形式进行操作

    ②根据注册映射文件的形式进行操作

3、Mybatis通过insert从而获取主键

①获取mysql中的自增主键

②获取oracle中的非自增主键

 

本节开篇先学习一个Mybatis核心配置文件(mybatis-config.xml)中的标签<mappers></mappers>

1、该标签是什么?有什么用?

①首先该标签是在Mybatis的核心配置文件中的标签

②该标签是一个映射器,用来映射SQL语句到核心配置文件;Mybatis最大的优点就是将SQL语句全部给抽取了出来,单独放置,但是他不是孤立的,所以这里就需要将SQL映射文件映射到核心配置文件中。

 2、剖析组成

 

   <mappers>
	   <mapper resource=""/>
	   <mapper class=""/>
	   <mapper url=""/>
	   <package name=""/>
	</mappers>

mappers标签 的属性组成如上:

作用:

 resource:引用类路径下的sql映射文件

eg:

<mapper resource="org/trg/mybatis/Dao/Employee.xml"/>

  url:引用网路路径或者磁盘路径下的sql映射文件

eg:
    <mapper url="file:///mybatis/mappers/Employee.xml"/>

class:      注册接口
                class:引用(注册)接口,
                    1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;


                    2、没有sql映射文件,所有的sql都是利用注解写在接口上;(了解)

package:批量注册  将包内的所有映射器接口全部注册为映射器

eg:

     <package name="com.trg.mybatis.Dao"/>

注意:在进行批量注册的时候前提是要按照如下的包路径放置文件(这里不是说一定要将文件名设置成这样,而是文件名必须要相同,包名也必须相同,为了工程美观性,所以讲配置文件要放置在resource源文件夹下)

   此时,必须要将Mybatis的SQL映射文件中的namespace按照如下配置

  <mapper namespace="com.trg.mybatis.Dao.EmployeeMapper"></mapper>

第一种:批量注册接口映射的方式

EmployeeMapper.java接口文件中:

package com.trg.mybatis.Dao;

import com.trg.javaBean.Employee;
/*
*这里的接口返回值类型可以是Integer、Long、BoBooLean、void类型
*
*/
public interface EmployeeMapper {
    // 查询
	Employee getEmpById(int emp); 
	// 增加
	Integer insert(Employee emp);
	// 删除
    Integer delete(int i);	
	// 更新
    Integer update(Employee emp);
	
}

EmployeeMapper.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.trg.mybatis.Dao.EmployeeMapper">
  
<!-- 根据id查询 -->  
	<select id="getEmpById" resultType="emp" >
	SELECT
	   id,
	   last_name as lastname,
	   email,
	   sex 
    FROM employee 
    WHERE id = #{id}
	</select>

<!-- 查询 -->  
	<select id="selectEmp" resultType="emp" >
	SELECT
	   id,
	   last_name as lastname,
	   email,
	   sex 
    FROM employee 
    
	</select>
	
<!-- 增加 -->  
  <insert id="insert" parameterType="com.trg.mybatis.Dao.EmployeeMapper"  >
      INSERT   INTO  employee(last_name,email,sex)
      VALUES (
          #{lastname},
          #{email},
          #{sex}
      )
  </insert>
  
 <!-- 更新 -->   
  <update id="update" parameterType="com.trg.mybatis.Dao.EmployeeMapper">
     UPDATE employee
     SET
	      last_name = #{lastname},
	      email = #{email},
	      sex = #{sex}
     WHERE id = #{id} 
  </update>
  
  <!-- 删除 -->  
  <delete id="delete" parameterType="com.trg.mybatis.Dao.EmployeeMapper">
   DELETE  FROM  employee 
   WHERE id=#{id}
  </delete>

</mapper>

测试类:

 

@Test
	public void test4() throws Exception{
		//Mybatis的核心配置文件
		String resource = "mybatis-config.xml";
		//这里通过Resources类来加载Mybatis的核心配置文件当然也可以使用类加载器来加载
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//类加载器进行加载Mybatis的核心配置文件
		 //InputStream inputStream = MybatisTest.class.getClassLoader().getResourceAsStream(resource);
		//创建一个sqlSession工厂
		SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
		//创建一个SqlSession ,比较关键,主要我们用这个来执行我们在SQL映射文件中写的SQL语句
        
		SqlSession opsession = sqlSessionFactory.openSession();
		
		try {
     // 获取接口反射类,从而可以调用接口对应的方法
			EmployeeMapper mapper = opsession.getMapper(EmployeeMapper.class);
			// insert添加--这里通过Javabean的构造器直接添加,因为我对id设置了自增的形式,所以不做插入
			Employee emps =  new Employee(null,"trg","trg@123.com","nv");
			Integer num = mapper.insert(emps);
			
			//update 修改
//			Employee emps1 =  new Employee(2,"trg","trg@123.com","man");
//			Integer num = mapper.update(emps1);
			
			//  delete删除
			
		//	Integer num = mapper.delete(4);
			if(num>0){
				System.out.println("操作成功!");
			} else {
				System.err.println("操作失败! ");
			}
			//提交事务
			opsession.commit();
		} finally {
//用完之后,必须要关闭资源
			opsession.close();
		}
		
	}

注意:

 sqlSessionFactory.openSession():手动提交数据

 sqlSessionFactory.openSession(true):自动提交数据

测试结果:

上面的测试结果只是一个insert操作,别的操作就不展示了

以上的测试都是在Mybatis-config.xml中批量注册映射接口后进行测试的


第二种:注册sql映射文件的方式

1、在核心配置文件中注册SQL的映射文件

  <mapper resource="com/trg/mybatis/Dao/EmployeeMapper.xml"/> 

2、SQL映射文件内容同上

3、编写测试类

@Test
	public void test1() throws Exception{
		//Mybatis的核心配置文件
		String resource = "mybatis-config.xml";
		//这里通过Resources类来加载Mybatis的核心配置文件当然也可以使用类加载器来加载
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//类加载器进行加载Mybatis的核心配置文件
		 //InputStream inputStream = MybatisTest.class.getClassLoader().getResourceAsStream(resource);
		//创建一个sqlSession工厂
		SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
		//创建一个SqlSession ,比较关键,主要我们用这个来执行我们在SQL映射文件中写的SQL语句
		SqlSession openSession = sqlSessionFactory.openSession(true);
		try {
			// 1、根据id进行单挑查询
		//	Employee employee = openSession.selectOne("getEmpById", 1);
			
		    // 2、查询全部结果
			List<Employee> employees = openSession.selectList("selectEmp");
			//System.out.println(employee);
			System.out.println(employees);
			
			// 3、新增
			 // 先将值添加到Javabean中
		//	Employee emps = new Employee(null, "Tom", "注册文件@qq.com", "man");
			//然后进行插入操作
	   //	Integer num = openSession.insert("insert", emps);
			
			// 4、更新update 
//			Employee emps = new Employee(12, "Tom", "Tom@qq.com", "man");
//			Integer num = openSession.update("update", emps);
			
			// 5、删除
			Integer num = openSession.delete("delete","12");
			if(num>0){
				System.out.println("操作成功!");
			} else {
				System.err.println("操作失败! ");
			}
		} finally {
			openSession.close();
		}
		
	}

4、进行测试通过

注意的几点

 1》 测试的时候所创建的值要符合数据库要求,这里主要是指类型的要求和字符长度的限制

2》 要注意注册接口的方式和注册映射文件的区别

 ① 注册接口有单独的接口映射类,这里要明白是怎么将SQL映射文件和接口的绑定,

 ②注册时候的区别:

注册映射文件

 <mapper resource="com/trg/mybatis/Dao/EmployeeMapper.xml"/> 

 注册接口的方式

 <mapper class="com.trg.mybatis.Dao.EmployeeMapper"/>

注册接口的方式一般推荐使用批量注册,如下:

 <package name="com.trg.mybatis.Dao"/>  

③注意在测试的时候传值的区别,接口的方式只传一个值,但是映射文件的方式的话是还要写上对应的SQL语句的id

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

知识点---获取主键的值

1)获取自增主键的值,相对于mysql数据库

  useGeneratedKeys="true"  使用自增主键获取主键值策略

keyProperty="true"   指定对应的主键属性,也就是Mybatis获取到主键以后,将这个个封装到JavaBean的那个属性

 <insert id="insert" parameterType="com.trg.mybatis.Dao.EmployeeMapper"  
   useGeneratedKeys="true" keyProperty="id">
      INSERT   INTO  employee(last_name,email,sex)
      VALUES (
          
          #{lastname},
          #{email},
          #{sex}
      )
  </insert>

通过接口映射测试

	Employee emps =  new Employee(null,"trg","trg@123.com","nv");
		 	Integer num = mapper.insert(emps);
		 	System.out.println(emps.getId());

测试结果如下:

2)获取非自增主键的值,相对于oracle数据库

首先要将我们项目中的数据库切换成oracle数据库

 1>将mybatis-config.xml配置文件中的默认数据库修改成对应的oracle的

  设置default="dev_oracle"

<environments default="dev_oracle">
		
		<environment id="dev_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>
	
		<environment id="dev_oracle">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${orcl.driver}" />
				<property name="url" value="${orcl.url}" />
				<property name="username" value="${orcl.username}" />
				<property name="password" value="${orcl.password}" />
			</dataSource>
		</environment>
	</environments>

2> 在SQL映射文件中--现在想要使用的语句就是insert语句,因为我们要通过insert的方式获取非自增主键的值,所以要在需要调用的insert中添加一个属性databaseId="oracle",将其指定为oracle数据库,当然前提条件是要在核心配置文件中配置如下:

  
  <!-- 5、databaseIdProvider:支持多数据库厂商的;
		 type="DB_VENDOR":VendorDatabaseIdProvider
		 	作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
		 	MySQL,Oracle,SQL Server,xxxx
	  -->
	<databaseIdProvider type="DB_VENDOR">
		<!-- 为不同的数据库厂商起别名 -->
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
		<property name="SQL Server" value="sqlserver"/>
	</databaseIdProvider>
  

通过以上两个步骤,已经将数据库连接到oracle了

**********这个时候开始通过在oracle中插入一条数据从而获取非自增主键的测试了

第一种方法:

SQL映射文件

 <insert id="insert_oracle" parameterType="com.trg.mybatis.Dao.EmployeeMapper"  databaseId="oracle">
  <!-- 
    selectKey:从oracle数据库中查询序列
    keyProperty="id" :这里是将查询到的结果封装成Javabean的属性id
    order="AFTER" :优先级   BEFORE  该selectKey在插入之前运行
    resultType="Integer" :这里查询之后以什么形式返回
   -->
	  <selectKey keyProperty="id" order="BEFORE" resultType="Integer">
	SELECT  SEQ_EMPLOYEE_ID.Nextval FROM   dual
	  </selectKey>
	      INSERT   INTO  employee(id,last_name,email,sex)
	      VALUES (
	          #{id},
	          #{lastname},
	          #{email},
	          #{sex}
	      )
  </insert>

test测试类:

	// 3、新增
			 // 先将值添加到Javabean中
		 	Employee emps = new Employee(null, "Tom", "lo@qq.com", "man");
			//然后进行插入操作
			Integer num = openSession.insert("insert_oracle", emps);
			System.out.println("I am Primary"+" = "+emps.getId());

测试结果如下:

分析:看SQL语句就知道,该种方法主要是先查询序列,然后将序列进行封装到Javabean的属性id,然后下面的SQL在进行插入的时候,获取到Javabean中的属性id,这样便完成插入操作

第二种:

 <insert id="insert_oracle" parameterType="com.trg.mybatis.Dao.EmployeeMapper"  databaseId="oracle">
  <!-- 
    selectKey:从oracle数据库中查询序列
    keyProperty="id" :这里是将查询到的结果封装成Javabean的属性id
    order="AFTER" :优先级   BEFORE  该selectKey在插入之前运行
    resultType="Integer" :这里查询之后以什么形式返回
   -->
	  <selectKey keyProperty="id" order="AFTER" resultType="Integer">
	<!-- SELECT  SEQ_EMPLOYEE_ID.Nextval FROM   dual -->
	 SELECT  SEQ_EMPLOYEE_ID.currval FROM   dual
	  </selectKey>
	      INSERT   INTO  employee(id,last_name,email,sex)
	      VALUES (
	          SEQ_EMPLOYEE_ID.Nextval,
	          #{lastname},
	          #{email},
	          #{sex}
	      )
  </insert>

测试类同上

测试结果:

分析对比:

上面两个结果所造成的原因是由于sql映射文件中的orade属性所导致的,它决定了到底先执行哪一条语句;

SEQ_EMPLOYEE_ID.Nextval:下一个值

SEQ_EMPLOYEE_ID.currval:当前值

针对序列只做第二种方法分析:

首先我们的SQL执行顺序是先执行插入的,然后再执行查询序列的;

在做插入的时候,我们先插入数据,然后根据SEQ_EMPLOYEE_ID.Nextval序列自动生成主键值插入到数据库中,这个时候序列已经加1了,然后我们要是获取当前的记录的主键值,那么就需要使用SEQ_EMPLOYEE_ID.currval,通过将其封装到Javabean属性的id,那么在测试查询的时候就会查询到这个id了

 

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值