黑马程序员技术交流社区
标题:
【石家庄校区】JDBC 学习笔记
[打印本页]
作者:
cyahua
时间:
2018-5-21 14:52
标题:
【石家庄校区】JDBC 学习笔记
本帖最后由 cyahua 于 2018-5-21 14:54 编辑
JDBC 学习笔记
相关API
DiverManager
注册驱动
static void registerDriver(Diver driver):一般不使用
Class.forName("驱动全名"):一般使用这种方式(右键-Copy Qualified Name可以复制类全名)
在驱动类中存在一个静态代码块,在加载字节码文件时,会调用DriverManager的registerDriver()方法
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
获得连接
static Connection getConnection(String url, String user, String password)
url格式:数据库协议://IP地址:端口号/数据库(数据库可以不写);
例子:jdbc:mysql://localhost:3306/web_test3
Connection
创建执行SQL语句的对象
Statement createStatement():创建Statement对象,执行SQL语句
(存在SQL注入漏洞)
CallaleStatement prepareCall(String sql):创建CallableStatement对象调用数据库存储过程
PreparedStatement prepareStatement(String sql):创建PreparedStatement对象将参数化的SQL语句发送到数据库
(解决了SQL注入漏洞)
管理事务
void setAutoCommit(boolean autoCommit):将此链接的自动提交模式设置为给定状态
void commit:提交,并释放此Connection对象当前持有的所有数据库锁
void rollback():回滚,并释放此Connection对象当前持有的所有数据库锁
Statement
执行SQL语句
boolean execute(String sql)
esultSet executeQurey(String sql)
int excuteUpdate()
批处理
void addBatch(String sql)
void excuteBatch()
void clearBatch()
ResultSet
boolean next()用于遍历结果集
while(rs.next()){
rs.getXXX(column);
}
XXX getXXX(String column):获取相应记录的值
Object getObject(String column)
JDBC开发步骤
step1:注册驱动:Class.forName()
step2:获得连接:Connection conn = DriverManger.getConnection(url,username,password)
step3:编写SQL语句,String sql ="",值的地方用占位符?代替
step4:预编译sql并且获得可执行sql语句的对象PreparedStatement ps = conn.prepareStatemet(String sql)
step5:为sql语句设置值,用值代替sql语句中的? ps.setXXX(int n,值) n:代表第几个问号的意思,从1开始
step6:执行sql语句
如果是查询:ResutSet rs = ps.executeQuery();//获得结果集
如果是增删改:int num = ps.executeUpdate() ;// num 代表影响的行数
step7:释放资源
属性Properties
Properties对象的使用
Properties prop = new Properties();
prop.load(new FileInputeStream(String path或File对象));
prop.getProperty(String key);
注:
.properties文件的编码格式为ISO-8859-1,内容不能有中文;如果想把值设置成中文,需要写成\uXXXX形式
包含了程序
解耦和
的思想;
批处理
String sql = "insert into user values (null,?)";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
for(int i=1;i<=10000;i++){
pstmt.setString(1, "name"+i);
// 添加到批处理
pstmt.addBatch();//注意内存溢出
if(i % 1000 == 0){
// 执行批处理:
pstmt.executeBatch();
// 清空批处理:
pstmt.clearBatch();
}
}
事务
开启事务:setAutoCommit(false)
提交:commit()
回滚:rollback()
核心思想:事务管理要使用同一个connection对象
连接池
使用连接池的原因:提升性能,从内存中获取和归还的效率要远远高于创建和销毁的效率
增强类中方法的方式
java的23种设计模式
采用继承
最简单,但有使用条件:必须能控制这个类的构造
装饰者模式
动态代理
DBUtils
QueryRunner
构造方法:
QueryRunner()
QueryRunner(DataSource ds)
方法:
int update(String sql. Object...parsms)
int update(Connection conn, String sql, Object... params)
query(String sql, ResultSetHandler<T> rsh, Object... params)
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
工具类编写原则:把相同或相似的代码抽取出来
ResultHandler
ResultHandler实现类
ArrayHandler
ArrayListHandler
BeanHandler
BeanListHandler
如果表字段与实体类属性名称不同,可以利用别名
决定属性封装能否成功的是get和set方法的名称,而不是属性名称
实体类一定要有一个无参构造方法
MapHandler
MapListHandler
ColumnListHandler
SaclaHandler
select count(XXX) from table返回的是一个long值
keyedhandler
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2