• 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

Object Storage Arubacloud
0 głosów
163 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 (42,190 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 Ekspert (269,710 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 Ekspert (269,710 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 244 wizyt
pytanie zadane 4 października 2018 w Java przez konser Nowicjusz (140 p.)
0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 8 maja 2020 w Java przez warior1 Użytkownik (520 p.)
0 głosów
1 odpowiedź 13,681 wizyt
pytanie zadane 28 września 2018 w Java przez pomaraqcz Początkujący (380 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...