第二章 获取数据库连接 一.Driver接口实现类 1.Driver接口概述补充:ODBC(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的。使用者在程序中只需要调用ODBC API,由 ODBC 驱动程序将调用转换成为对特定的数据库的调用请求。
ava.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
- 方式一
@Test
public void testConnection1() throws SQLException {
Driver driver = new com.mysql.jdbc.Driver();
//url:http:localhost:8080/gmall/keyboard.hpg
//jdbc:mysql:协议
//localhost:ip协议
//3306:默认mysql的端口号
//test:test数据库
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8";
//?characterEncoding=utf8:设置字符格式
//封装用户名和密码
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
Connection conn = driver.connect(url,info);
System.out.println(conn);
}
- 方式二:使用反射
@Test
public void testConnection2() throws Exception{
//使用反射
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)clazz.newInstance();
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
Connection conn = driver.connect(url,info);
System.out.println(conn);
}
- 方式三:使用DriverManager替换Driver
@Test
public void testConnection3() throws Exception{
//1.获取Driver实现类的对象
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)clazz.newInstance();
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8";
String user = "root";
String password = "123456";
//2.注册驱动
DriverManager.registerDriver(driver);
//3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
- 方式四:
@Test
public void testConnection4() throws Exception{
//1.提供基本信息
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8";
String user = "root";
String password = "123456";
//2.加载Driver
//连接MySQL数据库时 加载Driver这句代码也可以省略
Class.forName("com.mysql.jdbc.Driver");
//3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
- 方式五:将数据库连接需要的信息放在配置文件中,获取连接
配置文件放在src目录下
@Test
public void testConnection5() throws Exception{
//1.读取配置文件的信息
InputStream rs = Connection.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(rs);
String user = pro.getProperty("user");
String url = pro.getProperty("url");
String password = pro.getProperty("password");
String driverClass = pro.getProperty("driverClass");
//2.加载Driver
Class.forName(driverClass);
//3.连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
第三章:使用PreparedStatement实现CRUD操作
一.操作和访问数据库
数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。其实一个数据库连接就是一个Socket连接。
在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:
- Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
- PrepatedStatement:SQL 语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句。
- CallableStatement:用于执行 SQL 存储过程
- 问题一:存在拼串操作,繁琐
- 问题二:存在SQL注入问题
如:SELECt user, password FROM user_table WHERe user=‘a’ OR 1 = ’ AND password = ’ OR ‘1’ = ‘1’
增:
@Test
public void testInsert() throws Exception{
//连接数据库
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
//预编译sql语句,返回PreparedStatement的实例
String sql = "insert into customers(name,email,birth)values(?,?,?)";
PreparedStatement pre = conn.prepareStatement(sql);
pre.setString(1,"哪吒");
pre.setString(2,"nazha@163.com");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date parse = simpleDateFormat.parse("2000-10-08");
pre.setDate(3,new Date(parse.getTime()));
//执行操作
pre.execute();
//关闭资源
pre.close();
conn.close();
}
通用增删改
连接数据库关闭资源封装在JDBCutils.java内
public class JDBCutils {
public static Connection getConnection() throws Exception{
//连接数据库
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
return conn;
}
public static void closeResource(Connection con,Statement pre){
try {
if(con != null)
con.close();
if(pre != null)
pre.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//通用增删改
public void Update(String sql,Object ...args){
Connection conn = null;
PreparedStatement pre = null;
try{
//连接数据库
conn = JDBCutils.getConnection();
pre = conn.prepareStatement(sql);
//填充占位符
for(int i = 0;i < args.length;i++){
pre.setObject(i+1,args[i]);
}
//执行操作
pre.execute();
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭资源
JDBCutils.closeResource(conn,pre);
}
}
测试:
public void UpdateTest(){
String sql = "update customers set name = ? where id = ?";
Update(sql,"Crown","19");
}
2.查询
@Test
public void testQuery1() throws Exception{
Connection conn = JDBCutils.getConnection();
String sql = "select name,email,birth from customers where id = ?";
PreparedStatement pre = conn.prepareStatement(sql);
pre.setObject(1,1);
//返回结果
ResultSet resultSet = pre.executeQuery();
if(resultSet.next()){//判断是否有下一个并指针后移
String name = resultSet.getString(1);
String email = resultSet.getString(2);
Date birth = resultSet.getDate(3);
Customers customers = new Customers(name, email, birth);
System.out.println(customers);
}
}
ORM编程思想
一个数据表对应一个java类,表中的一条记录对应java类的一个对象,表中的一个字段对应java的一个属性。
Java与SQL对应数据类型转换表



