JDBC开发,数据库的连接
JDBC开发步骤
1.建完工程后,右击工程,new,新建一个文件夹Folder,装jar包,
2.将下载好的驱动包打开,找到jar文件,CTRL+C,选中装jar包的文件夹,CTRL+V,
3.选中添加的jar,右键,Build Path,Add to Build Path
4.新建一个包,再新建一个自定义类
5.注册驱动:Class.forName("com.mysql.jdbc.Driver");throws异常
6.获得链接,
数据库的url:jdbc:mysql://localhost:3306/数据库名
//解决中文乱码:在url中数据库名后加?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
Connection con = DriverManager.getConnection("");
导包,java.sql,throws异常
7.获得语句执行平台
通过连接对象获取对SQL语句的执行者对象
Statement stm=链接对象.createStatement();
8.执行sql语句
使用执行者对象,向数据库执行SQL语句
获取到数据库的执行后的结果
例子:
package com.oricle.Demo01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Demo01 { public static void main(String[] args) throws ClassNotFoundException, SQLException { /* 1.建完工程后,右击工程,new,新建一个文件夹Folder,装jar包, * 2.将下载好的驱动包打开,找到jar文件,CTRL+C,选中装jar包的文件夹,CTRL+V, * 3.选中添加的jar,右键,Build Path,Add to Build Path * 4.新建一个包,再新建一个自定义类 * 5.注册驱动:Class.forName("com.mysql.jdbc.Driver");throws异常 * 6.获得链接, * 数据库的url:jdbc:mysql://localhost:3306/数据库名 * //解决中文乱码:在url中数据库名后加?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE * Connection con = DriverManager.getConnection(""); * 导包,java.sql,throws异常 * 7.获得语句执行平台 通过连接对象获取对SQL语句的执行者对象 Statement stm=链接对象.createStatement(); 8.执行sql语句 使用执行者对象,向数据库执行SQL语句 获取到数据库的执行后的结果 * */ //1注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2获得链接 String url="jdbc:mysql://localhost:3306/fuxi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE"; String user="root"; String password="123456"; Connection con=DriverManager.getConnection(url, user, password); //3获得语句执行平台 Statement stm=con.createStatement(); //4.执行语句 String sql="delete from sort where sid=5"; stm.execute(sql);//增删改 //5.针对于查询操作 //6,先开的后关 stm.close(); con.close(); } }
用集合来装从数据库里面获取的数据
自定义一个类,类名和数据库名一致
package com.oricle.demo01; public class sort { private int sid; private String sname; private String sdesc; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSdesc() { return sdesc; } public void setSdesc(String sdesc) { this.sdesc = sdesc; } @Override public String toString() { return "sort [sid=" + sid + ", sname=" + sname + ", sdesc=" + sdesc + "]"; } }
测试类:
package com.oricle.demo01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; public class demo03 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2获取连接 String url="jdbc:mysql://localhost:3306/fuxi"; String user="root"; String password="123456"; Connection co=DriverManager.getConnection(url, user, password); // 3获得预处理对象 Statement s=co.createStatement(); // 4 SQL语句占位符设置实际参数 // 5执行SQL语句 String sql="select *from sort"; ResultSet rs=s.executeQuery(sql); //6处理结果集 ArrayList<sort> as=new ArrayList<sort>();//创建集合用来装新建sort对象 //遍历 while(rs.next()){ sort so=new sort();//自定义一个类,类名和数据库名一致,创建对象 so.setSid(rs.getInt("sid"));//把获取当前行的分类id利用set方法存入对象的成员变量中, so.setSname(rs.getString("sname")); so.setSdesc(rs.getString("sdesc")); as.add(so);//把该对象添加到集合as中 } System.out.println(as);//打印集合里面内容 //7释放资源 rs.close(); s.close(); co.close(); } }
注册驱动
代码:Class.forName("com.mysql.jdbc.Driver");
JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.Driver
DriverManager工具类,提供注册驱动的方法 registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
以上代码不推荐使用,存在两方面不足
- 硬编码,后期不易于程序扩展和维护
- 驱动被注册两次。
通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
查询com.mysql.jdbc.Driver源码,发现Driver类“主动”将自己进行注册,重复
public class Driver extends NonRegisteringDriver implements java.sql.Driver { static { try { java.sql.DriverManager.registerDriver(new Driver());//注册 } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } …… }
获得链接
代码:Connection con = DriverManager.getConnection (“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);
获取连接需要方法
DriverManager.getConnection(url,username,password);
三个参数分别表示,url 需要连接数据库的位置(网址) user用户名 password 密码
下面是mysql的url:
jdbc:mysql://localhost:3306/mydb
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
第一部分是jdbc,这是固定的;
第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb)组成。
获得语句执行平台
String sql = "某SQL语句";
获取Statement语句执行平台:Statement stmt = con.createStatement();
常用方法: int executeUpdate(String sql); --执行insert update delete语句. ResultSet executeQuery(String sql); --执行select语句. boolean execute(String sql); --执行select返回true 执行其他的语句返回false.
SQL注入问题
假设有登录案例SQL语句如下:
SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;
此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’ OR ‘a’=’a时,则真正执行的代码变为:
SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
为此,我们使用PreparedStatement来解决对应的问题。
package com.oricle.demo01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; public class demo05 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/fuxi"; String user="root"; String password="123456"; Connection co=DriverManager.getConnection(url, user, password); Scanner sc=new Scanner(System.in); System.out.println("请输入用户名:"); String uname=sc.next(); System.out.println("请输入密码:"); String pwd=sc.next(); String sql="select * from user where uname=? and pwd=?"; PreparedStatement pst=co.prepareStatement(sql); pst.setString(1, uname); pst.setString(2,pwd); ResultSet rs=pst.executeQuery(); while(rs.next()){ System.out.println(rs.getString("uname")+"..."+rs.getString("pwd")); } rs.close(); pst.close(); co.close(); } }
?占位符,插入数据时,用逗号隔开
String sql = "insert into sort(sid,sname) values(?,?)";