当前位置: 首页 > news >正文

JDBC:java与数据库连接,Maven,MyBatis

JDBC

是使用Java语言操作关系型数据库的一套API

JDBC是接口,用其实现一系列不同种类关系型数据库的实现类

JDBC本质:

·官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口

·各个数据库厂商去实现这套接口,提供数据库驱动jar包

·我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处:

·各种数据库厂商使用相同的接口,java代码不需要针对不同的数据库分别开发

·可随时替换底层数据库,访问数据库的java代码基本不变

使用:
 

DriverManager

·DriverManager(驱动管理类)作用:
1·注册驱动

2·获取数据库连接

Connection

·Connection(数据库连接对象)作用:

1·获取执行SQL的对象

  

2·管理事务

开启和关闭事物的具体实现:

Statement

执行Update语句的实例:

ResultSet

PreparedStatement

SQL注入的例子:

将pwd写成

'' or '1' = '1';

就更改了sql语句,将其变为

select * from tb_user where username = name and password = '' or '1' = '1';

 先执行and语句然后再是or语句

这样无论如何where 后面的语句都会等于true就会查询所有语句,这样使用resultSet.next()时就会存在这样的用户,

使用:

使用

原理

如果开启预编译功能,预编译发生的时候就是在创建PreparedStatement对象的时候,只需要PreparedStatement只需要编译一次,后续的代码要改变SQL语句,就只要改变占位符中的内容,就不会再编译一次。提高效率。

数据库连接池

简介:

使用:

Dirud连接池的使用步骤

实例:

Maven

概况

Maven是专门用于管理和构建Java项目的工具,它的主要功能有:

·提供了一套标准化的项目结构

·提供了一套标准化的构建流程(编译,测试打包,发布.....)

·提供了一套以来管理机制

标准化的项目结构

Maven项目目录的实例:

Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用

提供了一套标准化的构建流程(编译,测试打包,发布.....)

依赖管理机制

依赖管理其实就是管理你项目所依赖的第三方资源(jar包、插件...)

简介:

Maven模型

仓库的分类

导入jar包的过程

Maven常用命令

Maven的生命周期

Maven的坐标详解

Maven导入Maven项目

依赖管理

使用坐标导入jar包

快捷方法

依赖范围

通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境、测试环境、运行环境

MyBatis

MyBatis是一款优秀的持久层框架,用于简化JDBC开发

MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了Google code,并且改名为MyBatis。

官网:https://mybatis.org/mybatis-3/zh/index.html

持久层

负责将数据到保存到数据库的那一层代码

JavaEE三层架构:表现层、业务层、持久层

框架

框架就是一个半成品软件,是一套可重用的,通用的,软件基础代码模型

在框架的基础之上构建软件编写更加高效,规范,通用,可扩展

MyBatis简化

快速入门

详细网址:

入门_MyBatis中文网

Mapper代理开发

目的:

解决原生放式中的硬编码问题

简化后期执行SQL

使用

第一步将接口和sql映射文件放在同一个包名下面:

修改名称空间名,使其与Mapper接口的权限定名相同

创建接口保证里面的返回值和方法名和参数与sql映射文件的sq返回值语句的唯一标识参数相同。

还要修改mybatis-config.xml里面的mapper映射路径

最后运行代码

sql片段,每次书写SQL语句的时候就可以掉调用这个片段的di简化

书写

引用

resultMap完美解绝字段名和Mapper类型的名称不一样的问题

参数的传入

要借助参数占位符来传入参数:

1· #{} 会将其变为?,防止sql注入

2· ${} 会使用拼接字符串,并不会防止sql注入

实例:

sql映射中

 Mapper接口中

如果有多个参数就要在参数前面添加@

@Param("")

例如


也可以通过传入一个对应的POJO类,使其属性名和要用到的字段名一致就会自动匹配

还可以通过Map集合传入

*只需要保证sQL中的参数名和map集合的键的名称对应上,即可设置成功

动态sql
if语句

使用if判断哪个条件不需要的,诺不满足test里面的条件就会忽略if里面的语句

<select id="selectUserByAll" resultMap="UserResultMap">select * from user where<if test="ID != null">ID like #{ID}</if><if test="Name != null and Name != ''">and use_Name like #{Name}</if><if test="Age != null">and Age like #{Age}</if>;</select>

上述语句还有问题,如果只有中间有,则会让其变为where and use_Name like #{Name}这样会报错。解决方法,使用where语句包裹,会去掉前面多余的and

<select id="selectUserByAll" resultMap="UserResultMap">select * from user <where><if test="ID != null">and ID like #{ID}</if><if test="Name != null and Name != ''">and use_Name like #{Name}</if><if test="Age != null">and Age like #{Age}</if>;</where></select>
choose语句.

多条件中选择一个

choose(when,otherwise):选择,类似于Java中的switch语句

<select id="selectUserByAll_choose" resultMap="UserResultMap">select * from user where<choose><when test="ID != null">and ID like #{ID}</when><when test="Name != null and Name != ''">and use_Name like #{Name}</when><when test="Age != null">and Age like #{Age}</when><otherwise>and 1 != 1</otherwise></choose></select>

insert语句

基本使用

要用insert语句来进行对其数据的添加,

<insert id="insertUser">insert into user(ID,use_Name,Age)values (#{ID},#{useName},#{Age});</insert>

要注意的是,这里mapper代理不会自动提交事务,要调用sqlSession.commit().才会提交添加后的结果

 String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();userMapper mapper = sqlSession.getMapper(userMapper.class);User user = new User();user.setUse_Name("大强");user.setAge(88);user.setID(5);mapper.insertUser(user);sqlSession.commit();

也可以设置自动提交事务

SqlSession sqlSession = sqlSessionFactory.openSession(true);
主键返回

对sql映射文件进行设置,使其自动将主键的值返回到对象对应的属性去,设置useGeneratedKeys="true" keyProperty="ID";就会将主键的值返回到user对象的对应ID属性中。

<insert id="insertUser" useGeneratedKeys="true" keyProperty="ID">insert into user(ID,use_Name,Age)values (#{ID},#{useName},#{Age});</insert>

update语句

可以直接传入对象封装的属性,也可手动一个字段一个字段的添加

<update id="updateByID">update user set use_Name=#{Name},Age=#{Age} where ID = #{ID};</update>

delete语句

单个删除

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

 动态删除:需要使用数组来传入参数,foreach会自动将传入进来的数组转为Map集合,并进行拆解,可以指定分隔符

collection:键名称     item:对应的sql字段    separator:分隔字符 open:以什么开始 close:以什么结束

<delete id="deleteByID">delete from user where id in <foreach collection ="array" item ="ID" separator="," open="(" close=")">#{ID}</foreach></delete>

这段相当于把array数组在下面#{ID}有多少次:

delete from user where id in(#{ID},#{ID} .......)

并用,分隔。

collection 细节:如果是数组则=“array”是可以的,也可以自己用@Param指定

Mybaties封装参数的原理

相关文章:

  • C++漫步结构与平衡的殿堂:AVL树
  • 基于卫星遥感数据进行农作物长势监测原理简述
  • Spring普通配置类 vs 自动配置类-笔记
  • 2.5 特征值与特征向量
  • 适配国产化,私有化部署的局域网即时通讯工具-BeeWorks
  • C语言if语句的用法(非常详细,通俗易懂)
  • 如果说开启的TIM3定时器有ccr1,ccr2,ccr3,我想要关闭ccr2的PWM输出,怎么通过代码实现
  • 软件测试学习笔记
  • 操作系统 : 线程概念与控制
  • 芯片笔记 - 手册参数注释
  • STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入
  • 关系代数操作之复杂扩展操作
  • 【每天学习一点点】使用Python的pathlib模块分割文件路径
  • 力扣刷题Day 41:除自身以外数组的乘积(238)
  • n8n - 开放灵活的智能自动化工作流平台
  • vue教程(vuepress版)
  • 【Python】pyinstaller 反编译 exe
  • FPGA图像处理(四)------ 图像裁剪
  • 【C语言】(8)—指针2
  • 65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 创建 3D 图形
  • 对话哭泣照被恶意盗用成“高潮针”配图女生:难过又屈辱
  • 国务院安委会办公室印发通知:坚决防范遏制重特大事故发生
  • 首家股份行旗下AIC来了,兴银金融资产投资有限公司获批筹建
  • 江苏省泰州市委常委、宣传部部长刘霞接受审查调查
  • 国铁集团:铁路五一假期运输收官,多项运输指标创历史新高
  • 习近平在俄罗斯媒体发表署名文章