JDBC
来源:互联网 发布:简单软件编程教程 编辑:程序博客网 时间:2024/05/17 06:31
主要使用步骤
//注册驱动程序//连接数据库,返回连接对象//创建statement//准备sql//发送sql语句,执行sql语句,得到返回结果//输出//关闭
jdbc
是sun公司设计的一套通用的 java语言操作不同数据库的接口
驱动程序就是针对接口的实现
方式一:使用驱动管理器 Connection connection=null; Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","qqaazz");System.out.println(connection);方式二:接口的connectDriver driver=new com.mysql.jdbc.Driver(); String url="jdbc:mysql://localhost:3306/test"; String user="root"; String password="qqaazz"; Properties prop=new Properties(); prop.setProperty("user", user); prop.setProperty("password", password); Connection conn=driver.connect(url, prop); System.out.println(conn);
JDBC接口核心的API
java.sql.*和javax.sql.*
Driver接口:表示java驱动程序接口,所有的具体数据库厂商要来实现此接口。
connect:连接数据库的方法;
DriverManage类:驱动管理器类,用于管理所有注册的驱动程序;
registerDriver(driver):注册驱动类对象Conncetion getConnection(url,user,password):获取连接对象
Connection接口:表示java程序和数据库的连接对象
Statement createStatement():创建Statement对象PreparedStatement prepareStatement(String sql) 创建PreparedStatement对象 CallableStatement prepareCall(String sql) 创建CallableStatement对象
Statement接口:用于执行静态的sql语句
int executeUpdate(String sql):执行静态更新的sql语句(DDL,DML)
ResultSet executeQuery(String sql):执行静态查询sql语句(DQL)
PreparedStatement接口:用于执行预编译sql语句
ResultSet:
具有指向其当前数据行的光标。最初光标被置于第一行之前,next方法将光标移到到下一行;因为该方法在Resultset对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。
ResultSet接口用于从当前行中获取列值的获取方法(getBoolean,getLong等)。可以使用列索引较为高效,列从1开始编号,为了获得最大 的可移植性,应该按照从左到右顺序读取每行中的结果集列,每列只能读取一次。
预处理
Statement
int executeUpdate(String sql)ResultSet executeQuery(String sql)
PrepareStatement接口
int executeUpdate(String sql)ResultSet executeQuery(String sql)
PreparedStatement stmt=null;String sql="insert into student(NAME,gender) values(?,?)";stmt=conn.prepareStatement(sql);stmt.setString(1,"张三");//1代表参数的位置stmt.setstring(2,"男");
检查语法是否正确;
检查是否有足够的权限;
把sql加入到sql缓存区
Map<String,执行任务><"select * from student where id=1",执行任务>
数据库取出sql缓冲区的执行任务开始执行
PreparedStatement执行sql语句
PreparedStatement vs Statement
1.语法不同,PreparedStatement可以使用预编译的sql,而Statement只能使用静态的sql;
2.效率不同,PreparedStatement可以使用sql缓冲区,效率比Statement高
3.安全性不同,PreparedStatement可以有效防止sql注入,而Statement不能防止sql注入。
callableStatement
创建一个存储过程: DElimiter $ CREATE PROCEDURE pro_findById(In SID INT) BEGIN SELECT * FROM student where id=sid; END $
接收输入参数 的存储过程
1.mysql调用存储过程 :CALL pro_findById(4);
2.JAVA中调用存储过程;
CallableStatement接口:
//获取数据库连接
//准备sql
String sql="CALL pro_findById(?);" stmt=conn.prepareCall(sql); stmt.setInt(1,4); //所有调用存储过程都需要使用executeQuery() ResultSet res=stmt.executeQuery(); while(res.next()){ int id=res.getInt("id"); String name=res.getString("name"); System.out.println(id+name); }
输入输出参数的存储过程
DElimiter $CREATE PROCEDURE pro_findById2(IN sid INT,OUT sname VARCHAR(20))BEGIN SELECT NAME into sname FROM student where id=sid;END$CALL pro_findById2(5,@name);SELECT @name;
registerOutParameter(int paramterIndex,int sqlType)
按照顺序位置parameterIndex将OUT参数注册为JDBC类型sqlType,所有OUT参数都必须在执行存储过程前注册。sqlType为OUT参数指定的JDBC类型确定必须用于get方法,以读取该参数值的Java类型
创建存储过程的时候参数有类型
driver=new com.mysql.jdbc.Driver(); conn=driver.connect(url, prop); String sql="CALL pro_findById2(?,?)"; //执行预编译 stmt=conn.prepareCall(sql); //设置参数值 stmt.setInt(1,4); //注册输出参数 /** * 参数1:位置 * 参数2:存储过程中的输出参数jdbc类型 * */ stmt.registerOutParameter(2,java.sql.Types.VARCHAR);// stmt.setString("李四"); //发送参数执行 stmt.executeQuery(); //得到输出参数的值 //callableStatement中的getXXX() **//getXX主要是获取存储过程中的输出参数** String result=stmt.getString(2); //这个2是因为registerParameter注册的是2 System.out.println(result);
在Java项目中, . 代表项目的根目录
在web项目中,代表java命令运行开始,从tomcat的bin目录开始
类路径加载方式
/代表classpath的根目录
JdbcUtil.class.getResourceAsStream(“/”)
如果是java项目,classpath从bin开始;
web项目下,classpath从WEB-INF/classes目录
无论java项目还是java web ,src下写的文件会自动拷贝到类路径下面
事务
Connection接口:
setAutoCommit(boolean autoCommit);设置事务可以自动提交;false表示手动提交
- jdbc
- JDBC
- jdbc
- JDBC
- jdbc
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- jdbc
- JDBC
- JDBC
- jdbc
- 如何在酷狗上下载付费歌曲
- PAT 1065单身狗
- VB总结
- 安装固态后,关于4k对其
- BZOJ2190 洛谷2158 [SDOI2008 仪仗队]
- JDBC
- hdu 6038 Function
- C#(SuperWebSocket)与websocket通信
- let和const浅析
- 说Win清理不直观 有这个一目了然的走起不?
- HDU 6041(仙人掌图+tarjan)
- 博弈论(二):Sprague-Grundy函数
- 网页刷不开,那是你没改这个设置
- 敢动我电脑?小本本记下来