一、JDBC:Java Database Connecor
java语言连接数据库技术
实现:Java代码操作数据库
实现方式:java提供接口,由各大数据库厂商来写实现类,
因为每个厂商的数据库底层实现都是不一样的,这也叫接口驱动方式
补充:C#和Java的方式是正好相反,C#是自己写好各大数据库的连接代码
二、JDBC相关的API:四大接口和一个类
DriverManager 驱动管理类
Connection 数据库连接对象
Statement 操作sql语句并携带返回
PreparedStatement 操作sql语句并携带返回
Resultset 结果集——>只有查询的时候才会有
三、JDBC的使用
1.直接添加数据的方式
①导入jar包
②编写代码连接数据库
1.加载驱动
Class.forname("com.mysql.jdbc.Driver");
说明:返回的对象不用我们操作,DriverManager底层会操作这个对象
2.获取Connection对象,导包的时候注意是java.sql包下的
通过DriverManager.getConnection("")返回Connection对象
字符串里面放:jdbc:mysql://主机名:端口号/数据库名?user=用户名&password=密码
&使用Unicode=true或false&字符集=编码格式
例子:
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/myemployees
?user=root&password=root&useUnicode=true&characterEncoding=utf-8");
注意:如果没有密码可以不写,但是password=要写
3.编写SQL语句
String sql = "语句";
注意:用java操作数据库的时候,sql语句必须是对的,
所以可以先去SQLyong中写好语句再复制进来,复制的时候不要把分号也复制了
4.创建Statement st = Connection对象.createStatement();
注意:Stratment也是java.sql包下的
5.通过 ResultSet rs = st.executeQuery(sql);得到一个结果集
6.遍历结果集 --> 这个时候才是返回数据的时候,返回的结果集是索引
实现:while配合ResultSet对象的next()方法,和iterator的用法是类似的,
也是先进行判断,然后再进行读取数据,
然后通过ResultSet对象中的get数据类型("列名")得到相应的数据
7.关闭资源
rs.close(); 关闭结果集
st.close(); 关闭Statement
con.close(); 关闭连接
代码实现:
public static void main(String[] args) {
//第一个程序
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获得连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4?user=root&password=root&useUnicode=true&characterEncoding=utf-8");
// 3.编写sql语句
String sql = "SELECT id,ename,salary FROM emp";
// 4.执行sql语句
Statement st = con.createStatement();
// 5.执行sql语句,返回一个结果集
ResultSet rs = st.executeQuery(sql);
// 6.遍历rs结果集
// while配合ResultSet对象的next()方法,和iterator的用法是类似的,
// 也是先进行判断,然后再进行读取数据,
// 然后通过ResultSet对象中的get数据类型("列名")得到相应的数据
System.out.println("id\t\t名字\t\t工资");
while (rs.next()){
Integer id = rs.getInt("id");
String name = rs.getString("ename");
Double salary = rs.getDouble("salary");
System.out.println(id + "\t" + name + "\t" + salary);
}
// 7.关闭资源
rs.close();
st.close();
con.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
}
2.通过控制台修改数据的方式
这种方式更加灵活,第1种方式只能添加一条固定的数据
说明:①sql语句要用"+要添加的变量+"这样的形式将变量包起来
②修改数据和删除数据是没有结果集返回的
用st.executeUpdate(String str)方法可以返回一个int类型的值
如果这个值等于1,就是添加成功了,如果是其他数据那就是添加失败
③关资源的时候,不用关结果的那个资源,因为它返回的是一个值
代码实现:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入id:");
int id = sc.nextInt();
System.out.println("输入姓名:");
String name = sc.next();
System.out.println("输入性别");
String gender = sc.next();
System.out.println("输入工资:");
String salary = sc.next();
System.out.println("输入加入日期:");
String date = sc.next();
System.out.println("输入部门id:");
int did = sc.nextInt();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3?user=root&password=root&useUnicode=true&characterEncoding=utf-8");
String sql = "INSERT INTO emp VALUES("+id+",'"+name+"','"+gender+"',"+salary+",'"+date+"',"+did+")";
Statement st = con.createStatement();
int index = st.executeUpdate(sql);
if (index == 1){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
st.close();
con.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
3.通过PreparedStatement对象用控制台的方式
说明:PreparedStatement( PS)是Statement(Sm)接口的子接口
它们两者的区别?
①PS在写sql语句的时候可以用占位符 ? 代替变量,然后再来填充占位符的值,St是"+变量+"
②PS在执行之前,有一个预编译的动作,使得SQL语句执行效率搞,St不是
③PS在创建对象的时候就需要传一个sql语句的参数,St是创建之后调用方法的时候再传的
填充数据:PS.set类型(占位符的位置,变量名)
从左到右,索引从1开始
例子:PS.set(1,“id”);
注意:占位符 ? 不要用双引号引起来,程序会以为是个字符串
结论:以后一律使用PS
代码实现:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入id:");
int id = sc.nextInt();
System.out.println("输入姓名:");
String name = sc.next();
System.out.println("输入性别");
String gender = sc.next();
System.out.println("输入工资:");
Double salary = sc.nextDouble();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3?user=root&password=root&useUnicode=true&characterEncoding=utf-8");
String sql = "INSERT INTO emps VALUES (2,?,?,?);";
PreparedStatement ps = con.prepareStatement(sql); // 创建对象的时候通过传参传入sql
ps.setString(1,name); // 填充数据
ps.setString(2,gender);
ps.setDouble(3,salary);
long index = ps.executeLargeUpdate();
if (index == 1){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
ps.close();
con.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}