JDBC学习笔记
一、概念
JDBC ------JAVA数据库连接,JAVA语言操作数据库
JDBC:定义了一套操作所以关系型数据库的规矩(接口)
JDBC的本质:其实是官方(sun公司)定义的一套操作所以关系型数据库的规则,即接口。各个数据 库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的 代码是驱动jar包中的实现类
二、快速入门
1、导入驱动jar包
三、详解各个对象
1、DriverManager:驱动管理对象
方法:static Connention getConnection(String url,String user,String password)
参数:
url:指定的连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
例子:jdbc:mysql://localhost:3306/student
细节:如果连接的本机是mysql服务器,并且mysql服务器默认端口是3306,
则url可以简写为:jdbc:mysql:///数据库名称
user:用户名
password:密码
2、Connection:数据库连接对象
1/功能:
获取执行sql的对象
*Statement createStatement()
*PreparedStatement prepareStatement(String sql)
2/管理事务:
*开始事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
*提交事务:commit()
*回滚事务:rollback()
3、Statement:执行sql的对象
1/执行sql
1.boolea execute(String sql):可以执行任意的sql(了解)
2.int executeUpdate(String sql):执行DML(insert、update、delete)语句、DLL(create、alter、drop)语句
*返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之则失败
3.ResultSet executeQuery(String sql):执行DQL(select)语句
2/练习
1.s_stu表 添加一条记录
2.s_stu表 修改一条记录
3.S_stu表 删除一条记录
4、Resultset:结果集对象,封装查询对象
*next():游标向下移动一行
*Boolean next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是返回false,如果不是返回true
*getXXX(参数):获取数据
1.XXX:代表数据类型 如: int getInt() String getString()
2.参数:
1/int:代表列的编号,从1开始的 如:getstring(1) 1代表第一列
2/String:代表列的名称 如:getDouble("age") age代表列的名称
!!!注意:
使用步骤:
1。游标向下移动一行
2。判断是否有数据
3。获取数据
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString("name");
double age = rs.getDouble(3);
System.out.println(id+"-------"+name+"--------"+age);
}
*练习:
定义一个方法:查询emp表的数据将其封装为对象,然后装载集合,返回,然后打印
1.定义emp类
2.定义方法 public List<emp> findAll(){}
3.实现方法 select * from emp;
5、preparedStatement:执行sql的对象
1\SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1、输入用户随便,输入密码:a' or 'a' = 'a
2、sql:select * from user where username = '随便写' and password ='a' or 'a' ='a'
2\解决sql注入问题:使用preparedStatement对象来解决
3\预编译的sql:参数使用?作为占位符
4\步骤:
1、导入驱动jar包,mysql-connector-java-5.1.37-bin.jar
2、注册驱动
3、获取数据库连接对象 Connection
4、定义sql
*注意:sql的参数使用?作为占位符。如:
select * from user where username =? and password =?;
5、获取执行sql语句的对象 perparedStatement
Connection.prepareStatement(String sql)
6、给?赋值:
方法:setXxx(参数1,参数2)
参数1:?的位置编号 从1开始
参数2:?的值
7、执行sql,接受返回结果,不需要传递sql语句
8、处理结果
9、释放资源
5\后期都会用preparedStatement来完成增删改查的所有操作
1、可以防止sql注入
2、效率更高</emp>
抽取JDBC工具类
目的:简化书写
分析:
1/注册驱动也抽取
2/抽取一个方法获取连接对象
*需求:不想传递参数(麻烦),还要保证工具类的通用性
*解决方案:配置文件
jdbc.properties
url=
user=
password=
3/抽取一个方法释放资源
四、练习训练
需求:
1、通过键盘录入用户名和密码
2、判断用户是否登录成功
select * from user where username = "" and password ="";
如果这个sql有查询结果则成功,否则失败
*步骤:
1创建数据库表 user
create table user(
id int primary key auto_increment,
username varchar(32),
password varchar(32)
);
insert into user values(null,'zhangsan','123');
isnert into user valuse(null,'lisi','234');
五、JDBC控制事务
1\事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
2\操作:
1、开启事务
2、提交事务
3、回滚事务
3\使用Connection对象来管理事务
*开启事务:setAutoCommit(bolean autoCommit):调用该方法设置参数为false,即开启事务
*提交事务:commit()
*当所有sql都执行完提交事务
*回滚事务:rollback()
*在catch中回滚事务
六、数据库连接池
1\概念:其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还容器
2\使用JDBC连接池的好处:
1、节约资源
2、用户访问高效
3\实现L:
1、标准接口:DataSource javax.sql包下的
1.方法:
*获取连接:getConnection()
*归还连接:Connection.close()如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
2、一般我们不去实现它,有数据库厂商来实现
1.C3P0:数据库连接池技术
2.Druid:数据库连接池实现技术,由阿里巴巴提供
4\C3P0学习:数据库连接池技术
步骤:
1、导入jar包(两个)
c3p0-xx.jar
mchange-commons-java-xx.jar
*不要忘记导入数据库驱动jar包
2、定义配置文件:
名称:c3p0.properties 或者 c3p0-config.xml
路径:直接将文件放在src目录下即可。
3、创建核心对象 数据库连接对象 CombopooledDataSource
4、获取连接:getConnection
5\Druid学习:数据库连接池技术
1步骤:
1、导入jar包
druid-xx.jar
2、定义配置文件:
1.是properties形式
2.可以叫任意名称,可以放在任意目录下
3、加载配置文件:
*是properties形式的
*可以叫任何名称,可以放在任意目录下
4、获取数据库连接池对象:
通过一个工厂类来获取 DruidDataSourceFactoru
5、获取连接:getConnection
2定义工具类
1、定义一个类 JDBCUtils
2、定义静态代码块加载配置文件,初始化连接池对象
3、提供方法
1\获取连接方法:通过数据库连接池获取连接
2\释放资源
3\获取连接池的方法
七、Spring JDBC:JDBC Template
*Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
*步骤:
1、导入jar包
2、创建JdbcTemplate对象。依赖于数据源Datasource
*JdbcTemplate template = new JdbcTemplate(ds);
3、调用JdbcTemlate的方法来完成CRUD的操作
*update():执行DML语句。增、删、改语句
*queryForMap():查询结果将结果集封装为map集合
*注意:这个方法查询的结果集长度只能是1
*queryForList():查询结果将结果集封装为list集合
*注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合 中
*query():查询结果,将结果封装为JavaBean对象
*query的参数:RowMapper
*一般我们使用BeampropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
*new BeanPropertyRowMapper<类型>(Emp,class)
*queryForObject:查询结果,将结果封装为对象
*一般用于聚合函数的查询
4、练习
*需求:
1、修改1号数据的salary为10000
2、添加一条记录
3、删除刚才添加的记录
4、查询id为1的记录,将其封装为Map集合
5、查询所有记录,将其封装为List
6、查询所有记录,将其封装为Emp对象的List集合
7、查询总记录数