jdbc笔记分享

eslipse与ideal区别:
eslipse是保存时编译
ideal是运行时编译

ideal的编码字符集为GBK
而数据库为utf-8
如果数据库出现乱码,只需要在ideal里的db.properties文件的url行后面添加
characterEncoding字符编码
?useUnicode=true&characterEncoding=utf8

mysql中字符串参数用‘’
mysql里的注释:#



课程目标:
1.什么是jdbc
2.jdbc开发步骤
3.如何封装工具类,ORM映射
4.设计模式:
DAO层,(数据库)Druid连接池
5.Service层,(service层如何控制事务)
6.DAOUtils(工具类),三层架构

a.客户端操作数据库:
手工建立连接-输入用户名密码-编写SQL语句-执行-查看结果(
结果集或受影像行数)
但实际开发中,不可能通过客户端操作数据库
因为用户数据改变时,由于数据量过大,导致操作量过大(
每个用户数据改变时,都需要登录客户端执行sql语句)
而且sql语句需要手写
所以说无法保证效率性和正确性

解决方案(jdbc):用户数据改变时,让程序去执行对应的sql语句
而不需要手敲

b.jdbc(java连接数据库),本质是把java当成客户端,
然后使用java语言连接数据库完成crdu操作
jdbc核心思想
实现java提供的(访问多种关系型数据库)接口,加载数据库厂商提供的驱动
从而实现对数据库的访问与操作并接受数据库返回的结果集或受影响行数


mysql数据库驱动:
mysql-connector-java-5.1.x
。。。。。。。。。。。8.0.x

JDBC有多个接口和类进行功能实现
class         java.sql.DriverManager
数据库的驱动由DriverManager管理,获得数据库连接也需要DriverManager
interface  java.sql.Connection
Connection代表一个数据库连接(当connection的值不为null时,表示已连接数据库)
interface java.sql.Statement
Statement发送sql语句到数据库并执行
interface java.sql.Resultset
ResultSet保存sql语句的结果(查询返回结果集,增删查返回受影响行数)
class java.sql.SQLException  处理数据库应用程序时所发生的异常


c,环境搭建
在项目下新建一个dictory类型的lib,存放jar包
将mysql数据库驱动mysql-connector-java-5.1.复制到lib里
选中lib右键add as library 然后level里选project library
此时mysql-connector-java就可以打开了(jar文件与项目产生了关系)

1.注册驱动
class.forName();触发类加载
class.forName("com.mysql.jdbc.Driver")
把com.mysql.jdbc下的Driver类加载到JVM虚拟机里

2.连接数据库
通过DriverManager.getConnection(url,user,password)获取数据连接对象
URL:jdbc:mysql://localhost:3306/database
url路径,统一资源定位符(协议,ip,端口,程序实例名称uid组成)
jdbc:mysql:// 通过jdbc连接的数据库是mysql
localhost回环地址代表本机
:3306 代表mysql的端口号
/database数据库的名称
注意getConnection(String url,String user,String password)
的返回值为Connection类型
当connection不为空时表示已连接到数据库

3.获取发送sql的对象
通过Connection对象的createStatement()方法获得Statement对象
它是可以执行sql语句的对象

4.执行sql语句
String sql="";
int result=statement.executeUpdate(sql)执行sql语句并接受结果
(增删改)DML语句中,返回的是受影响行数(int)executeUpdate()
(查)DQL语句中,返回结果数据(ResultSet结果集)executeQuery()

5.处理结果(提醒用户是否执行成功)
受影响行数:逻辑判断,方法返回
查询结果集:迭代,依此获取


6.释放资源(先开后关)
statement.close();
coon.close();

d.遍历ResultSet中的数据
ResultSet以表结构进行临时结果的存储,通过JDBC API将其中数据进行依次获取
数据行指针:
初始位置在第一行数据前,每调用一次 boolean next()方法ResultSet指针向下移动
结果为true,表示当前行有数据

rs.getXxx(整数)根据列的编号顺序获得,从1开始Index
rs.getXxx(“列名”)根据列名获得  label


登录验证中
where username='aa' 此时aa为值
若将变量转化为参数则需要字符串拼接 
where username='  “ + aa+”   '
两个参数之间用and连接

e,sql注入:
用户输入的数据中有sql关键字或语法参与了sql的编译,
导致sql语句编译后的条件为true
原来:select*from users where uname='hfy'and uid='1'
sql注入:(先拼接再编译)
select *from users where uname='   ze' or 1=1;#and uid='2'
解决:先编译再拼接
即sql语句在用户输入数据之前完成编译,再进行数据填充

预编译sql语句PreparedStatement继承自Statement接口,
因此也继承了statement执行sql的方法
select *from users where uid=?and uname=?
JDBC中的所有参数由?符号占位,称为参数标记
在执行sql语句前,必须为每个参数提供值
后期动态绑定通过PreparedStatement的对象的setXxx(下标,值)为?占位符赋值
注意参数下标从1开始


f.封装工具类
定义:将固定的共性代码进行封装
加载驱动
获得连接对象
返回连接对象
释放资源

由于每一个操作中的
执行sql的对象,动态参数,执行的sql语句及处理的结果不同
所以他们不可以放在共性代码里

重用性方案:利用工具类将共性代码封装
跨平台方案:用户可以通过修改db.properties来适应不同的驱动及数据库

g.
ORM;对象关系映射
之前对结果集进行遍历时,都是逐行遍历,取出来的都是零散的数据
但实际开发中需要将零散数据进行封装处理
之前用变量名接受,打印,进行第二次循环时就做了覆盖(新的变量)
为了解决这种问题:
若想把数据库里查到的结果集保存下来,就需要实体类的帮助
作用:以前存的数据是零散的(局部的),现在把它变成了一个对象
每次循环查到多个的情况下把它存到了集合里


实体类entity:零散数据的载体
作用:将一行多个零散的数据进行整理
通过实体类的规则对表中的数据进行对象的封装
规则:表名=类名 列名=属性名,提供各个属性的get,set方法
提供有参和无参构造

f.
DAO数据访问对象(只负责数据库访问)
实现了业务逻辑与数据库访问相分离
作用:
对一张表的所有操作封装在XxxDaoImpl对象中
根据增删查改的不同功能实现具体的方法(insert,update,delete,select,selectAll)

DAO流程:
Test<>XxxDaoImpl<>DB
之前是拿到结果再遍历或判断受影响行数
现在XxxDaoImpl把结果返回给调用者,让它去遍历,判断或提示

什么是业务逻辑
数据库访问的操作是
获得connection连接,获得preparedStatement对象,执行sql语句并接受结果,处理结果
而业务逻辑代码是除此之外的比如输入用户名和密码

g.
Date工具类

sql.Date是util.date的子类 
所以可以(父类引用指向子类对象)
java.util.Date date=resultSet.getDate(columnLabel:"date");
数据库存储的日期为java.sql.Date
只能通过毫秒值创建对象(1970年至今的毫秒值)
可以通过jdbc插入到数据库

java应用层存储的日期为java.util.Date,
可以通过字符串创建对应的日期对象,无法通过jdbc插入到数据库
因此java应用程序插入带有日期的数据到数据库时,需要进行转化

simpleDateFormat格式化和解析日期的具体类
格式化:日期-字符串
解析:字符串-日期,也可以规范化


h.
Service业务逻辑层:
什么是业务?
用户完成的业务功能,由一个或多个DAO的调用组成
软件所提供的一个功能叫业务

service开发流程
Dao写完写到service
在service里明确功能由几个Dao的调用来完成的
在客户端的测试类里调用service完成一次功能的调用和实现

threadLocal实现原理

由于connection连接对象是在数据访问时使用,
而Service是业务,不应该出现connection对象
业务层不能对数据访问层的对象,数据库连接对象做操作,获取,关闭。

事务的封装:将事务的开启,提交,回滚封装在工具类中,业务层调用即可
 * Service:开启事务,调用Dao,处理数据,提交或回滚

Druid连接池(数据库的池子):重复利用,节省资源
F:\maven_repository\maven_repository\com\alibaba\druid\1.1.6
步骤:
创建database.properties配置文件,
导入druid-1.1.6jar文件








  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值