jjzzggkk
jjzzggkk
采纳率80%
2016-06-03 03:27 阅读 2.2k

有个jdbc连接数据库的问题望大家帮一下忙

5

我是根据教程利用odbc做驱动通过jdbc连接sqlserver2008数据库的,数据表已经建立好,odbc加载驱动是成功的,数据库也连接上了,编写的java代码也没有报错,但是就是不能正常运行添加数据,提示是空异常,纠结了好久没能解决,所以在此拜托各位帮个忙解决一下。在此,表示感谢。以下是代码:
用户类
package odbc;

public class User {
private int id;
private String userName;
private String passWord;
private int roleId;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getPassWord() {
    return passWord;
}

public void setPassWord(String passWord) {
    this.passWord = passWord;
}

public int getRoleId() {
    return roleId;
}

public void setRoleId(int roleId) {
    this.roleId = roleId;
}

public User(){

}

public User(int id, String userName, String passWord, int roleId) {
    super();
    this.id = id;
    this.userName = userName;
    this.passWord = passWord;
    this.roleId = roleId;
}

@Override
public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", passWord="
            + passWord + ", roleId=" + roleId + "]";
}

}
main主函数
package odbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class demo01 {
private Connection conn;
private Statement stat;
public static void main(String[] args) {
new demo01().startup();

}
private  void startup(){
    init();
    //添加一个用户
    User user = new User(1, "zhang", "111", 1);
    addUser(user);

}
private void addUser(User user) {
    String sql = String.format("insert into T_User values('%s','%s',%s)",
            user.getUserName(), user.getPassWord(), user.getRoleId());
    try {
        stat = conn.createStatement();
        int result = stat.executeUpdate(sql);

        if (result > 0) {
            System.out.println("添加用户成功!");
        } else {
            System.out.println("添加用户失败!");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            stat.close();
            conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
private void init(){
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        System.out.println("加载驱动成功");
        //该语句冒号前面是固定的,冒号后面是自己定义的数据源
        String url = "jdbc:odbc:bookshopsource";        
        Connection conn = DriverManager.getConnection(url);
       System.out.println("数据库连接成功");
    } catch (ClassNotFoundException e) {
        System.out.println("加载驱动失败");
        return;
    }catch (SQLException e) {
        System.out.println("数据库连接失败");
        return;
    }
}

}
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

15条回答 默认 最新

  • donggua3694857 GrayHJX 2016-06-03 06:07

    Connection conn = DriverManager.getConnection(url); 我觉得问题应该出现在这里。你在init方法作用域里面赋值conn,出去后conn出现了空指针,你如果是要赋值给全局变量private Connection conn就直接这么写就完了conn = DriverManager.getConnection(url);

    点赞 2 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2016-06-03 03:38

    String sql = String.format("insert into T_User values('%s','%s',%s)",
    user.getUserName(), user.getPassWord(), user.getRoleId());
    user的这几个字段都初始化了么

    点赞 1 评论 复制链接分享
  • sinat_30293905 ArryL 2016-06-03 03:45

    出错的代码是在哪一行

    点赞 评论 复制链接分享
  • scl666 scl666 2016-06-03 04:01

    你getConnection(URL,username,password)???不是这样吗?

    点赞 评论 复制链接分享
  • iMap1e iMap1e 2016-06-03 04:31

    楼主为什么不用连接池呢?

    点赞 评论 复制链接分享
  • vividy 关门开门 2016-06-03 06:24

    代码不完整,无法准确判断。出错应该在
    stat = conn.createStatement();
    int result = stat.executeUpdate(sql);
    这2行。
    看一下conn和stat哪个是null的。
    conn是null的,就是getConnect有问题。
    stat是null的,就是sql和数据库定义不一致。

    点赞 评论 复制链接分享
  • u012189526 咹靜 2016-06-03 08:50

    @GrayHJX 说的应该是对的 Connection conn = DriverManager.getConnection(url); 这一行改成 conn = DriverManager.getConnection(url); 你试试

    点赞 评论 复制链接分享
  • qq_33045983 qq_33045983 2016-06-03 11:41

    为什么要用%$这中方式,直接用?不是可以,还可以防止SQL注入

    点赞 评论 复制链接分享
  • mengqingyu555 暮云收尽溢清寒 2016-06-03 13:44

    demo01.java的第40行报错,你把40行给贴出了,就知道为什么了

    点赞 评论 复制链接分享
  • u012156686 __sun_ 2016-06-06 00:33

    去掉init()函数里面定义的connection,直接使用该类的私有成员变量conn。因为你在init()方法里面使用 Connection conn = DriverManager.getConnection(url),重新定义了一个conn变量。这个导致你的类里面的conn对象没有初始化。所以在后面用的时候产生空指针异常。修改方法就是去掉我前面写的那行代码里面的Connection就OK。

    点赞 评论 复制链接分享
  • aline200 aline200 2016-06-07 01:32

    你首先定义了一个全局的变量 private Connection conn;
    创建连接的时候有定义了一个局部变量 Connection conn = DriverManager.getConnection(url);

    可你最终用到的还是全局变量 stat = conn.createStatement(); 当然给个空指针了
    把那个局部变量去掉,用全局变量试试 conn = DriverManager.getConnection(url);

    点赞 评论 复制链接分享
  • qq_18130629 小火柴YL 2016-06-13 16:38

    Connection conn = DriverManager.getConnection(url); conn是局部的,addUser()方法是不能获取的!

    点赞 评论 复制链接分享
  • zhaocp37 快乐先生 2016-06-24 09:01

    你的conn是个局部变量,把这个定义成全局变量就可以了。

    点赞 评论 复制链接分享
  • Marksinoberg 泰 戈 尔 2016-09-21 00:55
     init();
        //添加一个用户
        User user = new User(1, "zhang", "111", 1);
        addUser(user);
    
    

    改成

     init();
        //添加一个用户
        User user = new User(1, "zhang", "111", 1);
        this.addUser(user);
    
    

    试试呗。

    点赞 评论 复制链接分享
  • qq_28051453 南瓜灯cc 2016-10-24 09:33
    点赞 评论 复制链接分享

相关推荐