Mybatis的基础配置解读,并简单实现增删改查

news2024/9/21 10:52:25

首先,在了解mybatis的内容之前,我们先学习了解一下mybatis的主配置文件,主配置文件(Mybatis-config.xml)是我们构建SqlSessionFactory的依据。作为Mybatis的核心内容,其内部标签的顺序,一系列配置都会影响Mybatis的运行。

1.主配置文件(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>
	<properties resource="jdbc.properties"></properties>
	<!--给类型起别名  -->
	<typeAliases>
		<!-- <typeAlias type="com.ape.bean.Student" alias="student" /> -->
		<package name="com.ape.bean"/>
	</typeAliases>
	<!-- 和spring整合后 environments配置将废除 配置数据库环境信息,注册数据源,配置数据库事务-->
	<environments default="development">
         <!-- 单个数据库环境信息,可以有多个enviroment -->
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<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>
		<!--文件路径  / 划分,有后缀:com/ape/mapper/StudentMapper.xml  -->
		<!-- <mapper resource="com/ape/mapper/StudentMapper.xml" />
       <!-- 以包的形式引入-->
		<package name="com.ape.mapper"/>	
	</mappers>
</configuration>
2.主配置文件中的标签,以及其顺序,(注意:官方文档中说明了顺序。注意不要搞乱顺序)

3.主配置文件的解读:

        我们观察主配置文件的内容就了解其层次结构,是以configuration包裹一系列内部标签,那么其内部标签的作用都是啥,我们解读分析需要用到的,最重要的几个,例如configuration,properties,typeAliases,environments,environment,transactionManager,dataSource,property,mapper等。

        1.configuration:功能:标识配置文件的起始,所有的配置文件都存在在这。

        2.properties;功能:引入外部的properties文件,resource属性写文件名加后缀,其文件内部的属性,就可以在配置文件上下文使用。

        3.typeAliases:功能:给我们自定义的“类型起别名”。并且大小写不敏感(当我们需要将数据库查询到的结果集映射为Java对象时,就需要映射类型,并且需要让mybatis知道)

               注意:配置时,以单个实体类配置可以,也可以以包引入配置。

                mybatis内部支持的别名有:

        4.environments:配置数据库环境信息,注册数据源,配置数据库事务。属性default表示默认的数据库环境(和spring整合后,将会被废除)

        5.environment:单个数据库环境信息的标识,(可有多个)

        6.transactionManager:配置数据库事务。使用 MANAGED 的事务管理机 制,这种机制 MyBatis 自身不会去实现事务管理,而是让程序 的容器(JBOSS,WebLogic)来 实现对事务的管理;

        7.dataSource:配置数据环境中数据连接信息

        8.property:配置环境信息的属性,包含driver驱动,url,数据库用户名,数据库密码

        9.mapper:用来在myabtis初始化时引入mapper映射文件,可以以xml文件的相对路径引入,也可以以包引入。

4.实现简单增删改查

        首先,我们需要创建与数据库相对应的实体类,在IMapper接口中定义对应的方法,sqlMapper.xml中书写映射所需的sql语句。通过加载主配置文件获取到的SqlSession,去执行对应sql语句,通过返回值,判断事务提交还是回滚,

        创建与数据库对应的实体类

Student.java(注意:提供必要的getter和setter方法,以及有参无参构造方法,tostring方便我们观察结果)

package com.ape.bean;

import java.util.Date;

public class Student {
	private int sid;
	private String sname;
	private Date birthday;
	private String ssex;
	private int classid;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getSsex() {
		return ssex;
	}
	public void setSsex(String ssex) {
		this.ssex = ssex;
	}
	public int getClassid() {
		return classid;
	}
	public void setClassid(int classid) {
		this.classid = classid;
	}
	public Student(int sid, String sname, Date birthday, String ssex, int classid) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.birthday = birthday;
		this.ssex = ssex;
		this.classid = classid;
	}
	public Student() {
		super();
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", birthday=" + birthday + ", ssex=" + ssex + ", classid="
				+ classid + "]";
	}
}

        数据库表:

        创建dao中mapper接口:

public interface IStudentDao {
	
	//1.添加学生
	public int insertStudent(Student stu);
	
	//2.修改学生
	public int updateStudent(Student stu);
	
	//3.删除学生
	public int deleteStudent(int id);

	//查询单个学生
	public Student findStudentById(int id);
	
	//查询所有学生
	public List<Student> findAllStudent();
}

        创建对应SqlMapper.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="test">
	<!--
		sqlMapper 文件  执行方法,和sql语句映射
	  -->
	<!--类路径  .分割, 无后缀 :  com.ape.bean.Student-->
 	<select id="findAllStudent" resultType="com.ape.bean.Student">
 		select * from student 
 	</select>
 	
 	<select id="findStudentById" parameterType="int" resultType="com.ape.bean.Student">
 		select * from student where sid=#{sid}
 	</select>
 	
 	<insert id="insertOneStudent" parameterType="com.ape.bean.Student">
 		insert into student values(null,#{sname},#{birthday},#{ssex},#{classid})
 	</insert>
 	
 	<delete id="deleteStudentById" parameterType="int">
 		delete from student where sid = #{sid}
 	</delete>
 	
 	<update id="updateStudentById" parameterType="com.ape.bean.Student">
 		update student set sname=#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid} where sid=#{sid}   
 	</update>
</mapper>

        创建对应接口的实现类,通过sqlSession实现接口,作业务逻辑判断

package com.ape.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.ape.bean.Student;
import com.ape.dao.IStudentDao;
import com.ape.util.DaoUtil;

public class StudentDaoImpl implements IStudentDao {

	@Override
	public int insertStudent(Student stu) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		int i = sqlSession.insert("insertOneStudent",stu);
		
		//事务操作
		if(i>0) {
			sqlSession.commit();
		}else {
			sqlSession.rollback();
		}
		
		return i;
	}

	@Override
	public int updateStudent(Student stu) {
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		int i = sqlSession.update("updateStudentById",stu);
		
		//事务操作
		if(i>0) {
			sqlSession.commit();
		}else {
			sqlSession.rollback();
		}
		
		return i;
	}

	@Override
	public int deleteStudent(int sid) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		int i = sqlSession.delete("deleteStudentById", sid);
		
		//事务操作
		if(i>0) {
			sqlSession.commit();
		}else {
			sqlSession.rollback();
		}
		
		return i;
	}

	@Override
	public Student findStudentById(int id) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		
		Student stu = sqlSession.selectOne("findStudentById",id);
		
		DaoUtil.closeResouces(sqlSession);
		
		return stu;
	}
	
	@Override
	public List<Student> findAllStudent() {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		
		List<Student> stulist = sqlSession.selectList("findAllStudent");
		
		DaoUtil.closeResouces(sqlSession);
		
		return stulist;
	}

}

                测试结果:

public class StudentTest {
	public static void main(String[] args) {
		updatestu();
	}
	public static void insertstu() {
		IStudentDao is = new StudentDaoImpl();
		int i = is.insertStudent(new Student(11,"吉吉",new Date(),"猴子",1));
		System.out.println(i);
	}
	public static void updatestu(){
		IStudentDao is = new StudentDaoImpl();
		int i=is.updateStudent(new Student(11,"吉吉",new Date(),"猴子",1));
		System.out.println(i);
	}
	public static void deletestu() {
		IStudentDao is = new StudentDaoImpl();
		int i = is.deleteStudent(24);
		System.out.println(i);
	}
	public static void findstuOne() {
		IStudentDao is = new StudentDaoImpl();
		
		Student stu = is.findStudentById(11);
		
		System.out.println(stu);
	}
	public static void findAllstu() {
		IStudentDao is = new StudentDaoImpl();
		
		List<Student> list = is.findAllStudent();
		
		list.forEach(System.out::println);
	}

不同的方法,返回不同语句的执行结果,这次我们只是简单实现增删改查,后面我们会通过动态代理和映射器实现。

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

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

相关文章

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

文章目录 一&#xff0c;通过域名访问商城架构设计1&#xff0c;为什么nginx要将请求转发给网关2&#xff0c;架构设计 二&#xff0c;配置1&#xff0c;nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2&#xff0c;网关配置 三&#xff0c;记录2个问题1&#xff0c;网…

qt的项目结构

目录 创建新的项目 第一个hell0程序&#xff0c;qt的项目结构 main函数 Widget头文件: pro文件 命名规范 QtCreator 常用快捷键 Qt里边绝大部分的类都是继承自QObject是一个顶层类 父子关系 Qt坐标系 QT常用API函数 对象树 信号和槽机制 自定义信号和槽 自定义信号…

PHP企业培训考试系统小程序源码

&#x1f680;企业培训考试系统&#xff0c;赋能员工成长新引擎&#x1f4da; &#x1f331; 开篇&#xff1a;解锁企业培训新篇章 在快速变化的商业环境中&#xff0c;员工的能力提升是企业持续发展的关键。&#x1f680; 传统的培训方式已难以满足现代企业的需求&#xff0…

CentOS7.9误删了yum,怎么办?

起因是这样的,有人不小心将CentOS7.9的yum插件给删除了,导致了yum命令不能用了。 据他说是执行了这句命令之后,导致的问题。 pm -qa |grep yum | xargs rpm -e --nodeps解决办法 本方法只针对:CentOS Linux release 7.9.2009 (Core)版本生效,其他版本可以参考: https://vau…

Studying-代码随想录训练营day62| Floyd 算法精讲、A*算法精讲(A star算法)、最短路算法总结篇、图论总结

第62天&#xff0c;完结撒花*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#xff0c;最后的两个算法学习&#xff0c;编程语言C 目录 Floyd 算法精讲 A*算法精讲&#xff08;A star算法&#xff09; A*算法 复杂度分析 A*算法的缺点 最短路算法总结篇 图论总结…

log4j2: CVE-2021-44228[RCE]

漏洞概述 CVE-2021-44228为Apache Log4j2漏洞&#xff0c;被称为"Log4Shell"。攻击者将恶意代码与服务器进行交互&#xff0c;使服务器日志组件将其记录并执行&#xff0c;从而造就RCE远程代码执行漏洞。 漏洞原理 日志记录机制&#xff1a;Log4j2是一个日志记录工…

【ML】自监督学习 self-supervised Learning

【ML】 自监督学习 1. 自监督学习 bert 为例子1.1 BERT 的特点&#xff1a;1.2 BERT 的模型结构&#xff1a;1.3 训练 BERT 的步骤&#xff1a; 2. how to use BERT![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f8cccb378f844923a057043fadb60758.png)2. multi-lin…

DL00765-光伏故障检测高分辨率无人机热红外图像细粒度含数据集4000+张

光伏发电作为清洁能源的重要组成部分&#xff0c;近年来得到了广泛应用。然而&#xff0c;随着光伏电站规模的扩大&#xff0c;光伏组件在运行过程中可能会出现各种故障&#xff0c;如热斑、遮挡、接线盒故障等。这些故障不仅会影响光伏电站的发电效率&#xff0c;还可能导致更…

【日常开发】 java返回ECharts数据结构封装

java返回ECharts数据结构封装 一、前端页面示例图如下&#xff1a; 二、准备测试数据&#xff1a; 三、后端 格式封装代码&#xff1a; 四、最终结果&#xff1a; &#x1f388;边走、边悟&#x1f388;迟早会好 一、前端页面示例图如下&#xff1a; 二、准备测试数据&am…

4.11.seq2seq 序列到序列学习

序列到序列学习(seq2seq) ​ 使用两个循环神经网络的编码器和解码器&#xff0c;应用于序列到薛烈类的学习任务。 ​ ​ 在图中&#xff0c;特定的"<eos>"表示序列结束词元。一旦输出序列生成此词元&#xff0c;模型就会停止预测。在循环神经网络解码器的初…

Go语言中gin+gorm开发前端端分离博客时遇到的问题,gorm执行查询时如何选中特定字段?

代码获取 本篇文章的代码放在了Github上&#xff0c;可以免费获取。 https://github.com/zhangdapeng520/zdpgo_gin_examples 概述 在查询用户信息的时候&#xff0c;由于密码这个字段比较敏感&#xff0c;需要进行处理&#xff0c;不要返回给前端。 我一开始的解决方案是直…

统计学:条件概率模型

照片由Edge2Edge Media在Unsplash上拍摄 一、介绍 在概率的许多应用中&#xff0c;不可能直接观察实验的结果&#xff1b;而是观察与结果相关的事件。因此&#xff0c;条件概率模型对于考虑和利用从观察到的事件中获得的信息至关重要。此外&#xff0c;条件概率模型与贝叶斯定理…

【vue3】【elementPlus】【黑暗模式】

从创建vue3项目到引入elementPlus组件并设置黑暗模式 1.创建vue3项目&#xff1a; npm init vuelatest1.1 根据需求定制项目插件&#xff1a; 2.引入elementPlus组件&#xff1a; npm install element-plus --save2.1 如图注册全局elementPlus组件&#xff1a; ------------…

充电不再难,高质量充电体系‘智’领绿色出行新时代

充电不再难&#xff0c;高质量充电体系‘智’领绿色出行新时代 国家发展改革委新闻发言人近日在新闻发布会上郑重声明&#xff0c;将持续强化统筹协调&#xff0c;协同各相关部门加速构建高质量充电基础设施体系&#xff0c;以更有效地满足人民群众对绿色出行的需求。 新能源汽…

C语言:文件处理

文件处理 一、文件的类型&#xff08;一&#xff09;文本文件和二进制文件 &#xff08;二&#xff09;程序文件和数据文件数据文件按照二进制储存 二、文件的打开和关闭&#xff08;一&#xff09;文件指针&#xff08;二&#xff09;文件的打开和关闭1、fopen2、fclose &…

webshell管理工具-中国蚁剑

中国蚁剑 版本说明&#xff1a;中国蚁剑 下载地址&#xff1a;GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器AntSword 加载器. Contribute to AntSwordProject/AntSword-Loader development by creating an account on GitHub.https://github.com/AntSwordProj…

数值分析【2】

目录 第三章 求解三角方程组​编辑 高斯消元​编辑 乘除次数&#xff1a;系数阵k^2,每行系数计算1&#xff0c;右边那列1 乘除总次数&#xff1a;​编辑 平方和 公式 列主元消去法 ​编辑 目的&#xff1a;舍入误差不扩散​编辑 直接LU分解​编辑 改进平方…

C#开发常见面试题三(浅复制和深复制的区别)

C#开发常见面试题三(浅复制和深复制的区别) 一.浅复制和深复制定义 &#xff08;1&#xff09;浅复制&#xff1a;复制一个对象的时候&#xff0c;仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。&#xff08;新对象和原对象将共享所有引用类型成员的实…

django如何更新数据库字段并与数据库保持同步?

关键步骤&#xff1a; 第一步&#xff1a; 执行&#xff1a;python manage.py makemigrations 你的项目名称第二步&#xff1a;它会提示你选1还是2&#xff0c;这里因为添加字段&#xff0c;所以选1第三步&#xff1a;出现>>>这个&#xff0c;直接输入这个第四步&am…

Win11+docker+vscode配置anomalib并训练自己的数据(3)

在前两篇博文中,我使用Win11+docker配置了anomalib,并成功的调用了GPU运行了示例程序。这次我准备使用anomalib训练我自己的数据集。 数据集是我在工作中收集到的火腿肠缺陷数据,与MVTec等数据不同,我的火腿肠数据来源于多台设备和多个品种,因此,它们表面的纹理与颜色差异…