配置Mybatis环境

  • MyBatis是什么
  • 配置Mybatis环境

MyBatis是什么

MyBatis 一个支持普通 SQL 查询、存储过程以及高级映射的持久层框架。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,使得开发者可以更专注于 SQL 本身,而不必花费过多精力在繁琐的数据库操作细节上。

最原始的JDBC操作数据库的方式有以下问题:

  1. 数据库连接频繁创建、释放浪费资源进而影响系统性能;
  2. sql代码写在 java文件当中,如果在开发过程中我们改动某个sql,就需要去修改java代码,改完之后还需要重新编译;
  3. 对结果集的解析也是硬编码,对查询结果的解析过程依赖于硬编码的字段信息和显式的数据类型转换,缺乏灵活性和动态性,sql变化会导致解析结果的代码也跟着变化,系统不易维护。

针对 JDBC 编程的劣势,MyBatis 提供了以下解决方案:

  1. 在 SqlMapConfig.xml 中配置数据连接池,使用连接池管理数据库链接,避免了连接频繁创建和释放;
  2. 将 SQL 语句分离到配置文件中,MyBatis 允许将 SQL 语句写在 XML 映射文件或使用注解的方式定义,与 Java 业务代码完全分离;
  3. 提供自动映射机制,MyBatis 可以根据 SQL 查询结果的列名与 Java 实体类的属性名进行自动匹配,将结果集自动封装为对应的实体对象,无需手动编写结果集解析代码。

配置Mybatis环境

首先我们需要创建数据库和表结构准备数据

create database mybatis_demo; use mybatis_demo;CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27
17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04
11:34:34','女','深圳'),(4,'光头强','2018-03-04 12:04:06','男','广州');

创建结果如下:

在这里插入图片描述

我们需要去官网下载 MyBatis,在D盘根目录解压下载的MyBatis文件 apache-maven-3.6.2,再新建 maven 文件夹用于存项目开发jar包

在这里插入图片描述

接下来我们需要创建maven的项目,打开IDEA,点击 Project -> New Project -> Maven -> next 即可创建成功

在这里插入图片描述

自动进入刚创建好的maven项目,我们点击 File -> Settings,进行maven配置

在这里插入图片描述

稍等几秒钟IDEA解析依赖项,创建成功的样子如图:

在这里插入图片描述

导入maven相关依赖,MyBatis的3.4.5的版本的坐标、MySQL驱动的jar包、Junit单元测试的jar包、log4j日志jar包
在pox.xml中追加如下内容进行配置,maven会在底层对其进行管理

<dependencies>
<!--mybatis核心包--> 
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

再点击右上角图标进行加载jar包,稍等几秒就加载成功了

在这里插入图片描述

接下来我们需要创建 SqlMapConfig.xml 文件,是整个框架的核心配置入口,主要用于配置 MyBatis 的运行环境、数据库连接信息、类型别名、映射文件路径等关键信息。
下图是创建SqlMapConfig.xml模板内容,按照模板创建SqlMapConfig.xml文件,这里我们需要配置数据库环境,可以配置多个environment环境,通过 default 属性指定默认环境,以及配置 Mapper 映射文件的路径,告诉 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的全局行为--><settings><!--设置mybatis输出日志--><!--logImpl:表示对日志的控制--><!--STDOUT_LOGGING:将日志输出到控制台上--><setting name="logImpl" value="STDOUT_LOGGING" /></settings><environments default="mysql"><environment id="mysql"><!--配置事务的类型,使用本地事务策略--><transactionManager type="JDBC"></transactionManager><!--是否使用连接池 POOLED表示使用链接池,UNPOOLED表示不使用连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers>
</configuration>

创建 entity 包,在包中编写 User 的实体类,用于封装 User 对象的属性,该代码中的属性尽量使用包装类型,同时各变量名称需要与数据库里的保持一致,具体的代码如下(快捷键alt+enter:导入类; alt+insert:添加Getter、Setter、toString方法):

package com.qcby.entity;
import java.util.Date;public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;public User(){};public User(String username, Date birthday, String sex, String address) {this.username = username;this.birthday = birthday;this.sex = sex;this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}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 Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

创建 dao 包,在包中创建 UserDao 接口,并且定义方法,接口将使用与实现分离,调用者只需依赖接口,无需依赖具体实现类,当需要替换实现时,只需更换实现类无需修改调用代码,降低了代码间的耦合度。

package com.qcby.dao;
import com.qcby.entity.User;
import java.util.List;public interface UserDao {public List<User> findAll();
}

在resources目录下,创建mapper文件夹编写 Mapper 映射文件用于管理sql语句,创建UserMapper.xml文件模板新建mybatis-mapper.xml文件,如图

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcby.dao.UserDao"><select id="findAll" resultType="com.qcby.entity.User">select * from user</select>
</mapper>

mapper namespace="com.qcby.dao.UserDao" 是名称空间,该文件相当于是UserDao接口的实现类,实现类要实现接口中的方法
select id="findAll" 中的id属性是方法名,实现UserDao接口中方法的名称
parameterType 指定输入参数的类型,resultType 指定输出结果的类型

在Test文件下创建测试类sqlsession会话Userdao.java:

import com.qcby.Dao.UserDao;
import com.qcby.entity.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 org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserTest {private InputStream in = null;private SqlSession session = null;private UserDao mapper = null;@Before  //前置通知, 在方法执行之前执行public void init() throws IOException {//加载主配置文件,目的是为了构建SqlSessionFactory对象in = Resources.getResourceAsStream("SqlMapConfig.xml");//创建SqlSessionFactory对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//通过SqlSessionFactory工厂对象创建SqlSesssion对象session = factory.openSession();//通过Session创建UserDao接口代理对象mapper = session.getMapper(UserDao.class);}@After  //@After: 后置通知, 在方法执行之后执行 。public void destory() throws IOException {//释放资源session.close();in.close();}@Testpublic void findAll(){List<User> users = userDao.findAll();for (User user : users) {System.out.println(user.toString());}}
}

@Test 是 Java 单元测试框架中用于标记测试方法的注解,用于标识一个方法是测试方法,方便框架自动执行并验证代码功能

findAll() 方法的实现结果如图:

在这里插入图片描述

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

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

相关文章

生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享

生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享 在大规模分布式微服务架构中&#xff0c;如何在多集群环境下平滑、安全地发布新版本&#xff0c;一直是保证高可用、高可靠的关键需求。本文以真实生产环境案例为基础&#xff0c;分享我们团队基于Istio Servic…

Kubernetes(k8s)之认识Pod

01了解Pod Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。 一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。它可能由单个容器或多个容器共享组成的资源。 Kubern…

Nginx服务做负载均衡网关

1. 概述 内部Nginx服务器做服务网关&#xff0c;代理后端应用服务&#xff0c;卸载ssl域名证书&#xff0c;将接收的https请求&#xff0c;转发至后端http服务。华为防火墙负责NAT&#xff0c;启用服务器负载均衡功能&#xff0c;将公网虚拟IP端口映射到内部多台Nginx服务器上…

十三、请求响应-请求:日期参数和JSON参数

日期参数代码&#xff1a;日期参数 //日期时间参数RequestMapping("/dataParam")public String dataParam(DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}结果JSON参…

可信数据库大会现场,TDengine 时序数据库展示核电场景下的高性能与 AI 创新

设备在升级&#xff0c;场站在扩建&#xff0c;但数据系统却还在“跟不上”。这正是许多核电企业在推进数字化转型过程中最真实的感受。高频采集、长周期存储、精度要求高……这些构成了对数据库系统的“炼狱级考验”。在这样一个背景下&#xff0c;国产数据库的能力边界正在被…

ctflearn-POST practice

靶场地址&#xff1a;165.227.106.113/post.php 解题&#xff1a; 一.分析题目 提示&#xff1a; 知道要用POST请求提交表单&#xff0c;看一下源码信息 得到可能需要用post请求方式去提交表单&#xff0c;并且传数据admin和password&#xff0c;这边提供两种方式 方法一&…

FPGA实现OV7670摄像头图像处理至VGA显示器

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本项目基于FPGA技术&#xff0c;结合OV7670摄像头传感器进行视频捕获&#xff0c;经SDRAM存储&#xff0c;并通过VGA显示器展示。同时&#xff0c;集成了中值滤波算法提高图像清晰度。该项目涉及数字图像处理系…

使用python写一套完整的智能体小程序

创建一个简单的智能体&#xff08;Agent&#xff09;程序在人工智能和自动化任务中&#xff0c;智能体&#xff08;Agent&#xff09;是指能够感知环境并通过决策和行动来实现目标的实体。Python 提供了丰富的库和框架&#xff0c;可以用于构建智能体程序&#xff0c;例如使用 …

电商项目_性能优化_海量数据读写、存储、检索

海量数据读写方式选择高并发读写场景分析无论任何业务系统&#xff0c;无非就是两个操作&#xff1a;写和读。 在海量数据和高并发的场景下&#xff0c;写和读就会成为系统性能的瓶颈。下面分析不同业务场景下面临的问题&#xff1a;侧重“高并发读”的系统场景1&#xff1a;搜…

RabbitMQ面试精讲 Day 9:优先级队列与惰性队列

【RabbitMQ面试精讲 Day 9】优先级队列与惰性队列 文章标签 RabbitMQ,优先级队列,惰性队列,消息队列,面试技巧,系统架构 文章简述 本文是"RabbitMQ面试精讲"系列第9天&#xff0c;深入解析优先级队列与惰性队列的实现原理与实战应用。文章详细讲解优先级队列的排…

[硬件电路-121]:模拟电路 - 信号处理电路 - 模拟电路中常见的难题

模拟电路设计是电子工程中极具挑战性的领域&#xff0c;其核心难题源于信号的连续性、元件的非理想特性以及环境干扰的复杂性。以下是模拟电路中常见的难题及其技术本质与解决方案&#xff1a;1. 噪声与干扰&#xff1a;信号的“隐形杀手”技术本质&#xff1a;模拟信号对微小电…

Java 大视界 -- Java 大数据在智能交通智能停车诱导与车位共享优化中的应用(381)

Java 大视界 -- Java 大数据在智能交通智能停车诱导与车位共享优化中的应用&#xff08;381&#xff09;引言&#xff1a;正文&#xff1a;一、智能停车的 “老大难”&#xff1a;不只是 “车位少” 那么简单1.1 车主与车位的 “错位困境”1.1.1 信息滞后的 “睁眼瞎”1.1.2 车…

基于落霞归雁思维框架的自动化测试实践与探索

基于落霞归雁思维框架的自动化测试实践与探索 在当今快速发展的软件开发领域&#xff0c;自动化测试已成为提高软件质量和开发效率的关键环节。本文将结合落霞归雁的思维框架——“观察现象 → 找规律 → 应用规律 → 实践验证”&#xff0c;探讨如何将其应用于自动化测试领域&…

Unity Shader编程进阶:掌握高阶渲染技术 C# 实战案例

Unity Shader编程完全入门指南&#xff1a;从零到实战 C# 本文将深入探讨Unity Shader编程的高级技术&#xff0c;包括自定义光照模型、后处理效果、GPU实例化、表面着色器深度应用等&#xff0c;帮助开发者提升渲染效果与性能优化能力。 提示&#xff1a;内容纯个人编写&#…

(论文速读)Text-IF:基于语义文本引导的退化感知交互式图像融合方法

论文信息论文题目&#xff1a;Text-IF: Leveraging Semantic Text Guidance for Degradation-Aware and Interactive Image Fusion&#xff08;Text-IF:利用语义文本指导退化感知和交互式图像融合&#xff09;会议&#xff1a;CVPR2024摘要&#xff1a;图像融合的目的是将不同源…

python创建一个excel文件

以下是使用Python根据指定名称创建Excel文件的两种实现方法&#xff0c;根据需求选择适合的方案&#xff1a;方法一&#xff1a;使用pandas库&#xff08;适合结构化数据&#xff09; # 安装依赖&#xff08;命令行执行&#xff09; # pip install pandas openpyxlimport panda…

C++高频知识点(十四)

文章目录66. 程序什么时候应该使用多线程&#xff0c;什么时候单线程效率高&#xff1f;67. 死锁的原因和避免死锁的避免预防死锁&#xff1a;破坏持有并等待条件68. TCP拥塞控制四个阶段轮换过程描述69. C的内存管理70. 构造函数可以是虚函数吗&#xff0c;析构函数呢66. 程序…

浅窥Claude-Prompting for Agents的Talk

Prompting for Agents先说一句&#xff1a;颜值这么高&#xff0c;你俩要出道啊。此图基本就是claude倡导的agent prompt结构了&#xff0c;可以看到经过一年时间的演变&#xff0c;基本都是follow这个结构去写prompt。我比较喜欢用Role→react→task→histroy→few shot→rule…

【MySQL04】:基础查询

MySQL的基本查询表的增删查改 insert(插入) insert [info] table_name [(colume, [,colume] ...)] values (value_list) ...对于value_list我们通过,作为分隔符 插入替换我们使用on duplicate key update, 表示如果存在主键冲突, 会进行更新, 这个字段后面还有写更新的字段repl…

NGINX反向代理golang后端服务

nginx配置参考&#xff08;/etc/nginx/sites-available路径下创建配置文件&#xff09; server {listen 80; # 监听80端口server_name ip; # 你的域名或IPlocation / {root /var/www/test_page/;index index.html; # 默认文件try_files $uri $uri/ /index.html; # 单页…