一、JDBC:
1、概念:Java DataBase Connectivity --> Java数据库连接,Java语言操作数据库
本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
Person 接口 ,Worker 类 Person person = new Worker(); --> 父类引用指向子类对象,如果Person中有一个ear方法,则 person.eat() 会调用Worker里边真正的实现类的方法
2、快速入门:
步骤:
1.导入驱动jar包 :mysql-connector-java-5.1.37-bin.jar
(1)复制 mysql-connector-java-5.1.37-bin.jar 到项目的libs目录下
(2)右键 --> Add As Library 【真正加入jar包到项目中】
2.注册驱动
3.获取数据库的连接对象 Connection
4.定义sql语句
5.获取执行sql语句的对象 Statement
6.执行sql,接收返回结果
7.处理结果
8.释放资源
代码实现:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; //JDBC快速入门 public class JdbcDemo1 { public static void main(String[] args) throws Exception { //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 stmt = conn.createStatement(); //6、执行sql int count = stmt.executeUpdate(sql); //7、处理结果 System.out.println(count); //8、释放资源 stmt.close(); conn.close(); } }
3、详解各个对象:
1.DriverManager : 驱动管理对象
功能:
1.注册驱动 【告诉程序该使用哪个数据库驱动jar包】
注册与给定的驱动程序:
写代码使用:Class.forName("com.mysql.jdbc.Driver");
com --> mysql --> jdbc --> Driver.java
通过查看源码可以发现:在com.mysql.jdbc.Driver类中存在静态代码块
小细节:mysql-connection-java 5 版本之后的驱动jar包中可以不写注册驱动【META-INF --> services --> java.sql.Driver已注册驱动】
2.获取数据库连接
参数:
url:指定连接的路径(IP、端口、数据库的名称)
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
例子:jdbc:mysql://localhost:3306/db3
细节:如果连接的是本机的一个mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
2.Connection : 数据库连接对象
1.功能:
1.获取执行sql对象
Statement creatStatement()
PreparedStatement preparestatement(String sql)
2.管理事务:
开启事务:
调用该方法设置参数为false,即开启事务
提交事务:
回滚事务:
3.Statement : 执行sql的对象
1.执行sql
1、【了解】:boolean execute(String sql) : 可以执行任意的sql
2、int executeUpdate(String sql) : 执行DML(insert、update、delete),DDL(对表和库进行操作,不常用,库和表多已提前建好)
返回值:影响的行数;作用:我们可以通过影响的行数来判断DML语句是否执行成功【大于0成功,反之失败】
3、
执行DQL(select)语句,返回的是ResulSet结果集对象
2.练习:
1、account表 添加一条记录
2、account表 修改一条记录
3、account表 删除一条记录
4.ResultSet : 结果集对象
游标:相当于Java中数组的索引,默认指向表中第一行的第一列
boolean next() : 游标向下移动一行,判断当前行是否是最后一行的末尾(是否有数据),如果是返回false,反之返回true。
getXxx(参数) : 获取数据【可用于后期封装数据】
Xxx : 代表数据类型,如:int getInt(), String getString
参数:
1.int : 代表列的编号,从1开始, 如:getString(1),获取第一列的数据
2.String:代表列的名称,如 : getDouble("balance")
注意:
1.游标向下移动一行
2.判断是否有数据
3.获取数据
*练习:查询emp表的数据将其封装为 对象,然后装载集合,返回。
分析:
1.定义Emp类
2.定义一个方法 : public List<Emp> findAll(){ }
3.实现方法:select * from emp;
抽取JDBC工具类:JDBCUtils
目的:简化书写
分析:
1、注册驱动
2、抽取一个方法获取去连接对象
不想传递参数(麻烦),还得保证工具类的通用性
解决方法:配置文件
jdbc.properties
url =
user =
password =
3、抽取一个方法释放资源
代码实现:
import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.*; import java.util.Properties; //JDBC 工具类 public class JDBCUtils { private static String url; private static String user; private static String password; private static String driver; //配置文件只需要读取一次,写在静态代码块中,随着类的加载而加载,只会执行一次 static { try { //1、创建Properti对象 Properties pro = new Properties(); //2、加载文件 //pro.load(new FileReader("src/jdbc.properties")); //FileNotFoundException //pro.load(new FileReader("src/jdbc.properties")); //绝对路径 //获取src路径下的文件的方式 --> ClassLoader(类加载器,可以加载字节码进内存,还可以获取src下的资源文件路径) ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL resource = classLoader.getResource("jdbc.properties"); //统一资源定位符(定位文件绝对路径) String path =resource.getPath(); pro.load(new FileReader(path)); System.out.println(path); //打印的就是该文件的绝对路径 //3、获取文件中的值 url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); driver = pro.getProperty("driver"); //4、注册驱动 try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } /** * 连接对象 * @return */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,user,password); } public static void close(Statement stmt,Connection conn){ if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs, Statement stmt, Connection conn){ if (rs != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
练习:
需求:通过键盘录入用户名和密码,判断用户是否登录成功
实现步骤:
1、创建数据库表
sql准备:
CREATE TABLE USER( id INT PRIMARY KEY auto_increment, username varchar(32), password varchar(32) ); SELECT * from USER; INSERT INTO USER VALUES(null,'zhangsan','123'),(null,'lisi','234');
5.PrepareStatement : 执行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语句的对象 PreparedStatement
Connection.prepareStatement(String sql)
给 ?赋值:
方法:setXxx(参数1,参数2)
参数1 : ?的位置,从1开始
参数2 :?的值
6.执行sql,接收返回结果,不需要传递sql语句了(上一步传递过了)
7.处理结果
8.释放资源
5.注意:后期都会使用PreparedStatement来完成增删改查的所有操作,原因:
1.可以防止SQL注入
2.效率更高
JDBC控制事务:
1.事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失效
2.操作:
1.开启事务
2.提交事务
3.回滚事务
3.使用Connection对象管理事务:
开启事务:setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false,即开启事务
在执行sql之前开启
提交事务:commit()
所有操作正常执行之后
回滚事务:rollback
catch中
标签:JDBC,java,String,--,sql,day04,jdbc,mysql From: https://www.cnblogs.com/yumengqifei/p/16736289.html