Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

 

Το παρακάτω πρόβλημα έχει επιλυθεί:

Καλισπέρα έχω κάνει 2 κλάσεις:

 

Την User.java που που λέει τι ενέργειες θα κάνει ένας Χρήστης:

import java.sql.*;
import org.apache.commons.codec.digest.DigestUtils;

public class User 
{
	
	/**
	 * A Static variable for Male User
	 */
	public static String GENDER_MALE="MALE";
	
	/**
	 * A Static variable for Female User
	 */
	public static String GENDER_FEMALE="FEMALE";
	
	/**
	 * A static Variable for Udefined User
	 */
	public static String GENDER_UNDEFINED="UNDEFINED";
	
	
	/**
	 * Connection to mysql
	 */
	private Connection conn=null;
	
	/**
	 * Statement to login
	 */
	private PreparedStatement login=null;
	
	/**
	 * Statement to register a user
	 */
	private PreparedStatement register=null;
	
	/**
	 * check if a username already exists
	 */
	private PreparedStatement usernameExists;
	
	/**
	 * Updates A user
	 */
	private PreparedStatement updateUser;
	
	/**
	 * The userid
	 */
	private long userID=-1;
	/**
	 * The username
	 */
	private String username="";
	
	/**
	 * The name
	 */
	private String name="";
	
	/**
	 * The User's Surname
	 */
	private String surname="";
	
	/**
	 * Tells if it is male or not
	 */
	private String gender="UNDEFINED";
	
	/**
	 * The User Description
	 */
	private String descritpion="";
	
	/**
	 * User's email
	 */
	private String email="";
	
	/**
	 * Stores the Users Nationality
	 */
	private String ipikoos="";
	
	/**
	 * Stores the place of birth
	 */
	private String birthLocation="";
	
	/**
	 * Stores the place of living
	 */
	private String liveLocation="";
	
	/**
	 *Tells us if the user sucessfully loged in
	 */
	private boolean logedin=false;
	
	/**
	 * Date of birth
	 */
	private java.util.Date birthDate=null;
	
	/**
	 * 
	 * @throws Exception
	 */
	public User() throws Exception 
	{
		Class.forName("com.mysql.jdbc.Driver").newInstance();
	}
	
	/**
	 * Inits the connection to mysql
	 */
	public void makeConnection()
	{
		try
		{

			//Class.forName("com.mysql.jdbc.Driver");

			conn= DriverManager.getConnection("jdbc:mysql:localhost/bio?useUnicode=true&characterEncoding=UTF-8","root","root");

			login=conn.prepareStatement("SELECT `users_id`,`username`,`name`,`surname`,`email`,`male`,`description`,`ipikoos`,`birthLocation`,`liveLocation`,`birthDate` FROM users WHERE username=? and password=?");
			register=conn.prepareStatement("INSERT INTO users(`username`,`password`,`name`,`surname`,`email`,`male`,`ipikoos`,`description`,`birthLocation`,`liveLocation`,`birthDate`) VALUES(?,?,?,?,?,?,?,?,?,?,?)");
			usernameExists=conn.prepareStatement("SELECT COUNT(*) as count WHERE username=?");
			updateUser=conn.prepareStatement("UPDATE users SET `password`=? `name`=?, `surname`=?, `male`=?, `description`=?, `ipikoos`=?, `birthLocation`=? , `birthDate`=? WHERE userid=?");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * Closes the connection to mysql
	 * @throws SQLException 
	 */
	private void close() throws SQLException
	{
		login.close();
		register.close();
		usernameExists.close();
		updateUser.close();
		conn.close();
		conn=null;
	}
	
	/**
	 *User to authenticate a user into a system
	 * @param username
	 * @param password
	 * @return true if login sucessfull
	 */
	public boolean ulogin(String username, String password)
	{
		try
		{
			if(conn==null || login==null)
			{
				makeConnection();
			}
		
			//Hashing password
			password=makePassword(password);
			
			//Binding parameters
			login.setString(1,username);
			login.setString(2,password);
			
			ResultSet userInfo=login.executeQuery();
			
			if(userInfo.next())
			{
				userID=userInfo.getLong("users_id");
				this.username=userInfo.getString("username");
				this.name=userInfo.getString("name");
				this.surname=userInfo.getString("surname");
				this.email=userInfo.getString("email");
				this.gender=(userInfo.getInt("male")==1)?"ΑΝΤΡΑΣ":(userInfo.wasNull())?" ":"ΓΥΝΑΙΚΑ";
				this.descritpion=userInfo.getString("description");
				
				logedin=true;
			}
			else
			{
				return false;
			}
			
			close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		return logedin;
	}
	
	/**
	 * Hashes the password
	 * @param password The password to hash
	 */
	private String makePassword(String password)
	{
		return DigestUtils.sha256Hex(password);
	}
	
	/**
	 * Registers A user to system
	 */
	public long register(String name, 
						String surname,
						String username,
						String password, 
						String email, 
						String gender,
						String description, 
						String ipikoos, 
						String liveLocation, 
						String birthLocation, 
						java.util.Date birthDate)
	{
		if(conn==null)
		{
			makeConnection();
		}
		
		if(name!=null && !name.isEmpty() && surname!=null && !surname.isEmpty() && username!=null && !username.isEmpty() && password!=null && !password.isEmpty() && email!=null && !email.isEmpty() && ipikoos!=null && !ipikoos.isEmpty())
		{
		
			if(!usernameExists(username))
			{
				gender=(gender==null || gender.isEmpty())?GENDER_UNDEFINED:gender;
				description=(description==null)?"":description;
				liveLocation=(liveLocation==null)?"":liveLocation;
				birthLocation=(birthLocation==null)?"":liveLocation;
				
				long birthdateTimeStamp=(birthDate==null)?0:birthDate.getTime();
				
				this.birthDate=new Date(birthdateTimeStamp);
				
				//Making the password into a correct form
				password=makePassword(password);
				
				try
				{
				 
					/*
					 * Order of Fields
					 * `username`,
					 * `password`,
					 * `name`,
					 * `surname`,
					 * `email`,
					 * `male`,
					 * `ipikoos`,
					 * `description`,
					 * `birthLocation`,
					 * `liveLocation`,
					 * `birthDate`
					*/
					
					conn.setAutoCommit(false);
					
					register.setString(1,username);
					this.username=username;
					
					register.setString(2,password);
					
					register.setString(3,name);
					this.name=name;
					register.setString(4,surname);
					this.surname=surname;
					register.setString(5,email);
					this.email=email;
					register.setString(6,gender);
					this.gender=gender;
					register.setString(7, ipikoos);
					
					this.ipikoos=ipikoos;
					register.setString(8, liveLocation);
					this.liveLocation=liveLocation;
					register.setString(9, birthLocation);
					this.birthLocation=birthLocation;
					
					register.setLong(10,birthdateTimeStamp);
					
					register.executeUpdate();
					conn.commit();
					
					//Getting Last Insert ID
					long id=-1;
					ResultSet rs = register.getGeneratedKeys();
			        if (rs.next())
			        {
			            id=rs.getLong(1);
			        }
						
					this.userID=id;

					close();
					
					return id;
				}
				catch(Exception e)
				{
					e.printStackTrace();
					try
					{
						conn.rollback();
					}
					catch(Exception z)
					{
						z.printStackTrace();
					}
				}
			}
		}
		return -1;
	}
	
	/**
	 * Check if a Username Already Exists
	 */
	private boolean usernameExists(String username)
	{
		boolean returnVal=false;
		try
		{
			if(username!=null && username.isEmpty())
			{
				usernameExists.setString(1,username);
				usernameExists.execute();
				ResultSet rs = usernameExists.getResultSet();
				if(rs.next())
				{
					if(rs.getLong(1)>0)
					{
						returnVal=true;
					}
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		return returnVal;

	}
	
	public boolean updateUser(long userID,
						String name, 
						String surname,
						String password, 
						String email, 
						String gender,
						String description, 
						String ipikoos, 
						String liveLocation, 
						String birthLocation, 
						java.util.Date birthDate)
	{
		if(conn==null)
		{
			makeConnection();
		}
		
		gender=(gender==null || gender.isEmpty())?GENDER_UNDEFINED:gender;
		description=(description==null)?"":description;
		liveLocation=(liveLocation==null)?"":liveLocation;
		birthLocation=(birthLocation==null)?"":liveLocation;
		
		long birthdateTimeStamp=(birthDate==null)?0:birthDate.getTime();
		
		this.birthDate=new Date(birthdateTimeStamp);
		
		try
		{
		
			conn.setAutoCommit(false);
			
			updateUser.setString(1,password);
			
			updateUser.setString(2,name);
			this.name=name;
			
			updateUser.setString(3,surname);
			this.surname=surname;
			
			updateUser.setString(4,email);
			this.email=email;
			
			updateUser.setString(5,gender);
			this.gender=gender;
			
			updateUser.setString(6, ipikoos);
		
			this.ipikoos=ipikoos;
			updateUser.setString(7, liveLocation);
			
			this.liveLocation=liveLocation;
			register.setString(8, birthLocation);
			this.birthLocation=birthLocation;
		
			updateUser.setLong(9,birthdateTimeStamp);
			
			updateUser.setLong(10,userID);
			
			register.executeUpdate();
			
			conn.commit();
			conn.setAutoCommit(true);
			conn.close();
			
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			try
			{
				conn.rollback();
			}
			catch(Exception z)
			{
				z.printStackTrace();
			}
		}
		return false;
	}
	
}

Και μια Main.java για να την δοκιμάζω αν παίζει:

import java.sql.*;
import java.util.Date;

public class Main 
{
	public static void main(String args[]) 
	{
		try
		{
			System.out.println("Hello");
			
			User u= new User();
			u.register("Δημήτριος","Δεσύλλας","ddesillas","x@8hEG~z","[email protected]",User.GENDER_MALE,"Δείγμα Περιγραφής","Ελληνική","Αχαρνές Αττική Ελλάδα","Αμαρούσιο Αττικής",new Date(1991,8,29));
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

Όπως βλέπεται και στην φωτό έχω βάλει και 2 εξωτερικές βιβλιοθήκες προκειμένου να παίξει:

  1. Mysql JDBC Driver
  2. Apache Commons Codec

Αλλά Το μόνο που παίρνω είναι αυτά τα errors:

Hello
java.sql.SQLException: No suitable driver found for jdbc:mysql:localhost/bio?useUnicode=true&characterEncoding=UTF-8
	at java.sql.DriverManager.getConnection(DriverManager.java:596)
	at java.sql.DriverManager.getConnection(DriverManager.java:215)
	at User.makeConnection(User.java:126)
	at User.register(User.java:230)
	at Main.main(Main.java:13)
java.lang.NullPointerException
	at User.register(User.java:268)
	at Main.main(Main.java:13)
java.lang.NullPointerException
	at User.register(User.java:315)
	at Main.main(Main.java:13)


Άρα για κάποιο λόγο δεν βλέπει τον Driver. ΚΑΙ ΔΕΝ ΞΕΡΩ ΓΙΑΤΙ εφόσον το έχω βάλει σαν εξωτερική βιβλιοθήκη.

 

Η ανάπτυξη γίνεται σε Elcipce και σε Ubuntu 12.04.

post-141042-0-18964500-1382020324_thumb.png

Επεξ/σία από PC_MAGAS
Δημοσ.

Απ'ότι βλέπω το mysql url sou είναι

 

jdbc:mysql:localhost/bio?useUnicode=true&characterEncoding=UTF-8

 

ενώ θα έπρεπε να είναι κανονικά:

 

jdbc:mysql://localhost/bio?useUnicode=true&characterEncoding=UTF-8

 

Επίσης το Class.forName() το έχεις commented out, αν και η Java 7 υποτίθεται το βρίσκει αυτόματα αν είναι στο build path.

 

Τέλος μια παρατήρηση για τα comments. Υπάρχουν καλά και κακά comments. 

 

Όταν έχεις μια μεταβλητή τύπου

private String userInfo;

απο μόνη της δηλώνει τι ακριβώς είναι. 

 

Όταν εσύ απο πάνω βάζεις

/**
* User Info
*/

Χρησιμοποιείς 3 ολόκληρες γραμμές αχρείαστου κώδικα (αφού το όνομα της μεταβλητής απο μόνη της εξηγεί τί είναι) και καταλήγεις απλά σε δυσανάγνωστο κώδικα. Comments όπου χρειάζονται μόνο...

Δημοσ.

Απ'ότι βλέπω το mysql url sou είναι

 

jdbc:mysql:localhost/bio?useUnicode=true&characterEncoding=UTF-8

 

ενώ θα έπρεπε να είναι κανονικά:

 

jdbc:mysql://localhost/bio?useUnicode=true&characterEncoding=UTF-8

 

Επίσης το Class.forName() το έχεις commented out, αν και η Java 7 υποτίθεται το βρίσκει αυτόματα αν είναι στο build path.

 

Τέλος μια παρατήρηση για τα comments. Υπάρχουν καλά και κακά comments. 

 

Όταν έχεις μια μεταβλητή τύπου

private String userInfo;

απο μόνη της δηλώνει τι ακριβώς είναι. 

 

Όταν εσύ απο πάνω βάζεις

/**
* User Info
*/

Χρησιμοποιείς 3 ολόκληρες γραμμές αχρείαστου κώδικα (αφού το όνομα της μεταβλητής απο μόνη της εξηγεί τί είναι) και καταλήγεις απλά σε δυσανάγνωστο κώδικα. Comments όπου χρειάζονται μόνο...

Τα comments τα έχω βάλει για το Javadoc.

 

Εξ ου και το /** πιστεύω ότι είναι ust να υπάρχει ένα καλό και πλήρες javadoc.

Δημοσ.

Τα comments τα έχω βάλει για το Javadoc.

 

Εξ ου και το /** πιστεύω ότι είναι ust να υπάρχει ένα καλό και πλήρες javadoc.

 

Σκοπός του JavaDoc είναι να μπορεί ο developer που χρησιμοποιεί το class σου να μπορεί να δει τι κάνει το κάθε method/variable.

 

Δεν θα μπορεί να χρησιμοποιήσει οτιδήποτε είναι private άρα δεν υπάρχει λόγος να υπάρχει στο JavaDoc.  Γι'αυτό στο JavaDoc συνηθίζεται να γράφονται μόνο τα public variables/methods. 

 

Ίσα ίσα που τον γεμίζει με variables/methods που θα ψάχνει να τα κάνει access και δεν θα μπορεί - άρα θα μπερδεύεται.

 

Απο την άλλη φαίνονται τα getters/setters τα οποία το τί κάνουν είναι προφανές. Εκεί αν θέλεις μπορείς να βάλεις javadoc comment.

 

Άν πάντως επιμένεις ότι τα θέλεις, καλό θα είναι να τα περιορίσεις σε μία γραμμή του στυλ /** comment */

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...