Spring集成MyBatis

基本准备

创建Dynamic Web Project
引入相关jar包

        Spring框架相关jar包

        MyBatis连接Spring相关jar包

        连接MySQL驱动包

         JSTL标签库包

添加db.properties文件,该属性文件配置连接数据库相关信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
user=root
password=
添加Spring配置文件,在src中新增applicationContext.xml,并引入该属性文件
<!-- 导入数据库连接信息的属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
在Spring配置文件中添加DataSource的配置,PooledDataSource为MyBatis实现的数据库连接池 
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
<property name="driver" value="${driver}"></property>
<property name="username" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="url" value="${url}"></property>
</bean>
在Spring配置文件中添加SqlSessionFactoryBean,用来创建SqlSessionFactory对象

        configLocation:用于指定MyBatis的mybatis.xml配置文件的路径

         dataSource:用于配置数据源,该属性为必选项,可以直接引用已经配置好的dataSource数据库连接池

        mapperLocations:扫描XML映射文件的路径 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 添加mybatis主配置文件的位置 --><property name="configLocation" value="classpath:mybatis.xml"/><!-- 需要一个数据源 --><property name="dataSource" ref="dataSource"></property><!-- 设置映射文件的位置 --><property name="mapperLocations"><array><value>classpath:net/onest/server/dao/*.xml</value></array></property>
</bean>
在Spring配置文件中添加MapperScannerConfigurer,自动扫描所有的Mapper接口

basePackage:用于配置基本的包路径 

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="net.onest.server.dao"/>
</bean>
按照SSH集成的web.xml,添加Spring和SpringMVC相关配置
创建实体类
创建数据库表
创建index.jsp 

 

开发Mapper层(Dao层)

Mapper层也就是常说的数据访问层(Dao层)。根据配置文件中配置的自动扫描接口的包名创建映射接口和XML映射文件

public interface UserMapper {public List<User> findAllUsers();public int saveUser(User u);
}
<mapper namespace="net.onest.server.dao.UserMapper"><resultMap type="net.onest.server.entity.User" id="userMap"><id column="id" property="id"/><result column="user_name" property="userName"/><result column="password" property="password"/></resultMap><select id="findAllUsers" resultMap="userMap">select * from user</select><insert id="saveUser">insert into user(user_name,password)  values(#{userName},#{password})</insert>
</mapper>

开发业务层(Service层)

添加Service层的接口和实现类

public interface UserService {public List<User> findAllUsers();public int saveUser(User u);
}
@Service
public class UserServiceImpl implements UserService{@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAllUsers() {return userMapper.findAllUsers();}@Overridepublic int saveUser(User u) {return userMapper.saveUser(u);}
}

Service的实现类需要添加@Service注解,由于在Spring配置文件中配置了自动扫描Service实现类所在的包,所以Spring在初始化时就会扫描到添加了@Service注解的类

由于配置了自动扫描Mapper接口,所以在Service层可以使用@AutoWired注解自动注入Mapper 

 

开发控制层(Controller层)

@RequestMapping("/user")
@Controller
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/userList")public ModelAndView getUsers() {ModelAndView mv = new ModelAndView("userList");List<User> users = userService.findAllUsers();mv.addObject("users", users);return mv;}……
}
@RequestMapping("/addUser")
public ModelAndView addUser() {ModelAndView mv = new ModelAndView("addUser");User u = new User();mv.addObject("user", u);return mv;
}
@RequestMapping("/saveUser")
public ModelAndView saveUser(User u) {ModelAndView mv = new ModelAndView();userService.saveUser(u);mv.setViewName("redirect:/user/userList");return mv;
}

 

开发视图层(View层)

根据在SpringMVC配置文件中的视图配置需要在WebContent/WEB-INF中新建jsp目录来存放所有的jsp文件

<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/>
</bean>

 

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

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

相关文章

TypeScript系列之-理解TypeScript类型系统画图讲解

TypeScript的输入输出 如果我们把 Typescript 编译器看成一个黑盒的话。其输入则是使用 TypeScript 语法书写的文本或者文本集合。 输出是编译之后的 JS 文件 和 .d.ts 的声明文件 其中 JS 是将来需要运行的文件(里面是没有ts语法&#xff0c;有一个类型擦除的操作)&#xff0…

【保姆级】国内Onlyfans如何订阅?OnlyFans订阅保姆级指南

​ 一、 Onlyfans介绍 OnlyFans是一个创立于2016年的在线平台和应用程序&#xff0c;它集结了众多来自健身、音乐、艺术等领域的内容创作者&#xff0c;呈现了他们精彩纷呈的作品。该平台颠覆了传统商业模式&#xff0c;为创作者提供了一个展示独特内容的舞台&#xff0c;用户…

【报错】Python3.9及以上相对路径导入文件夹方式

Python3.9及以上相对路径导入文件夹 python跨文件夹调用别的文件夹下的py文件或参数方式 5.7. 包相对导入 相对导入使用前缀点号。 一个前缀点号表示相对导入从当前包开始。 两个或更多前缀点号表示对当前包的上级包的相对导入&#xff0c;第一个点号之后的每个点号代表一级…

学python能赚钱吗???

python爬虫去哪接单 python爬虫接单的方式有两种 一&#xff0c;接定制需求的单子 爬虫定制的需求其实很多&#xff0c;比如 “爬取某某电商网站的评论”&#xff0c;这类需求一般是按照爬取数据量的大小来收费&#xff0c;价格不会太高&#xff0c;正常500的样子。 常见的…

个推助力小米汽车APP实现智能用户触达,打造智能出行新体验

4月3日&#xff0c;小米SU7首批交付仪式在北京亦庄的小米汽车工厂总装车间举行&#xff0c;全国28城交付中心也同步开启首批交付。随着小米SU7系列汽车的正式发售和交付&#xff0c;小米汽车APP迎来了用户体量的爆发式增长。 小米汽车APP是小米汽车官方推出的手机应用&#xff…

linux编辑技巧

vim的模式 正常模式&#xff1a;用于导航和打开文件。编辑模式&#xff1a;用于输入文本。可视模式&#xff1a;用于选择文本块进行操作。命令模式&#xff1a;执行命令的强大方式。 正常模式 移动 hjkl上下左右^开头 $结尾gg/G 文件开头或结尾 ctrlo返回ctrlu ctrlf&#xff…

复试专业课问题

1、数据结构&#xff1a;详细描述归并排序的过程 归并排序是用分治思想&#xff0c;分治模式在每一层递归上有三个步骤&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将n个元素分成个含n/2个元素的子序列。解决&#xff08;Conquer&#xff09;&#xff1a;用…

Vue - 你知道Vue组件之间是如何进行数据传递的吗

难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…

swampCTF 2024

swampCTF 2024 MISC Discord Challenge swampCTF{w3lc0m3_t0_th3_swamp} What the Form google form不停重定向&#xff0c;直接F12看一下。flag就在前端。 swampCTF{F0rm5_K33p5_D4T4_H1dd3n} OSINT Lost in Space 图片是旅行者2号&#xff0c;问距离地球多少个天文单…

python中的垃圾回收机制

Python中的垃圾回收&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;机制是一个自动内存管理过程&#xff0c;它负责在对象不再被使用时释放内存资源。Python的垃圾回收主要依赖于引用计数&#xff08;Reference Counting&#xff09;来跟踪和回收不再使用的对象…

windows下python3安装rolabelimg或者labelimg2标注斜框

1.前言 大家常用labelimg标注物体&#xff0c;但当目标物体是倾斜角度时&#xff0c;labelimg标注时会把不属于物体的一大片区域也标注&#xff0c;这样标注效果不大好&#xff0c;那么有什么工具可以标注倾斜的矩形框呢&#xff0c;本篇通过介绍安装rolabelimg或者labelimg2&…

创建型模式--3.工厂模式 【人造恶魔果实工厂2】

1. 简单工厂模式的弊端 在上一节简单工厂模式中&#xff0c;创建了一个工厂类&#xff0c;用于生产需要的对象&#xff0c;但是这种方式有一个弊端&#xff0c;它违反了设计模式中的开放-封闭原则&#xff0c;先来看相关的代码&#xff1a; // 恶魔果实工厂类 enum class Typ…

初识虚拟机:探索数字世界的神奇工具

前言 在计算机科学领域&#xff0c;虚拟机是一种强大而神奇的工具&#xff0c;它可以让我们在一台计算机上同时运行多个操作系统&#xff0c;仿佛创造了一个独立的数字世界。本文将带你深入探索虚拟机&#xff0c;帮助你更好地理解这个让计算机变得更加灵活多样的工具。 什么…

使用美化方法设计项目主窗体(二)

使用美化方法设计项目主窗体 分析效果图的实现 效果图&#xff1a; 新建 Windows 窗体 新窗体命名&#xff1a;FrmMain.cs修改窗体的位置&#xff1a;StartPosition&#xff1a;CenterScreen窗体的无边框设计&#xff1a;FormBorderStyle&#xff1a;none修改窗体的大小&a…

Go语言并发(一)——goroutine与Waitgroup

协程 前言 在很多语言中都会提到并发的概念&#xff0c; 例如python&#xff0c; Java&#xff0c;C等等&#xff0c;一般来说 都会 使用多线程或多进程来 实现并发调度&#xff0c;但是多线程/进程 一般会耗费大量内存, 而在go 语言中我们可以使用协程来达到并发调度的目的&…

高级优化理论与方法(七)

高级优化理论与方法&#xff08;七&#xff09; Solving Linear EquationsCase 2TheoremKaczmarzs AlgorithmTheoremExample PseudoinverseDefinitionSpecial Case 1Special Case 2 Properties of PseudoinverseLemma 1: Unique pseudoinverseLemma 2: Full Rank Factorization…

Pytorch实用教程:Pytorch中model.eval()和torch.no_grad()的作用及用法

文章目录 1. model.eval()为什么需要 .eval() 方法&#xff1f;使用 .eval() 方法示例 注意事项 2. torch.no_grad()为什么需要 torch.no_grad()&#xff1f;使用 torch.no_grad()示例场景注意事项 1. model.eval() model.eval() 在 PyTorch 中是一个重要的方法&#xff0c;用…

MySQL8.3.0 主从复制方案(master/slave)

一 、什么是MySQL主从 MySQL主从&#xff08;Master-Slave&#xff09;复制是一种数据复制机制&#xff0c;用于将一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到其他一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;。这种复制机制可以提供…

如何让阿里云AI001号员工帮我写代码(含IDEA插件使用)

国内首个AI程序员入职阿里云&#xff1a;专属工号AI001&#xff0c;KPI是一人写完公司20%代码。 不管是真是假&#xff0c;AI 程序员发展的趋势是无法改变的&#xff0c;小米汽车发布会上&#xff0c;雷军说到小米汽车工厂的自动化率达到90%以上&#xff0c;有些车间甚至100%的…

手术麻醉系统源码 医疗信息管理系统源码C#.net6.0+ vs2022,vscode+BS网页版 手麻系统源码

手术麻醉系统源码 医疗信息管理系统源码C#.net6.0 vs2022,vscodeB/S网页版 手麻系统源码 手术麻醉管理系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&…