JDBC(java database connectivity)Java数据库连接,是Java语言中用来规范客户端程序如何来访问数据库[关系型数据库]的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
我们通常说的JDBC是面向关系型数据库的。
2. JDBC访问数据库JDBC访问数据库需要用到的类、接口、方法?
2.1 java.sql包DriverManager类负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接。驱动程序,会将自身加载到DriverManager中去。
2.1.1 数据驱动程序(Driver)根据所连接的数据库不同需要下载对应数据库的驱动程序。
例如:MySQL数据库----MySQL :: Download MySQL Connector/J (Archived Versions)
mysql-connector-java-5.1.38-bin.jar
通过java的反射机制,来给DriverManager,提供被加载的数据库驱动名称。
Class.forName(“数据库驱动名称【包名+类名】”);
数据库驱动名称来自mysql-connector-java-5.1.38-bin.jar中Driver的java类的全名称。
Class.forName(“com.mysql.jdbc.Driver”);
2.1.2向调用者返回相应的数据库连接DriverManager类中的静态方法getConnection(url,username,password)向调用者返回相应的数据库连接
static Connection getConnection(url,username,password)
参数url---指定被连接的数据库位置
【jdbc:mysql://数据库服务器IP:端口/数据库名称】
参数username---登陆数据库服务器的用户名
参数password----登陆数据库服务器的密码
2.2 java.sql包Connection接口数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
1.产生用以执行SQL的Statement。
[用以执行SQL查询和更新(针对静态SQL语句和单次执行)]
Statement createStatement()
select * from t_user where uid=12;[拼接字符串]
2.产生用以执行SQL的PreparedStatement。
[用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)]
PreparedStatement prepartatement(Sql)
参数sql---包含动态参数的SQL语句
select * from t_user where uid=?;【需要给sql动态传递参数值】
?---占位符
2.3 java.sql包Statement接口用以执行SQL查询和更新(针对静态SQL语句和单次执行)
以执行SQL更新【insert / update /delete】
int executeUpdate(SQL)
参数SQL---[insert / update /delete]字符串类型的sql语句。
以执行SQL查询【select】
ResultSet executeQuery(SQL)
参数SQL---[select]字符串类型的sql语句。
2.4 java.sql包PreparedStatement接口用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)
以执行SQL更新【insert / update /delete】
int executeUpdate()
以执行SQL查询【select】
ResultSet executeQuery()
注意:PreparedStatement需要执行的sql语句
- sql语句是在创建PreparedStatement对象的时候传入执行,不是在调用executeUpdate()/executeQuery()的时候传入。
- PreparedStatement对象所执行的sql语句中有“?【占位符】”
有一组填补sql语句占位符的方法
setInt(参数1,参数2) int--int
setLong(参数1,参数2) long---bigint
setDouble(参数1,参数2) double--double
setString(参数1,参数2) String--varchar/char
.....................
参数1---SQL语句中“?”的位置【从1开始】
参数2---SQL语句中“?”具体数据值
2.5.java.sql包ResultSet接口数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
boolean next()--将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false。在 while 循环中使用它来迭代结果集。
由于通过next方法将指针移动到下一行,我们现在就可以取出指针指向的当前行的数据值。要获取当前行中保存的数据值,就需要一列一列的取出数据值,所以ResultSet会有一组获取指定列数据的方法。
getXXXX(int colindex)---int colindex[当前需要获取数据值的列在当前行中的位置【从0开始】]
getXXXX(String colname)--String colname[当前需要获取数据值的列名称]
1 [int]--[id]
Zhangsan [varchar]--[name]
23 [int]--[age]
2[int]--[id]
Lisi [varchar]--[name]
24 [int]--[age]
3[int]--[id]
Wangwu [varchar]--[name]
25 [int]--[age]
通过ResultSet对象得到第一行数据值
int id=ResultSet对象.getInt(0);
int id=ResultSet对象.getInt(“id”);
//id==1
String name=ResultSet对象.getString(1);
String name=ResultSet对象.getString(“name”);
//name==zhangsan
int age=ResultSet对象.getInt(2);
int age=ResultSet对象.getInt(“age”);
//age==23
3.JDBC访问数据库的流程 4.测试基于Statement接口的数据库访问1.创建java项目
2.创建lib
3.复制驱动包
把mysql-connector-java-5.1.38-bin.jar复制到lib文件夹下
4.导入数据库驱动
5.加载数据库驱动
public class DBConnection { //定义数据库启动名称 private static final String DRIVERNAME="com.mysql.jdbc.Driver"; //静态代码块 static{ //加载数据库驱动 try { Class.forName(DRIVERNAME); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
6.得到数据库连接
//定义数据库地址url 【jdbc:mysql://数据库服务器IP:端口/数据库名称】 private static final String url="jdbc:mysql://127.0.0.1:3306/test"; //定义数据库登录账号 private static final String username="root"; //定义数据库登录密码 private static final String password="123456"; public static Connection getConnection(){ Connection conn=null; //得到数据库连接 //DriverManager.getConnection(url, user, password);需要url、账户、密码,因此需要定义 try { conn=DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } return conn; } } 测试是否连接到 import java.sql.Connection; public class MainTest { public static void main(String[] args) { Connection connection = DBConnection.getConnection(); System.out.println(connection); } } 输出: com.mysql.jdbc.JDBC4Connection@6433a2//成功
7.创建数据库中的数据表
在MySQL-Front中创建数据表
create table t_user(
user_id int primary key auto_increment,
user_name varchar(20),
user_pass varchar(20),
user_age int,
user_sex bit,
user_hei double,
user_day datetime
);
8.建一个用户信息类
import java.util.Date; public class UserInfo { private int userid; private String username; private String pass; private int userage; private boolean usersex; private double userhei; private Date userday; public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getUserage() { return userage; } public void setUserage(int userage) { this.userage = userage; } public boolean isUsersex() { return usersex; } public void setUsersex(boolean usersex) { this.usersex = usersex; } public double getUserhei() { return userhei; } public void setUserhei(double userhei) { this.userhei = userhei; } public Date getUserday() { return userday; } public void setUserday(Date userday) { this.userday = userday; } }
9.得到statement对象
Connection接口---- Statement createStatement()
9.1 执行更新(添加修改删除)
int executeUpdate(SQL)
(1)添加信息
import java.sql.Connection; import java.sql.Statement; public class UserService { public boolean insertUser(UserInfo userinfo){ boolean flag=false; try{ //得到数据库连接 Connection connection = DBConnection.getConnection(); Statement statement=connection.createStatement(); String sql="insert into t_user values(null, '"+userinfo.getUsername()+"','"+ userinfo.getPass()+"',"+userinfo.getUserage()+","+ userinfo.isUsersex()+","+userinfo.getUserhei()+",'"+userinfo.getUserday()+"');"; int executeUpdate = statement.executeUpdate(sql); //得到的int值大于等于0成功,小于等于0失败 if(executeUpdate>0){ flag=true; } statement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return flag; } } 测试类: import java.sql.Connection; import java.sql.Date; public class MainTest { public static void main(String[] args) { //添加信息 UserService userservice = new UserService(); UserInfo userinfo = new UserInfo(); userinfo.setUsername("zhangsan"); userinfo.setPass("123456"); userinfo.setUserage(23); userinfo.setUsersex(true); userinfo.setUserhei(168.9); userinfo.setUserday(new Date(System.currentTimeMillis())); boolean flag=userservice.insertUser(userinfo); if(flag){ System.out.println("添加成功"); } */ } }
(2)修改信息
和添加一样,只需修改sql语句
public boolean updateUser(UserInfo userinfo){ boolean flag=false; try{ //得到数据库连接 Connection connection = DBConnection.getConnection(); Statement statement=connection.createStatement(); String sql="update t_user set user_name='"+userinfo.getUsername()+ "',user_pass='"+userinfo.getPass()+"',user_age="+userinfo.getUserage()+ ",user_sex="+userinfo.isUsersex()+",user_hei="+userinfo.getUserhei()+ ",user_day='"+userinfo.getUserday()+"' where user_id="+userinfo.getUserid()+";"; int executeUpdate = statement.executeUpdate(sql); //得到的int值大于等于0成功,小于等于0失败 if(executeUpdate>0){ flag=true; } statement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return flag; } //修改信息 UserService userservice = new UserService(); UserInfo userinfo = new UserInfo(); userinfo.setUserid(2); userinfo.setUsername("lisi"); userinfo.setPass("333"); userinfo.setUserage(45); userinfo.setUsersex(false); userinfo.setUserhei(170); userinfo.setUserday(new Date(System.currentTimeMillis())); boolean flag=userservice.updateUser(userinfo); if(flag){ System.out.println("修改成功"); }
(3)删除信息
public boolean deleteUser(int userid){ boolean flag=false; try{ Connection connection = DBConnection.getConnection(); Statement statement=connection.createStatement(); String sql="delete from t_user where user_id="+userid+";"; int executeUpdate = statement.executeUpdate(sql); //得到的int值大于等于0成功,小于等于0失败 if(executeUpdate>0){ flag=true; } statement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return flag; } //删除用户信息 UserService userservice = new UserService(); UserInfo userinfo = new UserInfo(); boolean flag=userservice.deleteUser(1); if(flag){ System.out.println("删除成功"); }
9.2 执行查询
ResultSet 接口
ResultSet executeQuery(sql)
public ListselectAll(){ List userlist=null; try{ Connection connection = DBConnection.getConnection(); Statement statement=connection.createStatement(); String sql="select*from t_user;"; ResultSet executeQuery = statement.executeQuery(sql); userlist = new ArrayList (); while(executeQuery.next()){ int userid = executeQuery.getInt("user_id"); String username = executeQuery.getString("user_name"); String userpass = executeQuery.getString("user_pass"); int userage = executeQuery.getInt("user_age"); boolean usersex = executeQuery.getBoolean("user_sex"); double userhei = executeQuery.getDouble("user_hei"); Date userday = executeQuery.getDate("user_day"); UserInfo userInfo = new UserInfo(); userInfo.setUserid(userid); userInfo.setUsername(username); userInfo.setPass(userpass); userInfo.setUserage(userage); userInfo.setUsersex(usersex); userInfo.setUserhei(userhei); userInfo.setUserday(userday); userlist.add(userInfo); } executeQuery.close(); statement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return userlist; } //查询所有 UserService userservice = new UserService(); List userlist = userservice.selectAll(); for(UserInfo userinfo:userlist){ System.out.println(userinfo.getUserid()+"t"+userinfo.getPass()+"t"+userinfo.getUsername()); }
public UserInfo selectById(int uid){ UserInfo userInfo=null; try{ Connection connection = DBConnection.getConnection(); Statement statement=connection.createStatement(); String sql="select*from t_user where user_id="+uid+";"; ResultSet executeQuery = statement.executeQuery(sql); if(executeQuery.next()){ int userid = executeQuery.getInt("user_id"); String username = executeQuery.getString("user_name"); String userpass = executeQuery.getString("user_pass"); int userage = executeQuery.getInt("user_age"); boolean usersex = executeQuery.getBoolean("user_sex"); double userhei = executeQuery.getDouble("user_hei"); Date userday = executeQuery.getDate("user_day"); userInfo = new UserInfo(); userInfo.setUserid(userid); userInfo.setUsername(username); userInfo.setPass(userpass); userInfo.setUserage(userage); userInfo.setUsersex(usersex); userInfo.setUserhei(userhei); userInfo.setUserday(userday); } statement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return userInfo; } //根据id查询 UserService userservice = new UserService(); UserInfo selectById = userservice.selectById(2); if(selectById!=null){ System.out.println(selectById.getUserid()+"t"+selectById.getPass()+"t"+selectById.getUsername()); }5.测试基于PreparedStatement接口的数据库访问
从创建项目到数据库连接都是一样的。
import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class UserService { public boolean insertUser(UserInfo userinfo){ boolean flag=false; try{ //得到数据库连接 Connection connection = DBConnection.getConnection(); String sql="insert into t_user values(null,?,?,?,?,?,?);"; //先?再补 PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setString(1, userinfo.getUsername()); prepareStatement.setString(2, userinfo.getPass()); prepareStatement.setInt(3, userinfo.getUserage()); prepareStatement.setBoolean(4, userinfo.isUsersex()); prepareStatement.setDouble(5, userinfo.getUserhei()); prepareStatement.setDate(6, userinfo.getUserday()); int executeUpdate = prepareStatement.executeUpdate(); //得到的int值大于等于0成功,小于等于0失败 if(executeUpdate>0){ flag=true; } prepareStatement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return flag; } public boolean updateUser(UserInfo userinfo){ boolean flag=false; try{ Connection connection = DBConnection.getConnection(); String sql="update t_user set user_name=?,user_pass=?,user_age=?,user_sex=?,user_hei=?,user_day=? where user_id=?;"; //先?再补 PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setString(1, userinfo.getUsername()); prepareStatement.setString(2, userinfo.getPass()); prepareStatement.setInt(3, userinfo.getUserage()); prepareStatement.setBoolean(4, userinfo.isUsersex()); prepareStatement.setDouble(5, userinfo.getUserhei()); prepareStatement.setDate(6, userinfo.getUserday()); prepareStatement.setInt(7, userinfo.getUserid()); int executeUpdate = prepareStatement.executeUpdate(); //得到的int值大于等于0成功,小于等于0失败 if(executeUpdate>0){ flag=true; } prepareStatement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return flag; } public boolean deleteUser(int userid){ boolean flag=false; try{ Connection connection = DBConnection.getConnection(); String sql="delete from t_user where user_id=?;"; PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setInt(1, userid); int executeUpdate = prepareStatement.executeUpdate(); //得到的int值大于等于0成功,小于等于0失败 if(executeUpdate>0){ flag=true; } prepareStatement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return flag; } public List6.Statement与PreparedStatement的区别selectAll(){ List userlist=null; try{ Connection connection = DBConnection.getConnection(); String sql="select*from t_user;"; PreparedStatement prepareStatement = connection.prepareStatement(sql); ResultSet executeQuery = prepareStatement.executeQuery(sql); userlist = new ArrayList (); while(executeQuery.next()){ int userid = executeQuery.getInt("user_id"); String username = executeQuery.getString("user_name"); String userpass = executeQuery.getString("user_pass"); int userage = executeQuery.getInt("user_age"); boolean usersex = executeQuery.getBoolean("user_sex"); double userhei = executeQuery.getDouble("user_hei"); Date userday = executeQuery.getDate("user_day"); UserInfo userInfo = new UserInfo(); userInfo.setUserid(userid); userInfo.setUsername(username); userInfo.setPass(userpass); userInfo.setUserage(userage); userInfo.setUsersex(usersex); userInfo.setUserhei(userhei); userInfo.setUserday(userday); userlist.add(userInfo); } executeQuery.close(); prepareStatement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return userlist; } public UserInfo selectById(int uid){ UserInfo userInfo=null; try{ Connection connection = DBConnection.getConnection(); String sql="select*from t_user where user_id=?;"; PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setInt(1, uid); ResultSet executeQuery = prepareStatement.executeQuery(); if(executeQuery.next()){ int userid = executeQuery.getInt("user_id"); String username = executeQuery.getString("user_name"); String userpass = executeQuery.getString("user_pass"); int userage = executeQuery.getInt("user_age"); boolean usersex = executeQuery.getBoolean("user_sex"); double userhei = executeQuery.getDouble("user_hei"); Date userday = executeQuery.getDate("user_day"); userInfo = new UserInfo(); userInfo.setUserid(userid); userInfo.setUsername(username); userInfo.setPass(userpass); userInfo.setUserage(userage); userInfo.setUsersex(usersex); userInfo.setUserhei(userhei); userInfo.setUserday(userday); } prepareStatement.close(); connection.close(); }catch(Exception e){ e.printStackTrace(); } return userInfo; } } import java.sql.Connection; import java.sql.Date; import java.util.List; public class MainTest { public static void main(String[] args) { } }
Statement接口
PreparedStatement接口
继承关系
是Statement接口的子接口
使用范围
当执行相似SQL(结构相同,具体值不同)语句的次数比较少
当执行相似sql语句的次数比较多(例如用户登陆,对表频繁 *** 作..)语句一样,只是具体的值不一样,被称为动态SQL
优点
语法简单
语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
缺点
采用硬编码效率低,安全性较差。
执行非相似SQL语句时,速度较慢。
原理
硬编码,每次执行时相似SQL都会进行编译
相似SQL只编译一次,减少编译次数6
建议使用右边第二种,PreparedStatement接口,使用占位符?,第一种非常容易写错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)