JAVA 访问数据库的技术:
Jdbc是一种Java连接数据库技术(Java database connectity), 它是 Java 提供的一些接口,这些接口大部分是数据库厂商提供的(jar包),我们要做的,是连接数据库以后,如何使用Java代码从数据库中存取数据!
如何没有开启会报错:
MySQL驱动固定写法!注意是”MySQL数据库的驱动”
注册数据库驱动:
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
连接数据库必要的参数:
URL: 访问数据库的地址:写法:
jdbc:mysql://数据库所在Ip地址:数据库端口/数据库的名字
name : 要连接的数据库的账户名
password : 要连接数据库的用户密码
//找到本机的数据库应用,3306是数据库的默认端口 8080是tomkat的默认端口
String url = "jdbc:mysql://localhost:3306/student";
String name = "root";//将要连接数据库的账户
String password = "root";//将要连接数据库的密码
Connection connection = DriverManager.getConnection(url,name,password);
这个可以解决乱码问题,在url后面可以设置编码,这里设的是utf-8:
url = "jdbc:mysql://localhost:3306/yunlian??autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=utf-8";
建立数据库连接的代码:
public static Connection getConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(URL,NAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
将Connection(数据库连接对象),和Ststement(SQL语句执行对象)断开连接
public static void releaseRseource(Connection conn, Statement sat){
try {
sat.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
将Connection(数据库连接对象),和Statement(SQL语句执行对象),和ResultSet(数据库返回结果集)断开连接
public static void releaseRseource(Connection conn, Statement sat, ResultSet res){
try {
sat.close();
conn.close();
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
在连接数据库时,如果数据库不存在,或者用户名、密码错误,会出现连接数据库失败的异常
用户名或者密码错误:
当我们的url中的数据库不存在的时候:
当URL中的IP或者主机连不上的时候,就会出现连接超时的异常:
当数据库端口号写错的时候,会出现连接被拒绝:
用于执行SQL语句
PreparedStatement接口继承了Statement,
Statement(固定),和 PreparedStatement(可变参数) 是SQL语句的两种执行方式
1.在遇到要执行的SQL语句是带可变参数的时候,就用PreparedStatement对象,应为PreparedStatement可以用占位符将SQL语句加入可变参数!:
String sql = "insert into user(sno,name,age)values(?,?,?)";//定义一个要执行的SQL语句
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,student.getSno());//设置SQL语句的第一个参数
ps.setString(2,student.getName());//设置SQL语句的第二个参数
ps.setInt(3,student.getAge());//设置SQL语句的第三个参数
2.当要执行的SQL语句的是不带可变参数的时(就是SQL语句不变时!):
String sql = "SELECT * FROM user";
Statement statement = connection.createStatement();//sql语句的执行对象
ResultSet row = statement.executeQuery(sql);//执行SQL语句
PreparedStatement 和Statement的区别:
PreparedStatement:用户通过你系统输入变量时,变量将加入你的SQL语句,这样就能在不知道你的用户输入的情况下,获取信息
根据比较结果可知,我们需要选用PreparedStatement更好、更快速、更安全。因此,在以后的JDBC操作中,建议使用PreparedStatement。
两种语句:
1).不用返回数据库信息: 增,删,改
exexuteUpdate() 方法 : 返回一个整形(对数据库影响的行数)
2).需要返回数据库信息: 查
代码:
查看:
/**
* 查看表
* @return
*/
private static List get() {
String sql="select*from stu";
Connection conn=DButil.getConnection();
try {
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
List stus=new ArrayList();
while (rs.next()){
Stu stu=new Stu();
stu.setCardid(rs.getString("cardid"));
stu.setName(rs.getString("name"));
stu.setPhone(rs.getString("phone"));
stu.setSex(rs.getByte("sex"));
stus.add(stu);
}
return stus;
}catch (SQLException e){
e.printStackTrace();
}
return null;
}
添加:
/**
* 添加用户
* @param stu 待添加的用户
* @return 受影响的行数
*/
public static int add(Stu stu){
String sql="insert into user values(?,?,?,?)";
Connection conn= DButil.getConnection();
try {
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,stu.getCardid());
ps.setString(2,stu.getName());
ps.setString(3,stu.getPhone());
ps.setByte(4,stu.getSex());
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
删除:
/**
* 删除用户
* @param cardid 待删除用户的身份证号
* @return 是否成功
*/
public static int del(String cardid) throws SQLException {
String sql="delete from stu where cardid=?";
Connection conn=DButil.getConnection();
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,cardid);
return ps.executeUpdate();
}catch (SQLException e){
e.printStackTrace();
}
return -1;
}
修改:
/**
* 修改用户
* @param stu 待修改的用户
* @return 是否成功
*/
public static int modify(Stu stu) throws SQLException {
String sql="update stu set(?,?,?,?)";
Connection conn=DButil.getConnection();
try{
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,stu.getName());
ps.setString(2,stu.getPhone());
ps.setByte(3,stu.getSex());
ps.setString(4,stu.getCardid());
return ps.executeUpdate();
}catch (SQLException e){
e.printStackTrace();
}
return -1;
}
[点击并拖拽以移动]
exexuteQuery() 方法 : 返回一个结果集对象(Resultest 在数据库中查到的一条数据)
读取返回对象集中的数据的方法: (就是集合的迭代器)
Resultest.next()能够返回给你还有没有记录,
getObjeck方法,读取一条记录里面字段所对应的值
调用Dao的方法后返回一个结果给servlet 让servlet进行处理!:如:
int row = UserDAD.insert(student);
if (row==1){
jsonObject.put("code",1);
jsonObject.put("msg","添加成功");
jsonObject.put("data",student);
}else {
jsonObject.put("code",2);
jsonObject.put("msg","添加失败");
}
4.6 释放资源
将用到的传输有关的对象再传输完成后统统释放! 如:
ps.close();
connection.close();