B037-Mybatis基础

目录

      • 为什么需要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注入问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux篇:信号

一、信号的概念&#xff1a; ①进程必须识别能够处理信号&#xff0c;信号没有产生&#xff0c;也要具备处理信号的能力---信号的处理能力属于进程内置功能的一部分 ②进程即便是没有收到信号&#xff0c;也能知道哪些信号该怎么处理。 ③当进程真的受到了一个具体的信号的时候…

Word公式居中+序号右对齐

Word公式居中序号右对齐 # 号制表位法表格法Mathtype法 # 号 制表位法 表格法 Mathtype法 参考1 参考2

力扣每日一题:2132. 用邮票贴满网格图(2023-12-14)

力扣每日一题 题目&#xff1a;2132. 用邮票贴满网格图 日期&#xff1a;2023-12-14 用时&#xff1a;38 m 32 s 思路&#xff1a;使用前缀和&#xff0b;差分&#xff0c;只是往常是一维&#xff0c;现在变二维了&#xff0c;原理差不多 时间&#xff1a;22ms 内存&#xff1…

certum ev ssl证书1180元一年,360浏览器显示公司名

Certum旗下的EV SSL证书是审核最严的数字证书&#xff0c;不仅对网站传输数据进行加密&#xff0c;还可以对网站身份进行验证&#xff0c;除此之外&#xff0c;它独有的绿色地址栏提升了网站的真实性&#xff0c;增强了客户对网站的信任感。今天就随SSL盾小编了解Certum旗下的E…

【Spring Boot】视图渲染技术之Freemarker

一、引言 1、什么是Freemarker FreeMarker是一款模板引擎&#xff0c;基于模板和要改变的数据&#xff0c;并用来生成输出文本&#xff08;HTML网页、电子邮件、配置文件、源代码等&#xff09;的通用工具。它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c;是一款…

LAMP平台部署及应用

1、安装PHP软件包 1.1、准备工作 检查软件是否安装&#xff0c;避免冲突 [rootyang ~]# rpm -e php php-cli php-ldap php-common php-mysql --nodeps 错误&#xff1a;未安装软件包 php 错误&#xff1a;未安装软件包 php-cli 错误&#xff1a;未安装软件包 php-ldap 错误…

使用 Python 使用贝叶斯神经网络从理论到实践

一、说明 在本文中&#xff0c;我们了解了如何构建一个机器学习模型&#xff0c;该模型结合了神经网络的强大功能&#xff0c;并且仍然保持概率方法进行预测。为了做到这一点&#xff0c;我们可以构建所谓的贝叶斯神经网络。 这个想法不是优化神经网络的损失&#xff0…

2. PyTorch——Tensor和Numpy

2.1Tensor和Numpy Tensor和Numpy数组之间具有很高的相似性&#xff0c;彼此之间的互操作也非常简单高效。需要注意的是&#xff0c;Numpy和Tensor共享内存。由于Numpy历史悠久&#xff0c;支持丰富的操作&#xff0c;所以当遇到Tensor不支持的操作时&#xff0c;可先转成Numpy…

获取和移除cookie的方法

下载npm的cookie插件, 在utils.js文件中引入插件: 封装原始的Cookies.get()方法: 在xxxx.vue文件中引入方法: 使用getCookie方法获取cookie: 封装 移除cookie: export const removeCookie name>{ const options { path: /, domain: xxx.com }; Cookies.remove(name, opti…

18 5G - NR物理层解决方案支持6G非地面网络中的高移动性

文章目录 非地面网络场景链路仿真参数实验仿真结果 非地面网络场景 链路仿真参数 实验仿真结果 Figure 5 && Figure 6&#xff1a;不同信噪比下的BER和吞吐量 变量 SISO 2x2MIMO 2x4MIMO 2x8MIMOReyleigh衰落、Rician衰落、多径TDL-A(NLOS) 、TDL-E(LOS)(a)QPSK (b)16…

玩期货,千万要注意不同软件的设置啊

参加某公司的期货交易模拟选拔&#xff0c;用的是博易大师&#xff0c;结果这个软件的止损线巨坑&#xff0c;当天下午设置的止损线&#xff0c;在收盘之后软件关闭的情况下就自动作废了&#xff0c;到了晚上夜盘如果价格超相反方向走了&#xff0c;那可能导致巨亏。 幸亏是模拟…

nginx的location与rewrite

目录 一.location 二.rewrite rewrite跳转实现&#xff1a; 语法格式&#xff1a;rewrite [flag]; flag标记说明&#xff1a; 三.基于域名跳转 四.基于ip跳转 五.基于旧域名跳转到新域名后面加目录 六.基于参数匹配的跳转 可以同过全局变量来匹配&#xff1a; 基于目…

最高级别认可!喂车科技荣获国际CMMI5级认证

近日&#xff0c;喂车科技顺利通过全球软件领域最高级别认证CMMI 5级&#xff08;简称CMMI5&#xff09;认证&#xff01; 此次荣获CMMI5级认证&#xff0c;意味着喂车科技在研发管理体系、项目实施交付服务以及项目管理水平等方面均已达到国际领先水平&#xff0c;能够为客户…

如何远程访问Axure RP制作的本地web站点实现协同办公

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

在windows系统搭建LVGL模拟器(codeblock工程)

1.codeblock准备 下载codeblock(mingw)&#xff0c;安装。可参考网上教程。 2.pc_simulator_win_codeblocks 工程获取 仓库地址&#xff1a;lvgl/lv_port_win_codeblocks: Windows PC simulator project for LVGL embedded GUI Library (github.com) 拉取代码到本地硬盘&…

机器学习算法应用场景与评价指标

机器学习算法&#xff08;一&#xff09;——分类 机器学习算法&#xff08;二&#xff09;——回归 机器学习算法&#xff08;三&#xff09;——异常检测 一、应用场景 机器学习的算法选择大部分依赖于具体的问题类型和数据特征。下面是一些典型的场景以及对应的常用算法&am…

面对知识经济的发展,企业该如何做好知识管理?

面对知识经济的发展&#xff0c;企业犹如逆水行舟&#xff0c;不进则退&#xff0c;而知识管理已经成为了企业赖以生存和发展的关键。大家可能对知识经济这个词比较陌生&#xff0c;简单来说&#xff0c;知识经济就是指在经济活动中&#xff0c;知识的产生、获取、传播和应用成…

点石成金》》》从“沙粒”蜕变到“芯片”

每个半导体产品的制造都需要数百个工艺&#xff0c;Lam Research将整个制造过程分为八个步骤&#xff1a;晶圆加工-氧化-光刻-刻蚀-薄膜沉积-互连-测试-封装。 01 晶圆加工 所有半导体工艺都始于一粒沙子&#xff01;因为沙子所含的硅是生产晶圆所需要的原材料。晶圆是…

C++ Qt开发:DateTime日期时间组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QDateTime日期与时间组件的常用方法及灵活运用…

【评测脚本】agent资源监控

背景 在之前的文章中提到过,我们在测试过程中需要对机器的资源进行评测。在实际工作中,我们还会经常遇到的场景就是对于agent-server类型的业务,当部署完成后,需要对部署在机器上的agent进行资源占用的观测,不能舍本逐末,由于agent的异常资源占用,导致原有业务受机器资…