JDBC基础以及抽取工具类
JDBC:Java DataBase ConnectivityJava 数据库连接, Java语言操作数据库快速入门1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下2.右键-->Add As Library2. ...
·
JDBC:
Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
快速入门
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
* 代码实现:
//1. 导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
DriverManager:驱动管理对象
* 功能:
1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
写代码使用: Class.forName("com.mysql.jdbc.Driver");
2.获取数据库连接:
* 方法:static Connection getConnection(String url, String user, String password)
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
* 例子:jdbc:mysql://localhost:3306/db3
* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为: jdbc:mysql:///数据库名称
Connection:数据库连接对象
1. 获取执行sql 的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. 管理事务:
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()
Statement:执行sql的对象
执行sql
1. boolean execute(String sql) :可以执行任意的sql 了解
2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
3. ResultSet executeQuery(String sql) :执行DQL(select)语句
ResultSet:结果集对象,封装查询结果
* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
* getXxx(参数):获取数据
* Xxx:代表数据类型 如: int getInt() , String getString()
* 参数:
1. int:代表列的编号,从1开始 如: getString(1)
2. String:代表列名称。 如: getDouble("balance")
* 注意:
* 使用步骤:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
//循环判断游标是否是最后一行末尾。
while(rs.next()){
//获取数据
//6.2 获取数据
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3);
System.out.println(id + "---" + name + "---" + balance);
}
PreparedStatement:执行sql的对象
执行sql的对象
1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1. 输入用户随便,输入密码:a' or 'a' = 'a
2. sql:select * from user where username = 'fhdsjkf' 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语句的对象 PreparedStatement Connection.prepareStatement(String sql)
6. 给?赋值:
SetString/SetInt/SetDouble(参数1,参数2)
* 方法: setXxx(参数1,参数2)
* 参数1:?的位置编号 从1 开始
* 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
1. 可以防止SQL注入
2. 效率更高
案例
见例:E:\idea_Projects\javaSE_web\day01\src\Demo03
public static Boolean login(String username, String password) {
if (username == null || password == null) {
return false;
}
Connection conn = null;
PreparedStatement pstate = null;
ResultSet rs =null;
try {
conn = JDBCUtils.getConnection();
//定义sql语句
String sql = "select * from user where username = ? and password = ?";
//获取执行sql的对象
pstate = conn.prepareStatement(sql);
//给 ? 赋值
pstate.setString(1,username);
pstate.setString(2,password);
rs = pstate.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(rs,conn,pstate);
}
return false;
}
抽取JDBC工具类 : JDBCUtils
* 解决:配置文件
jdbc.properties
url=
user=
password=
jdbc工具类
见例:E:\idea_Projects\javaSE_web\day01\src\utils
package utils;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
//标准格式
//jdbc工具类
public class ju {
private static String url;
private static String username;
private static String password;
private static String driver;
//读取配置文件
static {
try {
Properties prop = new Properties();
prop.load(ju.class.getClassLoader().getResourceAsStream("jdbc.properties"));
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
driver = prop.getProperty("driver");
//注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取Connection连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
//释放资源
public static void close(ResultSet resultSet,
Connection connection,
Statement statement) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(connection, statement);
}
//重载
public static void close(Connection connection,
Statement statement) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
数据库连接池
1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
2. 好处:
1. 节约资源
2. 用户访问高效
C3P0:数据库连接池技术
* ##### 步骤:
1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
不要忘记导入数据库驱动jar包
2. 定义配置文件:
名称: c3p0.properties 或者 c3p0-config.xml
路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接: getConnection
public class c3p0Demo01 {
public static void main(String[] args) throws SQLException {
//创建数据库连接
DataSource ds = new ComboPooledDataSource();
//获取连接对象
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
Druid:数据库连接池实现技术
- 导入jar包 druid-1.0.9.jar
- 定义配置文件:
是properties形式的
可以叫任意名称,可以放在任意目录下
- 加载配置文件。Properties
- 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
- 获取连接:getConnection
public class druidDemo {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
//加载配置文件
pro.load(druidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
Druid:数据库连接池 抽取Utils工具类
-
定义一个类 JDBCUtils
-
提供静态代码块加载配置文件,初始化连接池对象
-
提供方法
-
获取连接方法:通过数据库连接池获取连接
-
释放资源
-
获取连接池的方法
见E:\idea_Projects\javaSE_web\day05_dataSource_jdbcTemplate\src\cn\itcast\datascoure\utils
public class JDBCUtils { private static DataSource dataSource; static { try { Properties properties = new Properties(); properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //获取Connection连接的方法 public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } //关闭资源方法 public static void close(Connection connection, Statement statement) { if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } } //关闭方法(ResultSet)重载 public static void close(ResultSet resultSet, Connection connection, Statement statement) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } close(connection, statement); } //获取连接池对象 public static DataSource getDataSource() { return dataSource; } }
Spring JDBC
步骤
* 步骤:
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);
3. 调用JdbcTemplate的方法来完成CRUD的操作
5个方法
update
* update():执行DML语句。增、删、改语句
例:
String updatesql="update account set banalan = ? where id =?"
//参数1:要执行的SQL语句
//参数2:是一个可变参数,参数的位置和?的位置一一对应,并数据类型也对相应
template.update(updatesql,5000,3);
update方法执行DML语句,返回值时int
使用jdbcTemplate无需手动释放资源,jdbcTemplate帮我们进行资源释放
例:
public class jdbcTemplateDemo01 {
public static void main(String[] args) {
//导包
//创建jdbcTemplate对象
JdbcTemplate template= new JdbcTemplate(JDBCUtils.getDataSource());
//调用方法
String updateSql = "update emp set salary = ? where id = ?";
int update = template.update(updateSql, 555,1001);
System.out.println(update);
}
}
queryForMap
* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
* 注意:这个方法查询的结果集长度只能是1
例:
public void test4() {
//定义查询语句
String sql = "select * from emp where id = ?";
Map<String, Object> queryForMap = template.queryForMap(sql, 1001);
System.out.println(queryForMap);
}
queryForList
* queryForList():查询结果将结果集封装为list集合
* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
例:
public void test5() {
String sql = "select * from emp";
List<Map<String, Object>> queryForList = template.queryForList(sql);
for (Map<String, Object> map : queryForList) {
System.out.println(map);
}
}
重点 | |
---|---|
queryForMap | 一次只能查询一条数据,将这一条数据封装到Map中 |
queryForList | 能够查询到多条数据,将多条数据每一条都封装为一个Map,然后将这个Map封装到List集合中 |
query
* query():查询结果,将结果封装为JavaBean对象
* query(参数1,参数2):
参数1:要执行的SQL语句
参数2:RowMapper
使用匿名内部类实现
ResultSet转换为我们需要的JavaBean
* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
* new BeanPropertyRowMapper<类型>(类型.class)
例:
public void test6() {
String sql = "select * from account";
List<Emp> empList = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
for (Emp emp : empList) {
System.out.println(emp);
}
}
queryForObject
* queryForObject:查询结果,将结果封装为对象
* 一般用于聚合函数的查询
例:
public void test7() {
String sql = "select count(id) from emp";
Integer i = template.queryForObject(sql, Integer.class);
System.out.println(i);
}
更多推荐
已为社区贡献1条内容
所有评论(0)