jdbc学习
认真的回顾一下jdbc。巩固一下知识。争取用最通俗的话来解释。
首先我们在编程中肯定是要用到数据库的,一个方法就是每次使用的时候去使用sql语句去操作增删改查,第二个就是可以使用一些软件,是数据库操作可视化,更加直观。
上面这两种方法虽然可以实现操作数据库,但是如果我们在代码中需要去操作数据库,就不能再去自己输入sql语句,所以就需要有一个解决办法让我们可以在java代码里面去对数据库进行操作。
现在我们有java,有了mysql,那怎么把这两个连起来,能让我在java中用mysql呢?就是上面提到的第三种方法,也就是jdbc(Java Data Base Connectivity,java数据库连接)是最基础的一个在java中操作数据库的方法。
首先我们要知道jdbc会提供一个API,里面有一些东西是给我们用来建立连接的。最主要的是三个:
1.DriverManager:驱动管理,这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
上面这段话有点复杂,先可以将驱动简单的认为是判断是那种数据库的方法。
在java中使用的方法
mysql:Class.forName("com.mysql.jdbc.Driver")
oracle:Class.forName("oracle.jdbc.driver.OracleDriver")
2.Connection:此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。
这个就是去配置和数据库连接的信息了,比如数据库的url,用户名,密码。我们肯定是要告诉java,去哪里找数据库,然后数据库的密码是什么,这样才能连接到数据库。
使用方法:
Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/chenh","root","123456");
数据库所处于的ip:localhost (本机)
数据库的端口号:3306(mysql专用端口号)
数据库名称chenh
账号root
密码admin
3.Statement:可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数.
这个的作用就是去执行sql语句了,把sql语句通过建立好的连接,发送到数据库执行,并且返回结果。
4.ResultSet:返回结果集
这个的作用是获取到查询表里面的数据,resultset有getString,getInt等方法,用来获取不同类型的字段。另外需要使用result.next()方法来获取第一行的数据,这个方法是Boolean类型,判断下一行是不是有数据。
有上面的这几部分,我们就可以使用jdbc去操作数据库了。
首先建一个user表,里面两个字段id,name,插入一条数据id=1,name="坤哥"
然后model类。
public classUser {
private intid;
private
Stringname;
publicUser(){
}
public intgetId() {
return id;
}
public voidsetId(intid) {
this.id= id;
}
publicStringgetName() {
return name;
}
public voidsetName(String name) {
this.name= name;
}
接下来是一个类,来测试能不能正常使用。
public classjdbc {
public staticUserGetOneUser(String sql) {
User user=null;
try{
Class.forName("com.mysql.jdbc.Driver");
Connection conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/chenhao","root","123456");
PreparedStatement prsmt = conn.prepareStatement(sql);
ResultSet rs=prsmt.executeQuery();
rs.next();
//result.next的意思是读取到结果集的下一行内容。使用while(rs.next)意思是将结果集内容全部读取出来。
//next返回的是boolean类型,来判断下一行是不是为空。
user=newUser();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
//通过rs.get来获取到从数据库查到的数据。name是model中对应的内容
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
return user;
}
public static voidmain(String[] args) {
User user=GetOneUser("select *from user where id=1");
System.out.println("id"+user.getId()+"姓名"+user.getName());
}
}
结果应该是
实现了以后就可以继续深入一点点。
我们在每次获取连接之后,连接就会存在,如果每次都不关闭连接释放资源的话,在数据量比较大的情况下会吧内存占满,会导致内存溢出,程序中断。所以我们在建立连接使用完之后一定要去释放链接。
顺序是:先关闭ResultSet -----statement-----connection。
每一个都可以调用close方法去关闭。
加上以后完整的是这样的:
public classjdbc {
public staticUserGetOneUser(String sql) {
Connection conn=null;
PreparedStatement prsmt =null;
ResultSet rs=null;
User user=null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chenhao","root","123456");
prsmt = conn.prepareStatement(sql);
rs=prsmt.executeQuery();
rs.next();
//result.next的意思是读取到结果集的下一行内容。使用while(rs.next)意思是将结果集内容全部读取出来。
//next返回的是boolean类型,来判断下一行是不是为空。user=newUser();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
//通过rs.get来获取到从数据库查到的数据。name是model中对应的内容}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
finally{
try{
if(rs !=null)
rs.close();
if(prsmt !=null)
prsmt.close();
if(conn !=null)
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
return user;
}
public static voidmain(String[] args) {
User user=GetOneUser("select *from user where id=1");
System.out.println("id"+user.getId()+"姓名"+user.getName());
}
}
到这里我们是使用了基本的jdbc进行操作数据库。但是上面只用到了一个方法就是根据id查找,那还有增删改怎么做?
也比较简单就是建立连接-----使用sql语句-----关闭连接。然后把这个流程写成一个方法,去main函数调用写一下。
这样写肯定是没错的,但是想一下,如果真这么做的话,我是不是每个方法里面都需要去建立连接,关闭连接。这些重复的部分写起来很麻烦,那么我们用面向对象的思想,把建立连接和关闭连接写成一个类,里面有两个方法,那我每次需要的时候,就直接去调用一下,这样不是方便很多?而且看起来也会更加清晰。
我们把重复的部分拿出来写成一个类:如下
public classDBConnection {
//获取数据库连接public staticConnectiongetConnection() {
Connection conn =null;
try{Class.forName("com.mysql.jdbc.Driver");
//将驱动加载,供给jmv使用,开始执行静态初始化代码时,会自动新建一个Driver的对象,并调用DriverManager.registerDriver把自己注册到DriverManager中去。
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chenh,"root","123456");
}
catch(ClassNotFoundException e) {
e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因}catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭所有资源public static voidcloseAll(ResultSet rs,Statement stmt,Connection conn){
try{
if(rs!=null)
rs.close();//result set
if(stmt!=null)
stmt.close();
if(conn!=null)
conn.close();//connection
}catch(SQLException e) {
e.printStackTrace();
}
}
}
这个时候我们再去调用的时候就方便很多了,建立连接只要写
Connectionconn = DBConnection.getConnection();
关闭连接:
DBConnection.closeAll();
然后这时候再去实现增删改:
public classcrud {
//增加public static voidadd(User user){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="insert into user( id, name)values (?,?)";
try{
conn= DBConnection.getConnection();
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,user.getId());
pstmt.setString(2,user.getName());
pstmt.execute();
}catch(SQLException e) {
e.printStackTrace();
}
finally{
DBConnection.closeAll(rs,pstmt,conn);
}
}
//删除public static voiddelete(intid){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="delete from user where id=?";
try{
conn=DBConnection.getConnection();
pstmt=conn.prepareStatement(sql);
pstmt.setObject(1,id);
pstmt.executeUpdate();
System.out.println("删除學生成功!");
}catch(SQLException e) {
e.printStackTrace();
}finally{
DBConnection.closeAll(rs,pstmt,conn);
}
}
//修改public static voidupdate(User user){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="update user set name=? where id=?";
try{
conn=DBConnection.getConnection();
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,user.getName());
pstmt.setInt(2,user.getId());
pstmt.executeUpdate();
System.out.println("修改学生成功");
}catch(SQLException e){
e.printStackTrace();
}
finally{
DBConnection.closeAll(rs,pstmt,conn);
}
}
//查询public staticUsergetUser(intid){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
User user=null;
String sql="select*from user where id=?";
try{
conn=DBConnection.getConnection();
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,id);
rs=pstmt.executeQuery();
rs.next();
user =newUser();
user.setId(id);
user.setName(rs.getString("name"));
}catch(SQLException e) {
e.printStackTrace();
}
finally{
DBConnection.closeAll(rs,pstmt,conn);
}
returnuser;
}
//查询列表public staticListlistUser(){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="select*from user";
List list=null;
try{
conn=DBConnection.getConnection();
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
User user=null;
list=newArrayList();
while(rs.next()){
user=newUser();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
list.add(user);
}
}
catch(SQLException e) {
e.printStackTrace();
}
return list;
}
public static voidmain(String[] args) {
//增加
//User user=new User();
//user.setId(10);
//user.setName("haha");
//crud.add(user);
//删除
//crud.delete(10);
//修改
//User user=new User();
//user.setId(1);
//user.setName("haha");
//crud.update(user);
//查询
//User user =crud.getUser(1);
//System.out.println(user.getName());
//查询列表List list=crud.listUser();
for
(User aaa:list){
System.
out.println(aaa.getName()+""+aaa.getId());
}
}
}
到这里我们就实现了增删改查基本的操作。
自己学习的一个总结,能帮助到人的话就更荣幸啦。另外有错误欢迎大家讨论!!!