一、JDBC概念
java数据库的连接,(Java Database Connectivity 简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口。
连接MySQL中的数据库:jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT%2B8&useSSL=false";
二、加载数据库驱动
//1,加载驱动 Class.forName("com.mysql.cj.jdbc.Driver");
如果加载的是SQL server:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
三、建立连接
1)数据库URL:URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库。
URL的写法为:"jdbc:mysql://localhost:3306/数据库名称?参数名=参数值..."
常用数据库URL地址的写法:
- Oracle:jdbc:oracle:thin:@localhost:2521:数据库名称
- SqlServer:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名称
- MySQL:jdbc:mysql://localhost:3306/数据库名称
2)Connection:
jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中的一个最重要的一个对象,客户端与数据库所有交互都是通过Connection对象完成的.
创建方法:Connection conn = DriverManager.getConnection( URL,User,PassWord );
常用方法:
● createStatement();创建向数据库发送sql的statement对象
● prepareStatement(sql);创建向数据库发送预编译sql的PrepareStatement对象
● prepareCall(sql);创建执行存储过程的callableStatement对象
● setAutoCommit(boolean autoCommit);设置事务是否自动提交
● commit();在链接上提交事务
● rollback();在此链接上回滚事务
String url = "jdbc.mysql://localhost:3306/数据库名称"; String username = "用户名"; String password = "用户密码"; Connection conn = null; //2,获取与数据库的链接 conn = DriverManager.getConnection(url,username,password);
四、执行SQL语句
1)Statement:jdbc程序中的Statement对象用于向数据库发送SQL语句。
创建方法:Statement st = conn.createdStatement();
常用方法:
● executeQuery(String sql);用于向数据库发送查询语句
● executeUpdate(String sql);用于向数据库发送insert、update或delete语句
● execute(String sql);用于向数据库发送任意语句
● addBatch(String sql);把多条SQL语句发送到一个批处理中
● executeBatch();向数据库发送一批SQL语句执行。
Statement st = null; //3,获取用于向数据库发送SQL语句的Statement st = conn.createdStatement(); //4,向数据库发送SQL String sql = "select id,name,password,email,birthday from users st.executeQuery();
2)PreparedStatement:该类是Statement的子类对象
创建方法:PreparedStatement st = conn.preparedStatement();
preparedStatement st = null; String sql = "select * from user where name=? and password = ?"; //3,获取用于向数据库发送SQL语句的preparedStatement st = conn.preparedStatement(sql);//传入SQL语句,进行预编译 st.setString(1,username); st.setString(2,password); //4,向数据库发SQL st.executeQuery();//这里不用传入SQL语句了
3)Statement与PreparedStatement的区别
相对于Statement对象而言PreparedStatement可以避免SQL注入的问题。
如:String sql = "select * from admin where loginname=' "+loginName+" ' and loginpwd=' "+loginPwd+" ' ";
在应用中:
- 》请输入账号:
333
- 》请输入密码:
wer'or'1'='1
实际上发送:select * from admin where loginname=' 333 ' and loginpwd=' wer'or'1'='1 ' ,登录成功!
Statement会使数据库频繁编译SQL,可能会造成数据库缓冲区溢出。PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。
并且PreparedStatement对于SQL中的参数,允许只用占位符的形式进行替换,简化了SQL语句的编写。
五、获取结果
jdbc程序中的ResultSet用于代表Sql语句的执行效果。ResultSet封装执行结果时,采用的类似于表格的方式,ResultSet对象维护了一个指向表格数据行的游标、初始的时候,游标在第一行之前调用ResultSet.next()方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
1)获取行:ResultSet提供了对结果集进行滚动的方法
● next();移动到下一行
● Previous();移动到前一行
● absolute(int row);移动到指定行
● beforeFirst();移动到ResultSet的最前面
● afterLast();移动到ResultSet的最后面
2)获取值:ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法
● 获取任意类型的数据:
getObject(int index); getObject(String columnName);● 获取指定类型的数据:
getString(int index); getString(String columnName);
ResultSet rs = null; //4,向数据库发SQL,并获取代表结果集的ResultSet String sql = "select id,name,password,email,birthday from users"; rs = st.executeQuery(sql); //5,取出结果集的数据 rs.afterLast(); rs.previous(); System.out.println("id=" + rs.getObject("id")); System.out.println("name=" + rs.getObject("name")); System.out.println("password=" + rs.getObject("password")); System.out.println("email=" + rs.getObject("email")); System.out.println("birthday=" + rs.getObject("birthday")); //或者循环取出所有id while(rs.next()){ String id = rs.getString(1);//1代表数据库中表的列数,id在第一列也可以("id")!!! System.out.println("id = "+id); }