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指定