【Spring集成MyBatis】MyBatis的多表查询

文章目录

  • 1. 一对一
    • 什么是一对一
    • User、Order类及Mapper,User、Order表
    • 一对一操作的实现
    • 一对一操作实现的第二种方式
  • 2. 一对多
    • 什么是一对多
    • 一对多操作实现
  • 3. 多对多
    • 什么是多对多
    • 多对多的实现
  • 4. 小结

1. 一对一

什么是一对一

一对一指的是表与表之间通过外键进行连接,比如我们有一个Order类,里面有属性idorderTimetotal,以及一个下这个订单的用户userId,通过userId找到对应的用户。一个订单会有一个对应的下单用户,这就是一对一。
在这里插入图片描述

User、Order类及Mapper,User、Order表

User表中有如下属性:
在这里插入图片描述

Java代码中,
User类的定义如下:

package com.example.demo.domain;import java.util.Date;public class User {int id;String username;String password;Date birthday;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", birthday=" + birthday +'}';}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

并写好对应的Mapper:
UserMapper.xml

<?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.example.demo.dao.UserMapper"></mapper>

UserMapper.java

package com.example.demo.dao;import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public interface UserMapper {void save(User user);User findById(int id);List<User> findAll();}

Order表中有如下属性:
在这里插入图片描述

Java代码中,
Order类的定义如下:

package com.example.demo.domain;import java.util.Date;public class Order {int id;Date orderTime;double total;User user;@Overridepublic String toString() {return "Order{" +"id=" + id +", orderTime=" + orderTime +", total=" + total +", user=" + user +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public Date getOrderTime() {return orderTime;}public void setOrderTime(Date orderTime) {this.orderTime = orderTime;}public double getTotal() {return total;}public void setTotal(double total) {this.total = total;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}
}

并写好对应的Mapper:
OrderMapper.xml:

<?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.example.demo.dao.OrderMapper"></mapper>

OrderMapper.java:

package com.example.demo.dao;public interface OrderMapper {}

还有SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 通过properties标签加载外部properties文件 --><properties resource="jdbc.properties"></properties><!-- 自定义别名 --><typeAliases><typeAlias type="com.example.demo.domain.User" alias="user"></typeAlias></typeAliases><!-- 配置分页助手插件 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"/></plugins><!-- 数据源环境 --><environments default="development"><environment id="development"><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><!-- 加载映射文件 --><mappers><mapper resource="mapper/UserMapper.xml"></mapper><mapper resource="mapper/OrderMapper.xml"></mapper></mappers></configuration>

一对一操作的实现

假如我们有这样一条sql语句:

SELECT *, o.id `orderid` FROM `order` o, `user` u WHERE o.uid=u.id

两张表中分别有如下数据:
在这里插入图片描述

则查询的结果为:
在这里插入图片描述

若想要把这条语句中各个属性封装到Order中对应的各个属性中(其中User相关的属性封装到User里),应如下写sql语句:
在orderMapper.java中:

package com.example.demo.dao;import com.example.demo.domain.Order;import java.util.List;public interface OrderMapper {List<Order> findAll();
}

orderMapper.xml中:

<?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.example.demo.dao.OrderMapper"><resultMap id="orderMap" type="com.example.demo.domain.Order">
<!--        手动指定字段与实体属性的映射关系-->
<!--        column:数据表的字段名称-->
<!--        property:实体的属性名称--><id column="oid" property="id"></id><result column="ordertime" property="orderTime"></result><result column="total" property="total"></result><result column="uid" property="user.id"></result><result column="username" property="user.username"></result><result column="password" property="user.password"></result><result column="birthday" property="user.birthday"></result></resultMap><select id="findAll" resultMap="orderMap">SELECT *, o.id `orderid`, u.id `userid` FROM `order` o, `user` u WHERE o.uid=u.id</select></mapper>

其中,我们将SQL语句的返回值通过resultMap属性指定为orderMap,并在上面定义了一个id为orderMapresultMap
resultMap中,type属性表示返回的具体的类,这里返回的是Order类,因为我们要将返回的值都封装在Order类中
下面的<id>标签表示主键,<result>表示其他结果
column用于指定返回的值名称,property用于指定将返回的值注入到Order对象的哪个属性里去
其中要注意的事,因为uid,password,birthday都是要注入到user这个对象里的,所以在property中写的是user下的属性
测试代码:

package com.example.demo;import com.example.demo.dao.OrderMapper;
import com.example.demo.domain.Order;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = orderMapper.findAll();for (Order order: orderList){System.out.println(order);}//        6. 释放资源sqlSession.close();}
}

查询结果:
在这里插入图片描述

一对一操作实现的第二种方式

id为orderMapresultMap还可以用以下的方式写:
association标签中的property用于指定属性的名称,javaType用于指定属性类型,如果我们没有在sqlMapConfig.xml中配置别名的话,这里就要写com.example.demo.domain.User
下面的内容是类似的,不过通过这个方法就不需要再写user.xxx了,直接写对应的属性名称就好

<resultMap id="orderMap" type="com.example.demo.domain.Order">
<!-- 手动指定字段与实体属性的映射关系 -->
<!-- column:数据表的字段名称 -->
<!-- property:实体的属性名称 --><id column="oid" property="id"></id><result column="ordertime" property="orderTime"></result><result column="total" property="total"></result><!-- property:当前实体(order)属性名称(private User user -->
<!-- javaType:当前实体(order)中的属性类型(User) --><association property="user" javaType="user"><id column="uid" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result></association>
</resultMap>

运行结果保持不变

2. 一对多

什么是一对多

一对多指的是,比如我们有一个Order类,里面有属性idorderTimetotal,以及一个下这个订单的用户userId,每个用户可以下多个订单,那就是一对多的关系。
在这里插入图片描述

一对多操作实现

想要查询一个用户及其名下的所有订单,我们的SQL语句是这么写的:

select *, o.id oid from `user` u, `order` o where u.id=o.uid

在这里插入图片描述
想要查询这种一对多关系的东西,我们应该如下实现:
修改User.java,其中多了一个用户订单的List属性

package com.example.demo.domain;import java.util.Date;
import java.util.List;public class User {int id;String username;String password;Date birthday;//    描述当前用户存在哪些订单List<Order> orderList;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", birthday=" + birthday +", orderList=" + orderList +'}';}public List<Order> getOrderList() {return orderList;}public void setOrderList(List<Order> orderList) {this.orderList = orderList;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

UserMapper.java

package com.example.demo.dao;import com.example.demo.domain.User;import java.util.List;public interface UserMapper {List<User> findAll();}

UserMapper.xml

<?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.example.demo.dao.UserMapper"><resultMap id="userMap" type="user"><id column="uid" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><collection property="orderList" ofType="order"><id column="oid" property="id"></id><result column="orderTime" property="orderTime"></result><result column="total" property="total"></result></collection></resultMap><select id="findAll" resultMap="userMap">select *, o.id oid from `user` u, `order` o where u.id=o.uid</select></mapper>

在总配置文件中加上别名配置:

<!-- 自定义别名 -->
<typeAliases><typeAlias type="com.example.demo.domain.User" alias="user"></typeAlias><typeAlias type="com.example.demo.domain.Order" alias="order"></typeAlias>
</typeAliases>

其中<collection>表示列表集合,其中property指的是User类的属性名称,ofType是List里面的属性
下面的idcolumn和之前的意思一样
测试代码:

package com.example.demo;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.findAll();for (User user: userList){System.out.println(user);}//        6. 释放资源sqlSession.close();}
}

结果如下:
在这里插入图片描述

3. 多对多

什么是多对多

在这里插入图片描述
其中user_role表中的信息如下:
在这里插入图片描述

role表的信息如下:
在这里插入图片描述
通过一个user_role表来连接两个表,我们需要通过user_role为媒介进行role具体信息的查询
注意在这里,一个用户可以有多个角色,在user_role表中两个键均为主键。
一个用户可以有多个角色,一个角色可以被多个用户拥有,就是多对多的关系

多对多的实现

定义Role.java

package com.example.demo.domain;public class Role {int id;String roleName;String description;@Overridepublic String toString() {return "Role{" +"id=" + id +", roleName='" + roleName + '\'' +", description='" + description + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}

在User中加上对应的属性及方法:

package com.example.demo.domain;import java.util.Date;
import java.util.List;public class User {int id;String username;String password;Date birthday;//    描述当前用户存在哪些订单List<Order> orderList;//    描述当前用户的角色List<Role> roles;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", birthday=" + birthday +", roles=" + roles +'}';}public List<Role> getRoles() {return roles;}public void setRoles(List<Role> roles) {this.roles = roles;}public List<Order> getOrderList() {return orderList;}public void setOrderList(List<Order> orderList) {this.orderList = orderList;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

在UserMapper.java中加上对应方法的定义:

package com.example.demo.dao;import com.example.demo.domain.User;import java.util.List;public interface UserMapper {List<User> findAll();List<User> findUserandRole();}

在写对应的UserMapper.xml之前,先把SQL语句写好,这实际上就是通过user_role表来查询user对应的role相关的信息:

SELECT * FROM user u, user_role ur, role r where u.id = ur.userid and ur.roleid = r.id

查询结果如下:
在这里插入图片描述
此时继续写UserMapper.xml

<?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.example.demo.dao.UserMapper"><resultMap id="userMap" type="user"><id column="uid" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><collection property="orderList" ofType="order"><id column="oid" property="id"></id><result column="orderTime" property="orderTime"></result><result column="total" property="total"></result></collection></resultMap><select id="findAll" resultMap="userMap">select *, o.id oid from `user` u, `order` o where u.id=o.uid</select><resultMap id="userandRoleMap" type="user"><id column="uid" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><collection property="roles" ofType="role"><id column="roleid" property="id"></id><result column="roleName" property="roleName"></result><result column="description" property="description"></result></collection></resultMap><select id="findUserandRole" resultMap="userandRoleMap">SELECT * FROM user u, user_role ur, role r where u.id = ur.userid and ur.roleid = r.id</select></mapper>

这里对应的语句是findUserandRole中的语句,返回的Map为userandRoleMap,里面定义了对应的user信息及role的信息
在总配置中加上别名配置:

<!-- 自定义别名 -->
<typeAliases><typeAlias type="com.example.demo.domain.User" alias="user"></typeAlias><typeAlias type="com.example.demo.domain.Order" alias="order"></typeAlias><typeAlias type="com.example.demo.domain.Role" alias="role"></typeAlias>
</typeAliases>

测试代码:

package com.example.demo;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.findUserandRole();for (User user : userList) {System.out.println(user);            }//        6. 释放资源sqlSession.close();}
}

结果如下:
在这里插入图片描述
和表中查询出来的结果一致

4. 小结

在这里插入图片描述
感觉就是如果是一个类里面包含有另一个类(单个对象),就通过<resultMap>+<association>就可以
然后对于一个类里面包含有另一个类的列表的,通过<resultMap>+<collection>实现即可。
其中<resultMap>中有属性idtype,前者用于指定这个resultMap的名称,type指定这个resultMap的返回类型
下面的<id>是主键,<result>是其他信息,其中包含<column>是数据库查表得到的列名称,<property>是具体的属性名
<association>中的property是对应的属性名,javaType是对应的类型
<collection>中的property是对应的属性名,ofType是列表对应的类型

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

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

相关文章

Python 在 JMeter 中如何使用?

要在JMeter中使用Python&#xff0c;需要使用JSR223 Sampler元素来执行Python脚本。使用JSR223 Sampler执行Python脚本时&#xff0c;需要确保已在JMeter中配置了Python解释器&#xff0c;并设置了正确的环境路径。 1、确保JMeter已安装Python解释器&#xff0c;并将解释器的路…

ubuntu 编译linux webrtc库

ubuntu 编译linux webrtc库 安装依赖 sudo apt-get update sudo apt-get install build-essential libssl-dev libasound2-dev libpulse-dev libjpeg-dev libxv-dev libgtk-3-dev libxtst-dev libwebp-dev sudo apt-get install libglib2.0-dev sudo apt-get update 报错时出…

css Vue尺子样式

原生css生成尺子样式 <template><div class"page"><div class"Light"></div><div class"rile"><ul id"list"><!--尺子需要几个单位就加几个--><li></li><li></li&…

【实战】K8S Helm部署Redis Cluster Redisinsight

文章目录 前言部署Redis Cluster安装Redis Insight写在最后 前言 在Web服务的开发过程中&#xff0c;Redis一直以来都有着举足轻重的作用。基本上所有的后端服务都会用这个中间件实现具体的业务场景&#xff0c;比如常作为系统缓存、分布式锁&#xff0c;也可以实现排名、定位…

检索增强生成架构详解【RAG】

生成式AI技术很强大&#xff0c;但它们受到知识的限制。 虽然像 ChatGPT 这样的LLM可以执行许多任务&#xff0c;但每个LLM的基线知识都存在基于其训练数据的差距。 如果你要求LLM写一些关于最近趋势或事件的文章&#xff0c;LLM不会知道你在说什么&#xff0c;而且回答最好是混…

单文件组件MVVM

单文件组件&MVVM 所谓组件化开发&#xff0c;就是创建一个个组件。 Vue是一个大类&#xff0c;渲染一切从new Vue开始。 指定视图&#xff1a;el template render:jsx语法 $mount[数学公式] 编译App.vue&#xff0c;作为视图入口 单个组件&#xff1a;结构 样式 data compu…

php高级工程师范文模板

以下简历内容以php高级工程师招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴&#xff0c;希望能帮助大家在众多候选人中脱颖而出。 php高级工程师简历在线制作下载&#xff1a;百度幻主简历 求职意向 求职类型&…

个人财务管理软件CheckBook Pro mac中文版特点介绍

CheckBook Pro mac是一款Mac平台的个人财务管理软件&#xff0c;主要用于跟踪个人收入、支出和账户余额等信息。 CheckBook Pro mac 软件特点 简单易用&#xff1a;该软件的用户界面非常简洁明了&#xff0c;即使您是初学者也可以轻松上手。 多账户管理&#xff1a;该软件支持…

webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍

计算一个脉冲响应和输入信号的卷积&#xff0c;除了使用原始的时域卷积以外&#xff0c;还有如下方法&#xff1a; FFT卷积的方法&#xff1a;对输入信号&#xff08;长度M&#xff09;和脉冲响应&#xff08;长度N&#xff09;分别补零到K&#xff08;K>MN-1)&#xff0c;…

【UGUI】实现跑酷游戏分数血量显示在UI中

//1.实现让玩家的金币分数显示在UI文本中 2.让血量和滑动条关联起来 这一节课主要学会获取组件并改变属性&#xff0c;举一反三&#xff01; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro;//1.实现让玩…

ES6之class类

ES6提供了更接近传统语言的写法&#xff0c;引入了Class类这个概念&#xff0c;作为对象的模板。通过Class关键字&#xff0c;可以定义类&#xff0c;基本上&#xff0c;ES6的class可以看作只是一个语法糖&#xff0c;它的绝大部分功能&#xff0c;ES5都可以做到&#xff0c;新…

电子学会C/C++编程等级考试2021年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字放大 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制:1000 内存限制:65536输入 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格…

Leetcode—1457.二叉树中的伪回文路径【中等】

2023每日刷题&#xff08;四十&#xff09; Leetcode—1457.二叉树中的伪回文路径 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int record[10] {0};int accumula…

在mathtype输入花体,如L,I, K等

在mathtype输入“\mathcal{L}"就OK了 \mathcal{K} \mathcal{I}

idea git将某个分支内的commit合并到其他分支

idea git将某个分支内的commit合并到其他分支 1.打开旧分支的代码提交记录 在IDEA中切换到新分支的代码&#xff0c;点击Git打开代码管理面板&#xff0c;在顶部点击Log:标签页&#xff08;这个标签页内将来可以选择不同分支的个人/所有人的代码commit记录&#xff09;&#x…

2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)

摘要 由于要求较高的时效性和劳力投入&#xff0c;果实采摘环节成为苹果生产作业中十分重要的一部分。而对于自然环境下生长的苹果&#xff0c;光照影响、枝叶遮挡和果实重叠等情况普遍存在&#xff0c;这严重影响了果实的准确识别以及采摘点的精确定位。针对在复杂背景下苹果的…

如何在GO中写出准确的基准测试

一般来说&#xff0c;我们不应该对性能进行猜测。在编写优化时&#xff0c;会有许多因素可能起作用&#xff0c;即使我们对结果有很强的看法&#xff0c;测试它们很少是一个坏主意。然而&#xff0c;编写基准测试并不简单。很容易编写不准确的基准测试&#xff0c;并且基于这些…

系列九、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式&#xff0c;Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明&#xff0c;是指在配置文件中声明&#xff0c;用在Spring配置文件中声明式的处理事务来…

roseha for windows 11+oracle 11g部署过程

文章目录 一、环境准备关闭防火墙配置hosts共享存储准备 二、部署步骤1.主机A、B安装数据库软件2.主机A进行数据库实例创建3.主机B创建数据库4.安装配置roseha软件 一、环境准备 windows server 2019 oracle 11.2.0.3 EE roseha for windows 11 5个IP地址&#xff1a;2心跳、3…

嵌入式FPGA IP正在发现更广阔的用武之地

作者&#xff1a;郭道正, Achronix Semiconductor中国区总经理 在日前落幕的“中国集成电路设计业2023年会暨广州集成电路产业创新发展高峰论坛&#xff08;ICCAD 2023&#xff09;”上&#xff0c;Achronix的Speedcore™嵌入式FPGA硅知识产权&#xff08;eFPGA IP&#xff09…