MyArchiBook

(Spring – MVC+Hibernate –> Annotation based), MySql , Maven, JSON – Simple Example

with 18 comments

Hi! For the past few days, I have been trying out on Spring – MVC, Hibernate, Maven, MySql and JSON . So I thought, if I could blog about it today with a simple example.

In this post , I have used Hibernate to persist data in the back end  and JSON to display results in the front end.

You can get the below example’s complete source code from my GitHub link here —> https://github.com/AishwaryaThangavelu/Spring-Repository/tree/master/MusicStore.

Let’s take a look at it now.

INFORMATION:

  •  Tool used : NetBeans 7.3
  •  Framework : Spring-mvc-archetype – 3.X
  •  JPA: Hibernate
  •  Build : Maven 2.2
  •  Database Server : MySql
  •  WebApp Server :Tomcat 7

I have considered MusicStore example where I Add Songs and display a list of Songs.

OVERVIEW :

Flow

Flow of Application

STEPS:

1. TO CREATE A TABLE IN MySQL: 

  • Create DB – “CREATE DATABASE MUSIC_STORE;”
  • Create Table 
CREATE TABLE MUSIC_COLLECTIONS(
MC_ID INTEGER(50),
MC_LANGUAGE VARCHAR(50),
MC_TYPE VARCHAR(50),
MC_SONG_NAME VARCHAR(50)
);
  • To give Grant permission for accessing the Database- 

GRANT ALL PRIVILEGES ON MUSIC_STORE.* TO ‘music_store’@’localhost’ IDENTIFIED BY ‘music_store';

Folder Structure

Folder Structure

2. CREATA A NEW SPRING-MVC PROJECT:

I have used Maven coupled Spring-mvc-archetype.

This Spring-mvc-archetype makes me too comfortable providing me the template as such.My duty is to just to work on the main coding part.

3.CREATE A POJO CLASS(Here MusicDetails.java):

@Entity
@Table(name = "MUSIC_COLLECTIONS")
public class MusicDetails implements Serializable {

 @Id
 @Column(name = "MC_ID")
 private Integer musicID;

@Column(name = "MC_LANGUAGE")
 private String musicLanguage;

 @Column(name = "MC_TYPE")
 private String musicType;

 @Column(name = "MC_SONG_NAME")
 private String songName;

public Integer getMusicID() {
 return musicID;
 }

public void setMusicID(Integer musicID) {
 this.musicID = musicID;
 }

public String getMusicLanguage() {
 return musicLanguage;
 }

public void setMusicLanguage(String musicLanguage) {
 this.musicLanguage = musicLanguage;
 }

public String getMusicType() {
 return musicType;
 }

public void setMusicType(String musicType) {
 this.musicType = musicType;
 }

public String getSongName() {
 return songName;
 }

public void setSongName(String songName) {
 this.songName = songName;
 }
}

Now let’s connect our applicationProject with the database.

4. CONFIGURATION:

Hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
                                         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
  <!-- Database connection settings -->
  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="connection.url">jdbc:mysql://localhost:3306/MUSIC_STORE</property>
  <property name="connection.username">music_store</property>
  <property name="connection.password">music_store</property>
  <!-- JDBC connection pool (use the built-in) -->
  <!--<property name="connection.pool_size">20</property>-->
  <property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.idle_test_period">14400</property>
<property name="hibernate.c3p0.timeout">25200</property>
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
  <!-- SQL dialect -->
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <!-- Enable Hibernate's automatic session context management, in this case the session will be close after each transaction! -->
  <property name="current_session_context_class">thread</property>
  <!-- Disable the second-level cache -->
  <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
  <!-- Echo all executed SQL to stdout -->
  <property name="show_sql">true</property>
  <!-- auto create tables -->
  <property name="hbm2ddl.auto">update</property>
  <!-- Mappings -->
  <mapping class="aish.vaishno.musicstore.pojo.MusicDetails"/>
</session-factory>
</hibernate-configuration>
  • line 9 , connection with the particular DB with specific grant permitted username and password is specified
  • In line 32 POJO class maping is specified.

5.HIBERNATE SESSION MANAGER:

public class HibernateSessionManager {

 private static SessionFactory sessionFactory = buildSessionFactory();

 private static SessionFactory buildSessionFactory(){
 try{
   sessionFactory=new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
   return sessionFactory;
 }
 catch(Throwable ex){
   System.err.println("Session Factory Initialization error"+ex);
   throw new ExceptionInInitializerError(ex);
  }
 }

 public static SessionFactory getSessionFactory() {
   return sessionFactory;
 }

 public static void shutdownConnection(){
   getSessionFactory().close();
 }
}

Specify mySql-connector-java.jar and javassist.jar dependency in pom.xml to establish connection with DB

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.15</version>
</dependency>

<dependency>
  <groupId>javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.12.0.GA</version>
</dependency>

6.PERSISTENCE LAYER:

    • MusicStore DAO Interface creation:

Here I have created 2 methods as specified earlier,
 One method:  to add new songs
Second method: to get the List of Songs available

public interface IMusicStoreDao {

   public String addSong(MusicDetails musicDetails);
   public List getSongList();

}
  • Music Store Dao Implementation Class:

Here I have specified @Service inorder to inject it into Service Layer class.

@Service
public class MusicStoreDaoImpl implements IMusicStoreDao{

 @Override
 public String addSong(MusicDetails musicDetails) {
   SessionFactory sessionFactory= HibernateSessionManager.getSessionFactory();
   Session session=sessionFactory.openSession();
   Transaction transaction=session.beginTransaction();
   try{
     transaction.begin();
     session.save(musicDetails);
     session.flush();
     transaction.commit();
     return "Music Details has been entered";
   }catch(HibernateException hb){
     transaction.rollback();
     System.err.println("error"+hb);
     return "Sorry some problem has occured. Try Again";
   }finally{
     session.close();
   }
 }

 @Override
 public List getSongList() {
   SessionFactory sessionFactory=HibernateSessionManager.getSessionFactory();
   Session session=sessionFactory.getCurrentSession();
   Transaction transaction=session.beginTransaction();
   try{
     transaction.begin();
     List songList=session.createQuery("from MusicDetails").list();
     return songList;
   }finally{
     session.close();
   }
  }
 }

7.SERVICE LAYER:

  •     Service Layer Interface Creation :
public interface IMusicStoreService {
  public String addSong(MusicDetails musicDetails);
  public List getSongList();
}
  •    Music Service Implemetation Class Creation :

I have annotated this class with @Service because later , in the controller I will be Injecting this class.You can see that IMusicStoreDao is Autowired which means I have injected it in this class and that is why I specified @Service annotation in MusicStoreDao class.

@Service
public class MusicStoreServiceImpl implements IMusicStoreService{

 @Autowired
 private IMusicStoreDao musicStoreDao;

@Override
 public String addSong(MusicDetails musicDetails) {
   return musicStoreDao.addSong(musicDetails);
 }

@Override
 public List getSongList() {
    return musicStoreDao.getSongList();
 }
 }

I have also specified @ComponentScan in Configuration class to scan through the packages containing the respective classes with @Service annotation.

8.PRESENTATION LAYER:

Controller:

I have Autowired IMusicStoreService class

@Controller
public class HomeController {

@Autowired
 private IMusicStoreService musicStoreService;

 @RequestMapping(value="/")
 public ModelAndView test(HttpServletResponse response) throws IOException{
    return new ModelAndView("home","musicDetForm",new MusicDetails());
 }

 @RequestMapping(value="AddSong",method = RequestMethod.POST)
 @ResponseBody
 public String addSong(@ModelAttribute("musicDetForm") MusicDetails musicDetails){
    return musicStoreService.addSong(musicDetails);
 }

 @RequestMapping(value="SongList/",method = RequestMethod.GET)
 @ResponseBody
 public List<MusicDetails> getSongList(){
    return musicStoreService.getSongList();
 }
}

RUNTIME DEPENDENCY JAR’S TO BE ADDED:
Below are few runtime dependencies to be added in pom.xml to avoid Logging Factory and Load Class error.

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>1.6.1</version>
   <scope>runtime</scope>
 </dependency>
 <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.1</version>
    <scope>runtime</scope>
 </dependency>
 <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    <scope>runtime</scope>
</dependency>

RESULTS:

1.ADD SONG :  I created the form using Simple-Spring Form Handling.You can find details about it in this link, refer to

http://aishwaryavaishno.wordpress.com/2013/06/22/simple-form-handling-and-performing-dependency-injection-in-spring-mvc-framework-using-netbeans/ 

and I have displayed the result .

AddSongResult

AddSongResult

MusicStoreForm

MusicStoreForm

2.SONG LIST DISPLAY :Here I have used JSON format to display result.
JSON:

  •   JSON(Java Script Object Notation) is a data transfer format,used for exchanging data between client and server-side application.
  • It is much like XML. No, actually it is easier than XML bcoz it is easy to understand, language independent and has parsers available for most of the languages(one eg: eval()).
  • It provides me the flexibility of writing just one application and runnning it on any type of application.

For this application, all that u need to know about JSON is, just

  • add the below Jackson Library dependency into the pom.xml
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
</dependency>
 
  • Specify @ResponseBody JSON-REST Service.
  • Specify the Mapping properly in the Controller .

The “REST” JSON will take care.

Now when you hit the URL link, the JSON result will be as below for SongList.
SongList

That’s it.. :-)

Hope it’s informative.. Have a great day !!!!

About these ads

Written by thangaveluaishwarya

July 12, 2013 at 10:09 AM

18 Responses

Subscribe to comments with RSS.

  1. try with @RequestParam(“musicDetForm”) instead of @ModelAttribute(“musicDetForm”)

    Mandrake

    July 12, 2013 at 10:51 AM

  2. Reblogged this on Researcher's Blog and commented:
    (Spring – MVC+Hibernate –> Annotation based), MySql , Maven, JSON – Simple Example

    Re-Searcher...

    July 12, 2013 at 12:56 PM

    • Good

      Amar

      July 12, 2013 at 7:37 PM

      • Very nice
        Easy to understand

        mary

        July 12, 2013 at 10:47 PM

  3. followed all steps and works as you explained. thank you

    Janarthan

    July 13, 2013 at 10:08 AM

  4. Following this very actively. Good You are talking about every important topic.what is next?

    Ravi

    July 14, 2013 at 8:46 AM

  5. @All : Hi… I just wanted to add on to my above post..

    How to CHECK and CONFIRM,if the objects that I GET/POST, is in JSON format????

    For this run the Inspect Element –>Network —> Headers in your browser, then hit the respective URL Link. You will get the,
    Status code – Success/Failure,
    Request Header – Format of Request from Client Side ,
    Response Header- Format of Response from Server Side .

    In the above example, I have demonstrated only on, how to GET a JSON object.
    Check out the below link, to know in detail.

    http://wp.me/a3vM7M-5I – Song Details with Request method – GET

    Later, in my future blogs, I will write on JSON – POST and various related stuffs.

    thangaveluaishwarya

    July 15, 2013 at 7:31 AM

  6. Very good effort taken and precise steps illustrated with an example makes it easy to understand . Next try Spring data JPA and try to come up with a comparison between ( Spring JPA + Hibernate ) and Spring Data JPA . Keep it going … good work :)

    rajakumartu

    July 15, 2013 at 2:37 PM

  7. Very well written Spring MVC + Hibernate example using Maven. Good Job.

    ravinforu

    July 17, 2013 at 3:54 PM

  8. SutoCom

    July 19, 2013 at 7:24 PM

  9. following all your topics. very clean and i also shared vit students.
    remarkable

    Hannah

    August 17, 2013 at 8:24 PM

  10. I didn’t see spring site. I used your site and implemented spring. You are very nice

    herry

    August 18, 2013 at 6:46 PM

  11. I am very confident that is one of the best blog I have come seen. All small details have been explained and demonstrated very nicely. I am also seeing that you have provided the git link in other blogs too. You also contributing to open source projects? I have bookmarked the site as my daily read.

    Reader

    September 3, 2013 at 1:56 PM

    • You also contributing to open source projects? I see you started groovy also. Any specific thing behind for not using java?

      Reader

      September 3, 2013 at 3:37 PM

  12. Came to know that One of my girls is writing a really famous blog. I am impressed and Proud. Really good job !

    Giada Bono

    September 8, 2013 at 10:21 PM

    • @Giada Bono: Thank you very much Mam. This comment means a lot to me .

      thangaveluaishwarya

      September 10, 2013 at 12:42 PM

      • You explain things in the right way. I see all your blogs you suggest solutions and take a east example. i will propose this as the best understood concept and written blog.Already have 4,031 hits which means every person seeing is benefited. you will come a long way and write more on spring using different components like web.

        Mahesh

        September 11, 2013 at 8:25 PM

  13. Aishu , Cool one :) will be really good for the beginners

    Srividhya Ramamoorthy

    June 20, 2014 at 11:57 AM


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: