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简化

快速入门
详细网址:

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里面的语句
java
<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
java
<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语句
java
<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().才会提交添加后的结果
java
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();
也可以设置自动提交事务
java
SqlSession sqlSession = sqlSessionFactory.openSession(true);
主键返回
对sql映射文件进行设置,使其自动将主键的值返回到对象对应的属性去,设置useGeneratedKeys="true" keyProperty="ID";就会将主键的值返回到user对象的对应ID属性中。
java
<insert id="insertUser" useGeneratedKeys="true" keyProperty="ID">
insert into user(ID,use_Name,Age)
values (#{ID},#{useName},#{Age});
</insert>
update语句
可以直接传入对象封装的属性,也可手动一个字段一个字段的添加
java
<update id="updateByID">
update user set use_Name=#{Name},Age=#{Age} where ID = #{ID};
</update>
delete语句
单个删除
java
<delete id="deleteByID">
delete from user where id = #{ID};
</delete>
动态删除:需要使用数组来传入参数,foreach会自动将传入进来的数组转为Map集合,并进行拆解,可以指定分隔符
collection:键名称 item:对应的sql字段 separator:分隔字符 open:以什么开始 close:以什么结束
java
<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封装参数的原理
