B037-Mybatis基础

news2024/9/22 15:25:10

目录

      • 为什么需要Mybatis?
      • mybatis简介
      • 入门案例
        • 其余见代码
          • 查询流程
          • 增删改流程 - 变动数据要加事务去持久化
          • 抽取公共类
      • mapper接口开发规则
        • 概述
        • 代码
      • mapper.xml引入本地约束文件
      • 别名
      • 日志管理
        • 作用
        • log4j的使用规范
      • 井大括号与dollar大括号的区别

框架:半成品,需要我们去补充核心代码才是完整的项目
dao(mybatis - 底层就是JDBC) - service - controller(servlet 接收请求 获取参数 处理请求 响应)

为什么需要Mybatis?

原生的JDBC代码:
1.代码量多,并且重复
2.SQL语句和Java写在一起了,耦合度高
3.自己释放连接
4.如果是执行查询语句,还要将结果集手动转换成集合或对象

Mybatis:
1.使用简单的API直接操作数据库,提高了开发效率
2.SQL语句与代码分离,存放于xml配置文件中,方便维护
3.Mybatis消除了几乎所有的JDBC代码和手工设置参数以及结果集的转换
4.提供XML标签,支持编写动态SQL,代替编写逻辑代码

注意:Mybatis底层还是JDBC代码,相当其他人写好的一个优秀的工具类【功能强大,性能较好】

mybatis简介

Mybatis是一个持久层的半ORM框架,底层是JDBC

持久化 = 数据持久化:就是将数据保存在可掉电设备【文档 【txt、xml、Excel等】、数据库、U盘】中

数据库持久化:将对象和数据保存在数据库中,用JDBC,Mybatis等技术

ORM:Object Relational Mapping - 对象关系映射
有了ORM,我们查询数据库中的数据会自动转成java中对象,不需要做对象转换了

入门案例

新建普通java项目(前面涉及交互一直用动态web项目来着),

入门案例:
    1.准备数据(表, 实体类,持久层)
    2.导包(数据库驱动包,mybatis相关jar包,日志jar)
    3.核心配置文件(一般我们命名为mybatis-config.xml)------ 链接数据库
    4.映射文件   xml文件-----(写sql语句的)
    5.测试

tips:
1.日志包支持把执行的sql语句打印到控制台上,可以观看
2.web项目可以自动导包,普通java项目需要手动build path

其余见代码

IUserDao - UserDaoImpl
mybatis-config.xml,db.properties
IUserDao.xml,配置到核心配置文件

IUserDao,IUserDao.xml,UserDaoImpl,MybatisTest

查询流程

IUserDao,IUserDao.xml

<mapper namespace="cn.itsource.dao.IUserDao">
    <!-- 
		id:唯一标识,和方法名相同		namespace+id,确定当前使用的sql
		parameterType:传入的参数类型,可以不写(强烈建议不写,让它自动匹配,避免写错)
		resultType:返回值类型,有返回值的必须写,如果是集合写集合里的类型,不写list
	 -->
    <!-- User findOne(Integer id) -->
    <select id="findOne" resultType="cn.itsource.domain.User">
		select * from user where id = #{id}
	</select>
</mapper>

UserDaoImpl

	@Override
	public User findOne(Integer id) throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
		// 参数一:要执行的sql语句 名称空间+id = 唯一的SQL,参数二: sql语句中需要的参数 id
		User user = session.selectOne("cn.itsource.dao.IUserDao.findOne", id);
		return user;
	}

MybatisTest

	@Test
	public void findOne() throws Exception {
		// 获取对象
		IUserDao dao = new UserDaoImpl();	// 多态的写法
		User user = dao.findOne(2);
		System.out.println(user);
	}
增删改流程 - 变动数据要加事务去持久化

IUserDao,IUserDao.xml

	<delete id="delete">
		delete from user where id = #{id}
	</delete>	

UserDaoImpl

	@Override
	public void delete(Integer id) throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
		session.delete("cn.itsource.dao.IUserDao.delete", id);
		// 提交事务
		session.commit();
	}

MybatisTest

	@Test
	public void delete() throws Exception {		
		// 获取对象
		IUserDao dao = new UserDaoImpl();
		dao.delete(6);
	}
抽取公共类
public class MybatisUtils {
	static SqlSessionFactory sqlSessionFactory = null;
	static{		
		try {
			// 获取sqlSessionFactory
			InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);					
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
	// 返回一个sqlSession
	public static SqlSession getSqlSession(){
		return sqlSessionFactory.openSession();
	}
}

mapper接口开发规则

概述

在这里插入图片描述

代码

UserMapper,UserMapper.xml,配置到核心配置文件,MapperTest

UserMapper

public interface UserMapper {

	User findOne(Integer id) throws IOException;
	
	List<User> findAll() throws IOException;

	void add(User user);

	void delete(Integer id) throws IOException;

	void update(User user);
}

UserMapper.xml

<!-- namespace:名称空间:接口的全路径 -->
<mapper namespace="cn.itsource.mapper.UserMapper">

	<!-- id: 方法名相同 -->
	<select id="findOne" resultType="cn.itsource.domain.User">   <!-- 查询一条 -->
		select * from user where id = #{id}	
	</select>	
	
	<select id="findAll" resultType="user">     <!-- 查询所有 -->
		select * from user
	</select>
	
	<delete id="delete">
		delete from user where id = #{id}      <!-- 删除指定一行 -->
	</delete>
	
	<update id="update">
		update user set name = #{name},age = #{age}, sex = #{sex}  <!-- 修改一行 -->
		where id = #{id}
	</update>
	
	<insert id="add">
		insert into user(name,age,sex) values(#{name},#{age},#{sex})  <!-- 增加一行 -->
	</insert>
	
</mapper>

mybatis-config.xml

	<mappers>
		<!-- 映射文件 -->
		<mapper resource="cn/itsource/mapper/UserMapper.xml" />
	</mappers>

MapperTest

	@Test
	public void findName() throws Exception {
		// 获取sqlSession
		SqlSession session = MybatisUtils.getSqlSession();
		
		// 接口new对象么?  mapper:代理对象
		UserMapper mapper = session.getMapper(UserMapper.class);
		// System.out.println(mapper);
		
		// 根据id查询
		User user = mapper.findOne(3);
		System.out.println(user);
        
/*		// 查询所有
		List<User> list = mapper.findAll();
		System.out.println(list);
		
		// 添加
		mapper.add(new User(null, "杨过", 30, "男"));
		
		// 删除
		mapper.delete(4);
		
		// 修改
		mapper.update(new User(3, "小龙女", 50, "女"));
		
		// 提交事务
		session.commit();*/
    }

mapper.xml引入本地约束文件

在这里插入图片描述
本地引入
步骤一:
在这里插入图片描述
步骤二:
重新打开mapper.xml

别名

1.在mybatis的主配置文件中配置

<!-- 配置别名  -->
<typeAliases>
	<!-- 这个包下面的类都可以写简写:要么直接写类名,要么写首字母小写的类名 -->
	<package name="cn.itsource.domain"/>
</typeAliases>

2.在mapper映射文件中使用别名

直接类名或类名的首字母小写

日志管理

作用

有了日志我们可以看到数据的执行过程,还可以帮助我们去解决问题

log4j的使用规范

1.导入jar包
log4j-1.2.17.jar,slf4j-api-1.7.2.jar,slf4j-log4j12-1.7.2.jar

2.在resources下面新建属性文件log4j.properties,内容直接拷贝,修改包名

#5.控制台输出+自定义布局
log4j.rootLogger=DEBUG,my
#指定输出器
log4j.appender.my=org.apache.log4j.ConsoleAppender
#指定布局器(自定义布局)
#指定布局为自定义布局
log4j.appender.my.layout=org.apache.log4j.PatternLayout
#指定在自定义布局的格式,%d -- 表示当前系统时间,%t -- 执行该业务的线程名称,%p -- 日记器的级别,-5 -- 5表示输出字符的个数,符号表示右对齐
#%c -- 表示指定业务所在的类的完全限定名(包名.类名),%m -- 输出额外信息,%n -- 表示换行
log4j.appender.my.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.cn.itsource=debug

井大括号与dollar大括号的区别

#{}:相当于PrepareStatement,会预编译,先编译(未填参数用占位符),再传参数,然后执行,不会出现sql注入问题
${}:相当于Statement,拼接字符串后再编译,会出现sql注入问题

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

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

相关文章

C# OpenVINO 直接读取百度模型实现图片旋转角度检测

目录 效果 模型信息 代码 下载 C# OpenVINO 直接读取百度模型实现图片旋转角度检测 效果 模型信息 Inputs ------------------------- name&#xff1a;x tensor&#xff1a;F32[?, 3, 224, 224] --------------------------------------------------------------- Ou…

[RTOS移植]--STM32F767移植RTThread

文章目录 通过STM32cube创建一个工程选择要移植的RTOS源下载到本地如果没有重启软件选择对应配置后续补充 通过STM32cube创建一个工程 选择要移植的RTOS源 下载到本地 如果没有重启软件 选择对应配置 Build started: Project: STM32F767 *** Using Compiler V5.06 update 7 (b…

Self-Attention的学习

文章目录 Self-Attention模型的输入与输出1.为什么引入Self-Attention&#xff1f;2.Self-attention&#xff08;重点&#xff09;2.1 整体架构2.2 计算单个输出的原理2.3 整体的矩阵计算 3.Multi-head Self-attention4.Self-attention的缺点5.Self-attention与CNN的对比6.Self…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装&#xff0c;主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

msvcr100.dll丢失的多种解决方法,哪个方法更合适你呢

我们打开电脑程序的时候&#xff0c;系统提示电脑丢失msvcr100.dll&#xff0c;无法启动此程序&#xff0c;这该怎么办&#xff1f;msvcr100.dll是电脑一个重要的文件&#xff0c;丢失了就会导致一些应用程序打不开。下面我们就来看看详细的解决步骤。 msvcr110.dll为Visual St…

IS-IS原理与配置

IS-IS原理与配置 • IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP &#xff08;ConnectionL…

MySQL——库,表基础操作

目录 一.库的操作 1.显示当前的数据库列表 2.创建数据库 3.字符集和校验规则 4.操纵数据库 5.删除数据库 6.数据库备份与还原 7.查看连接情况 二.表的操作 1.创建表 2.查看表结构 3.修改表 4.删除表 一.库的操作 1.显示当前的数据库列表 show databases; 2.创建数…

PyQt6 QSpacerItem弹簧控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

QT案例 使用WMI获取win_32类的属性值,包括Win32提供程序类中的属性

最近涉及到读取WINDOWS 系统电脑设备的各种信息&#xff0c;在一些特殊的PE或者简化系统中是没有WMI查询工具的&#xff0c;所以就自己写了个查询大部分WMI属性值的工具&#xff0c;免去了查网站的功夫。涉及到的方法内容就汇总做个总结。 PS:因为工作中软件基本都是我一个人开…

关于react native项目中使用react-native-wechat-lib@3.0.4

关于react native项目中使用react-native-wechat-lib3.0.4 插件官网安装依赖包&#xff08;Android和iOS下载插件完成后记得更新依赖&#xff0c;&#xff09;Android中配置1.在项目文件夹下面创建文件夹wxapi&#xff08;如上图&#xff09;2.在文件MainApplication.java中如下…

软件设计师——法律法规(三)

&#x1f4d1;前言 本文主要是【法律法规】——软件设计师——法律法规的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

JAVA代码审计之深入XXE漏洞挖掘与防御

文章目录 前言WebGoat1.1 Docker环境搭建1.2 Leve1-XXE回显1.3 代码审计与溯源1.4 Jaxb的反序列化1.5 Level2-格式校验1.6 Level3-XXE盲注 挖掘与防御2.1 XMLReader2.2 SAXBuilder2.3 SAXReader2.4 SAXParserFactory2.5 Digester2.6 DocumentBuilderFactory2.7 XXE挖掘技巧小结…

strlen的三种模拟实现方法

首先&#xff0c;我们要了解strlen函数的参数以及返回值&#xff0c;还有使用方法。 1. 计数器方法 #include <stdio.h>size_t my_strlen(const char* str) {int count 0;while (*str) {count;}return count; } int main() {char arr[] "abcdef";int len …

Angular+Nginx区域HIS医院信息管理系统源码

医院管理信息系统&#xff08;HIS&#xff09;是医院基本、重要的管理系统&#xff0c;是医院大数据的基础。“云”指系统采用云计算的技术和建设模式&#xff0c;具有可扩展、易共享、区域化、易协同、低成本、易维护、体验好的优势。“H”是医疗卫生&#xff0c;由原来医院 (…

Flask学习四:补充

插件 flask-caching 简介 Flask-Caching 是一个 Flask 扩展&#xff0c;旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术&#xff0c;通过将常用数据暂时存储在一个快速访问的位置&#xff08;如内存或磁盘&#xff09;&#xff0c;从而减少对较慢资源&…

ssm基于MVC的舞蹈网站的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;舞蹈网站当然也不能排除在外。舞蹈网站是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用Java技…

自动化测试(终章)webdriver的常用api(2)以及新的开始

目录 多层框架/窗口定位 多层框架的定位 frame是什么&#xff1f; 多层窗口定位 层级定位 使用 XPath 进行层级定位&#xff1a; 使用 CSS 选择器进行层级定位&#xff1a; 下拉框处理 alert、confirm、prompt 的处理 Alert 弹窗&#xff1a; Confirm 弹窗&#xff…

万兆网络之屏蔽线序接法(上)

可以经常听到用RJ45指代网线&#xff0c;用RJ11指代电话线的&#xff0c;RJ&#xff08;Registered Jack&#xff09;即已注册插口&#xff0c;可以简单理解为一种约定就行&#xff08;参见参考链接&#xff09; 前一篇已经讲到&#xff0c;网线线对互相缠绕是为了电流方向相反…

Redis List类型

列表类型是用来存储多个有序的字符串&#xff0c;如图所示&#xff0c;a、b、c、d、e 五个元素从左到右组成了一个有序的列表&#xff0c;列表中的每个字符串称为元素 (element)&#xff0c;一个列表最多可以存储2的32次方 -1个元素。在 Redis 中&#xff0c;可以对列表两端插入…

spring面试:一、面试题分类总览+bean线程安全问题+AOP相关问题(定义、使用步骤、编程式事务管理和声明式事务管理和声明式事务管理失效)

面试题分类总览 bean线程安全问题 单例/多例 单例&#xff08;singleton&#xff09;&#xff1a;在每个spring ioc容器中都只有一个实例。 多例&#xff08;prototype&#xff09;&#xff1a;在每个spring ioc容器中有多个实例。 默认情况下spring中的bean都是单例的。但是…