(1)JDBC:Java Database Connectivity JAVA连接数据库
简单的说,JDBC代表一组API(应用程序接口),一个独立于特定数据库管理系统(DBMS)、通用的SQL数据库存取和操作的公共接口(一组API)。
(2)驱动:每个数据库厂商对JDBC的接口的实现类。
JDBC的API是SUN公司提供的,而这些接口的实现类(驱动)由数据库厂商提供。
(3)JDBC、驱动和mysql数据库的流程是:
Java Application程序 先调用 JDBC 再调用数据库所对应的驱动(这里是mysql),最后进去数据库层的操作。
(4)JDBC目的:为了使java代码可以跨数据库,JDBC的代码尽量不动(少动),设计一组公共接口(标准),规定了所有操作。
1、把驱动jar引入项目中
在java项目中,已经建立一个libs, 把数据库驱动:mysql-connector-java-5.1.36-bin.jar放入到文件夹中,然后添加到build-path路径下。
(驱动下载,大家可以参考。百度云网盘:https://pan.baidu.com/s/1adYbh1IUdGuKiP20h57rbQ 提取码:7xan)
2、编写JDBC代码
Class.forName("驱动类的全名称");
对于mysql:驱动类的全名称有两个,都可以使用,建议新版。
新版:mysql:com.mysql.jdbc.Driver 老版:org.gjt.mm.mysql.Driver
(1)String mysqlurl = “jdbc:mysql://主机地址:端口号/数据库名”
主机地址:localhost;mysql 端口号:3306, 这么数据库用test库,
url是网址,即统一资源定位符。其中jdbc是协议,mysql是子协议。
即: String url = "jdbc:mysql://localhost:3306/test";
(2)String username = "用户名";
即mysql的主机用户,一般是"root"
(3)String password = "密码";
即mysql登录密码
(4)Connection conn = DriverManager.getConnection(url,username,password);
用驱动管理类获取连接,Connection接口和DriverManager类都在java.sql包。
String sql = "xxx";
其中xxx即我们写的sql语句。
Statement st = conn.createStatement();
这里是创建的Statement对象来接收sql语句的操作,但是Statement对象有三个致命问题,这在下一章节讲,以后尽量用改进的PreparedStatement对象。
(1)更新:添加、修改、删除
int len = st.executeUpdate(sql);
(2)查询
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
xxx xxx = rs.getXxx(字段名或者序号);//序号从1开始
}
==注意:==这里执行sql语句把sql代入了,而创建Statement对象时没有代入sql。这与PreparedStatement对象正好相反。写代码的时候注意下!
rs.close();
st.close();
例如:从键盘输入员工信息,并添加到test数据库的t_employee表中。
在1.1.3程序代码的第3步,编写sql语言时,如果我们只加入ename,tel,gender,salary信息,其他字段为null,那么sql要写的代码为:
String sql = "insert into t_employee(ename,tel,gender,salary) values('"+ename +"','"+tel+"','"+gender+"','"+salary+"')";
这里重点说下values括号里面的写法:java中的sql里传变量时使用单引号界定引进的变量,然后在变量里面用java的字符串拼接方法" + ename +"。
可以看出来,如果字段稍微多一点,这样的用Statement对象的写法很复杂。
sql注入问题会有造成盗取信息。
例如:根据姓名到t_employee表中查自己的信息。
在编写sql语句时,
String sql ="select * from t_employee where ename = '"+ ename +"'";
在键盘输入ename时,输入: 张三 ’ or ‘1’='1
这样的sql语句就变成了select * from t_employee where ename = ’ 张三 ’ or ‘1’='1 ’
可以注意到,这个sql在where筛选后所有行都恒成立,将把所有人的信息导出,就会发生盗取信息。
这是因为因为java中字符串拼接得到的是String类型
为了解决Statement对象的三个问题,引入PreparedStatement对象。
原代码的第一步注册驱动和第二步获取连接不变。
1.为了解决sql拼接问题:
(1)编写sql:
String sql = "insert into t_employee(ename,tel,gender,salary) values(?,?,?,?)";
==注意:==此处用占位符’?'放在sql语句values中占位;
(2)创建PreparedStatement对象
PreparedStatement pst = conn.prepareStatement(sql);
要先传入sql,对带?的sql进行预编译。注意这里在创建PreparedStatement对象的时候就已经代入了sql。
(3)把?的具体值传进入
pst.setObject(1, ename);//序号都是从1开始
pst.setObject(2, tel);
pst.setObject(3, gender);
pst.setObject(4, salary);
其中1表示第一个?占位符位置,2表示第二个?占位符位置。
ename,tel,gender,salary都是用Scanner扫描的键盘输入字符串。
(4)更新执行sql
int update = pst.executeUpdate();//这里不能再传sql
System.out.println(update>0?"添加成功"