• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java JDBC DAO - Insert zamiast nulla daje zero dla PK

0 głosów
61 wizyt
pytanie zadane 20 września 2018 w Java przez konser Nowicjusz (140 p.)

Cześć, jestem zielony, tworze CRUDA w Javie z bazą Oracle. Mam problem z kluczem glownym. W testach na bazie jest cacy - stworzyłem sekwencje i triggera, po dodaniu wiersza z id= null dostaje wiersz z kolejnym numerem. Problem jest w aplikacji.
Aplikacja za każdym razem wpisuje krotke o id = 0 i napisuje ją. Dlaczego ponizsza aplikacja nie działa poprawnie?
Proszę o zerknięcie...

 


//APP

...

public class App {

      public static void main(String[] args) {
         UserDao dao = new UserDao();

         User user = new User();

            Scanner firstNameSc = new Scanner( System.in );
            System.out.println("Please enter new User first name:");
            String firstName = firstNameSc.nextLine();

            Scanner lastNameSc = new Scanner( System.in );
            System.out.println("Last name:");
            String lastName = lastNameSc.nextLine();

         user.setFirstName(firstName);
         user.setLastName(lastName);

            Scanner dataSc = new Scanner( System.in );
            System.out.println("Date of birth (yyyy-mm-dd):");
            String data = dataSc.nextLine();


            try{
            Date dob = new SimpleDateFormat("yyyy-MM-dd"). parse(data);
            user.setDob(dob);
         } catch (ParseException e) {
            e.printStackTrace();
         }


            Scanner emailSc = new Scanner( System.in );
            System.out.println("Enter email:");
            String email = emailSc.nextLine();

         user.setEmail(email);
         dao.updateUser(user);

         ...



//USERDAO.JAVA
...

public class UserDao {

   private Connection connection;

   public UserDao() {
      connection = DbUtil.getConnection();
   }

   public void addUser(User user) {
      try {


         PreparedStatement preparedStatement = connection
               .prepareStatement("insert into users(firstname,lastname,dob,email) values ( ?, ?, ?, ? )");
         // Parameters start with 1
         //insert into ruff(id,name) values(your_sequence.nextval,'name') USERSID_SEQ.NEXTVAL

         // preparedStatement.setInt(1, user.getUserid());
         //preparedStatement.setNull(1, java.sql.Types.INTEGER);
         preparedStatement.setString(1, user.getFirstName());
         preparedStatement.setString(2, user.getLastName());
         preparedStatement.setDate(3, new java.sql.Date(user.getDob().getTime()));
         preparedStatement.setString(4, user.getEmail());
         preparedStatement.executeUpdate();


      } catch (SQLException e) {
         e.printStackTrace();
      }
   }


   public void updateUser(User user) {
      try {
         PreparedStatement preparedStatement = connection
               .prepareStatement("update users set firstname=?, lastname=?, dob=?, email=?" +
                     "where userid=?");
         // Parameters start with 1
         preparedStatement.setString(1, user.getFirstName());
         preparedStatement.setString(2, user.getLastName());
         preparedStatement.setDate(3, new java.sql.Date(user.getDob().getTime()));
         preparedStatement.setString(4, user.getEmail());
         //preparedStatement.setInt(5, user.getUserid());
         preparedStatement.executeUpdate();

      } catch (SQLException e) {
         e.printStackTrace();
      }
   }

...
//user.JAVA

public class User {

   private int userid;
   private String firstName;
   private String lastName;
   private Date dob;
   private String email;
   public int getUserid() {
      return userid;
   }
   public void setUserid(int userid) {
      this.userid = userid;
   }
   public String getFirstName() {
      return firstName;
   }
   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }
   public String getLastName() {
      return lastName;
   }
   public void setLastName(String lastName) {
      this.lastName = lastName;
   }
   public Date getDob() {
      return dob;
   }
   public void setDob(Date dob) {
      this.dob = dob;
   }
   public String getEmail() {
      return email;
   }
   public void setEmail(String email) {
      this.email = email;
   }
   @Override
   public String toString() {
      return "User [userid=" + userid + ", firstName=" + firstName
            + ", lastName=" + lastName + ", dob=" + dob + ", email="
            + email + "]";
   }


}

 

2 odpowiedzi

+2 głosów
odpowiedź 20 września 2018 przez Aisekai Nałogowiec (32,130 p.)
Skąd przypuszczenie, że niezainicjowany "mały" int może być nullem? Jakikolwiek typ prosty nigdy nie będzie nullem.

https://stackoverflow.com/questions/11047276/null-for-primitive-data-types

Natomiast niezainicjowany typ prosty ma swoje defaultowe wartości, dla małego inta to 0.
komentarz 21 września 2018 przez Wiciorny Maniak (66,560 p.)
Po drugie : 0 -> to nie null, jakby wartość była null to w bazie byłoby null ew. NULL pointer poleci.

Ale na prymitywach - > brak wartości to często adres  śmieci,  co przełożenie ma na wartość nieznaną -> zapisanaą np w bazie jako 0 ... coś na bazie "undefined"
0 głosów
odpowiedź 21 września 2018 przez Wiciorny Maniak (66,560 p.)

po dodaniu wiersza z id= null dostaje wiersz z kolejnym numerem. Problem jest w aplikacji. 

a jaki jest schemat bazy ? Oracle- MYSQL domyślnie może mieć kolumne id Auto-increment, więc automatycznie bedzie Ci generować klucze stąd mimo usuwania/dodawania bez  drop base .... będziesz miał ciągle incrementowany klucz  

Podobne pytania

0 głosów
2 odpowiedzi 80 wizyt
pytanie zadane 4 października 2018 w Java przez konser Nowicjusz (140 p.)
0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 28 września 2018 w Java przez pomaraqcz Początkujący (380 p.)
0 głosów
1 odpowiedź 23 wizyt
pytanie zadane 3 czerwca 2018 w Java przez Adrian Paź Obywatel (1,270 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

63,340 zapytań

109,600 odpowiedzi

228,959 komentarzy

44,175 pasjonatów

Przeglądających: 208
Pasjonatów: 16 Gości: 192

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...