JDBC
- Java DataBase Connectivity :Java数据库连接
- 定义了操作所有关系型数据库的规则接口,由数据库厂商自己编写接口的实现类,即数据库驱动
使用步骤入门
-
导入驱动Jar包
- 复制数据库驱动Jar包到项目的lib目录下
- lib目录右键选择add as library
-
注册驱动
-
获取数据库连接对象 Connection
-
定义SQL
-
获取执行SQL语句的对象 Statement
-
执行SQL,接收返回结果
-
处理结果
-
释放资源
public static void main(String[] args) {
Statement stat = null;
Connection con = null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接对象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC","root","637625");
//定义SQL语句
String sql ="update user set username = '秀吉' where id=45";
//获取执行SQL的对象
stat = con.createStatement();
//执行SQL
int count = stat.executeUpdate(sql);
//处理结果
System.out.println(count);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
//释放资源
if(stat != null) {
try {
stat.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
JDBC对象详解
-
DriverManager:驱动管理对象
* 功能
-
注册驱动:
static void registerDriver(Driver driver);
Class.forName()
:加载指定类到JVM虚拟机,同时执行类中的静态代码块,com.mysql.jdbc.Driver
类中的静态代码块执行的即是registerDriver方法注册驱动MySQL5以后注册驱动已自带,可省略
-
获取数据库连接:
static connection getConnection(String url,String user,String password);
* url:数据库地址——jdbc:mysql://ip地址:端口号/数据库名
* user:用户名
* password:密码
-
-
Connection:数据库连接对象
* 功能
-
获取执行SQL的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
-
管理事务
* 开启事务:
void setAutoCommit(boolean autoCommit);
调用该方法设置参数为false,即开启事务
- 在执行SQL之前开启事务
* 提交事务:
commit()
- 在SQL执行完后提交事务
* 回滚事务:
rollback();
- 在出现任何异常时回滚,即在catch代码块中捕获异常的同时回滚事务
-
-
Statement:SQL执行对象(静态SQL对象)
* 功能
-
执行SQL:
*
boolean execute(String sql);
:可以执行任意的SQL语句(不常用)*
int executeUpdate(String sql);
:执行DML(增-insert、改-update、删-delete)语句、DDL(create:创建,alter:修改,drop:删除)语句(不常用)- int返回值:SQL语句影响的行数,返回值大于0代表执行成功,反之失败
*
ResultSet executeQuery(String sql);
:执行DQL(select)语句,返回结果集
-
-
ResultSet:结果集对象,封装查询结果
-
boolean next()方法:游标向下移动一行,返回一个布尔值,返回false时,代表光标在最后一行有效数据之后
-
getXxx(参数)方法:获取某一数据类型的数据,Xxx代表数据类型;
参数:int:代表列的编号,从1开始计算;如:getInt(1);
String:代表列的名称;如:getString(“name”);
rs= stm.executeQuery(sql);//执行DQL语句返回结果集 while(rs.next){//判断结果集光标是否在最后一行末尾 int id = rs.getInt(1);//以行号获取数据 String name = rs.getString("name");//以行名称获取数据 ...... }
-
-
PreparedStatement:SQL执行对象(预编译SQL对象)
-
SQL注入问题:在拼接sql语句时,若有一些sql的关键字参与字符串的拼接,可能会造成安全问题
-
为解决SQL注入问题,甲骨文提出PreparedStatement作为SQL执行对象,拼接SQL中参数以?作为占位符存在
-
使用步骤
-
注册驱动
-
获取数据库连接对象
-
定义SQL
select * from user where username = ? and password = ?;
SQL语句中参数以?作为占位符
-
获取执行sql语句的对象
PreparedStatement pstmt = Connection.prepareStatement(String sql);
-
给?赋值
使用setXxx方法(参数1,参数2)
-
参数1为?的编号,由1开始,参数2为对应参数的值
-
pstmt.setString(1,username);
-
-
执行SQL语句,接受返回结果,不需要传递SQL语句
rs = pstmt.executeQuery();
-
处理结果
-
释放资源
-
-
数据库连接池
存放数据库连接的集合容器
-
标准实现接口:DataSource
- 获取连接:getConnection();
- 归还连接:若数据库连接对象Connection由数据库连接池获取,则调用Connection.close()方法,则不会关闭连接而是归还连接到数据库连接池
-
数据库连接池实现
-
(需要先导入MySQL驱动Jar包)
-
C3P0:
-
导入C3P0及其依赖的两个Jar包
c3p0-"版本号".jar;mchange-commons-java-"版本号".jar
-
定义配置文件
名称:
c3p0.properties or c3p0-config.xml
路径:
src/
目录之下 -
创建数据库连接池对象:
ComboPooledDataSource
DataSource ds = new ComboPooledDataSource();
-
获取连接:
getConnection();
Connection conn = ds.getConnection();
-
-
Druid:
-
导入Jar包:
druid-"版本号".jar
-
定义配置文件:
druid.properties
配置文件名称任意,目录任意,需要手动指定加载
-
加载配置文件
若将配置文件按直接放在
src/
目录下,可使用getclassloader方法Properties pro = new Properties(); InputStream is = classname.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is);
-
通过工厂类获取数据库连接池对象:
DruidDataSourceFactory
DruidDataSourceFactor.createDataSource(pro)
-
获取连接:
getConnection()
Connection conn = ds.getConnection();
-
-
JDBC Template
-
Spring框架对JDBC的封装
-
使用步骤
-
导入Jar包(除自身的5个包外,还依赖于数据库连接池与Mysql的驱动包
-
创建依赖于数据源的JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(DataSource);
-
调用JdbcTemplate的方法来完成CRUD操作
* update():执行DML语句:增删改语句
template.update(sql,1,"例")
:sql为定义的SQL语句,1,"例"为sql语句中?占位符参数表示的值* query():查询结果,将结果封装为JavaBean对象,
- 手动实现
在query方法中可以匿名内部类的形式实现RowMapper接口,重写mapRow方法,将每一行数据的值分别赋值给JavaBean的属性
List<Emp> list = template.query(sql,new RowMapper<Emp>(){ @Override public Emp map mapRow(ResultSet rs,int i) throws SQLException{ Emp emp = new Emp();//创建emp对象 int id = rs.getInt("id");//Result结果集每一条数据的属性取值 String name = rs.getString("name"); emp.setId(id);//对emp对象的各属性赋值 emp.setName(name); return emp;//返回一个emp对象 } });
- 自动实现
List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));//传入JavaBean的class属性,自动实现RowMapper接口
* queryForMap():查询结果,将结果封装为map集合,列名为Key,结果值为value,封装为一个map集合,结果集长度仅为1,
* queryForList():查询结果,将结果封装为List集合,将每一条记录封装为map集合,再将Map集合装载到List集合中
* queryForObject():查询结果,将结果封装为对象,一般用于聚合函数的查询
-