JDBC入门到放弃
来源:互联网 发布:熟悉办公软件 编辑:程序博客网 时间:2024/06/05 08:20
JDBC简单列子
//导入驱动类库 //注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //连接数据库 String user="root"; String password="mysql520"; Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", user, password);//test为数据库名称 //操作数据库 Statement st = conn.createStatement(); String sql="insert into student values(null,'guomei',22)"; st.execute(sql);//st.executeUpdate(sql); //关闭资源 st.close(); conn.close();
注意:增删改使用st.executeUpdate或者st.execute(增删改查都可以,返回值 true=> 查询有结果集,false=> 查询没有结果集),现在查询需要使用st.executeQuery
// 操作数据库 Statement st = conn.createStatement(); String sql="select * from student"; ResultSet resultSet = st.executeQuery(sql); while (resultSet.next()) { String name = resultSet.getString("name"); int age = resultSet.getInt("age"); int id = resultSet.getInt("id"); System.out.println("id:"+id+"======="+"name:"+name+"====="+age); }
DriverManager细节
// 1.注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());//jar包里面就是使用这种方法来注册的,所以推荐使用反射方法 System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver");// 推荐方式
Uri地址
//url完整 格式: 大协议:子协议://IP地址:端口号/库名?参数键=参数值
//完整:jdbc:mysql://127.0.0.1:3306/day05?useUnicode=true&characterEncoding=utf8
//简单:jdbc:mysql:///day05?useUnicode=true&characterEncoding=utf8,如果是连接本地localhost:3306的话,可以忽略
一般建议写完整的以及不需要写参数键=参数值
Conection细节
功能:
1.代表数据库的链接
2.可以根据该对象创建运送sql语句的Statement对象
方法:
****Statement createStatement() 创建statement对象
CallableStatement prepareCall(String sql) 调用数据库的存储过程(存储过程没学)
****PreparedStatement prepareStatement(String sql) 创建 PreparedStatement 对象(下面会介绍)
Statement 对象
该对象可以理解为一个 向数据库运送sql语句的 "小车";
方法:
[1] void addBatch(String sql) 向车上添加语句. (用于批量执行sql语句);
[2] insert update delete int[] executeBatch() 将车上的语句 运送给数据库执行. 返回值存放每个语句执行后影响的行数. 因为是多个语句,所以用数组装.
[3] void clearBatch() 清除车上的语句.
—-以上3个方法是批量执行sql相关的(下午最后一节课演示)———————-
[4] boolean execute(String sql) 执行一个sql语句. 如果该语句返回结果集 返回值为true(select). 如果该语句不返回结果集 返回false(insert update delete);
[5] ResultSet executeQuery(String sql) 执行一个有结果集的查询. 会将结果集包装到resultset对象中.(select)
[6] int executeUpdate(String sql) 执行一个没有结果集的语句. 会将语句影响的行数返回.(insert update delete)
结论:
执行查询语句时使用: executeQuery方法
执行增删改等语句时使用: executeUpdate方法
ResultSet对象
功能:
当执行的语句是查询语句时, resultSet对象用于封装查询结果.
方法:
[1] boolean next() 该方法让结果集中的指针(游标)往下移动一行.并且判断改行是否有数据。 有返回true,没有返回false
[2] String getString(int cloumnCount) 从当前指向的行中获得String 类型的数据. 根据列所在的索引位置取.
[3] String getString(String columnName) 从当前指向的行中获得String 类型的数据. 根据列名取.
[4] getXXX系列方法 有很多种, 没对针对的都是数据库中的不同类型.
JDBCUtils工具类
import java.io.FileInputStream;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class JDBCUtils { private static String driver; private static String url; private static String user; private static String password; static{ try { //0读取配置文件 Properties prop = new Properties(); InputStream is = new FileInputStream("src/db.properties");//把容易修改的内容放到db.properties中 prop.load(is); is.close(); driver = prop.getProperty("driver"); url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); //1 注册驱动 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } } //1 获得连接 public static Connection getConnection(){ Connection conn = null; try { //2 获得连接 conn = DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("创建连接失败!"); } return conn; } //2 释放资源 //1> 参数可能为空 //2> 调用close方法要抛出异常,确保即使出现异常也能继续关闭 //3>关闭顺序,需要从小到大 public static void close(Connection conn , Statement st , ResultSet rs){ try { if(rs!=null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(st!=null){ st.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(conn!=null){ conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }/* public static void main(String[] args) { System.out.println(getConnection()); }*/}
db.properties文件
driver=com.mysql.jdbc.Driver;url=jdbc:mysql://localhost:3306/test;user=root;password=mysql520;
SQL小细节:
拼装SQL语句
//拼装sql语句 String sql = "SELECT * FROM student WHERE NAME='"+name+"' AND PASSWORD='"+password+"';";
解决SQL注入问题
//演示使用PrepareStatement对象,解决sql注入问题 public void fun2() throws Exception{ String name ="xxx' OR 1=1 -- "; String password ="1234"; //1 获得连接 Connection conn= JDBCUtils.getConnection(); //2 拼装sql语句 String sql = "SELECT * FROM student WHERE NAME=? AND PASSWORD=?"; //3 获得PrepareStatement PreparedStatement ps = conn.prepareStatement(sql); //4 设置参数到ps对象中 ps.setString(1, name); ps.setString(2, password); //5 运送参数,执行sql并拿到结果 ResultSet rs = ps.executeQuery(); //5 根据结果判断是否登录成功 if(rs.next()){ System.out.println("登录成功!"); }else{ System.out.println("登录失败!"); } //6关闭资源 JDBCUtils.close(conn, ps, rs); }
利用JDBC向数据库存储大文本
//存储大文本必须使用PrepareStatement对象 public void fun1() throws Exception{ //1 获得连接 Connection conn = JDBCUtils.getConnection(); //2 书写sql String sql = "insert into mytext values(null,?)"; //3 创建PrepareStatement PreparedStatement ps = conn.prepareStatement(sql); //4 设置参数 //参数1:参数的索引 //参数2:需要保存的文本的流 //参数3:文件长度 File file = new File("src/text.txt"); FileReader reader = new FileReader(file); ps.setCharacterStream(1, reader, (int)file.length()); //5 执行sql int result = ps.executeUpdate(); System.out.println(result); //6关闭资源 JDBCUtils.close(conn, ps, null); }
数据库的表需要有一列为text(列名字) text(列类型)
create table mytext( id int primary key AUTO_INCREMENT, text text )
利用JDBC向数据库存储图片
//演示向mysql中存放图片 //存储图片必须使用PrepareStatement对象 public void fun1() throws Exception{ //1 获得连接 Connection conn = JDBCUtils.getConnection(); //2 书写sql String sql = "insert into myblob values(null,?)"; //3 创建PrepareStatement PreparedStatement ps = conn.prepareStatement(sql); //4 设置参数 //参数1:参数的索引 //参数2:需要保存的图片的流 //参数3:图片文件长度 File f = new File("src/wg.PNG"); InputStream is = new FileInputStream(f); ps.setBinaryStream(1, is, (int)f.length()); //5 执行sql int result = ps.executeUpdate(); System.out.println(result); //6关闭资源 JDBCUtils.close(conn, ps, null); }
图片一般定义为file类型
create table myblob( id int primary key AUTO_INCREMENT, file blob )
批量执行SQL:
//1 使用Statement对象批量执行sql public void fun1() throws Exception{ //1 获得连接 Connection conn = JDBCUtils.getConnection(); //2 获得Statement Statement st = conn.createStatement(); //3 添加多条sql语句到st中 st.addBatch("create table t_stu ( id int primary key auto_increment , name varchar(20) )"); st.addBatch("insert into t_stu values(null,'tom')"); st.addBatch("insert into t_stu values(null,'jerry')"); st.addBatch("insert into t_stu values(null,'jack')"); st.addBatch("insert into t_stu values(null,'rose')"); //4 执行sql int[] results = st.executeBatch(); System.out.println(Arrays.toString(results)); //5关闭资源 JDBCUtils.close(conn, st, null); } //2 使用PrepareStatement对象批量执行sql public void fun2() throws Exception{ //1 获得连接 Connection conn = JDBCUtils.getConnection(); //2 书写sql语句 String sql = "insert into t_stu values(null,?)"; //3 创建PrepareStatement PreparedStatement ps = conn.prepareStatement(sql); //4 循环.添加参数 for(int i=0;i<100;i++){ ps.setString(1, "用户"+i); ps.addBatch(); } //5 批量执行 int[] results =ps.executeBatch(); System.out.println(Arrays.toString(results)); //5关闭资源 JDBCUtils.close(conn, ps, null); }
- JDBC入门到放弃
- Elasticsearh 入门到放弃
- Freemarker 从入门到放弃
- AWS Lambda 入门到放弃
- kmp从入门到放弃
- Dagger2从入门到放弃
- php入门到放弃 . Day1
- 推送 从入门到放弃
- 推送 从入门到放弃
- Python从入门到放弃
- vim从入门到放弃
- JAVA 从入门到放弃?
- markdown从入门到放弃
- Mycat从入门到放弃
- C++从入门到放弃
- Volatile从入门到放弃
- Eslint 从入门到放弃
- php入门到放弃-语法
- 黄旗山
- 回调机制的一些理解
- STM32F030用IAR+JLINK在线调试无法下载FLASH问题
- Spring Web MVC框架(八) 配置Spring Web MVC
- PAT BASIC 1017 A除以B
- JDBC入门到放弃
- [经济]股票的基本知识和部分专业术语的解释
- 判断apk的安装
- cookie sessionStorage localStorage
- 40.android广播-手机非法软件
- ioctl方法
- 小总结
- Lock和Condition实现线程同步通信
- WinDBG 资料汇总