Repository: sivaprasadreddy/Java-Persistence-with-MyBatis3 Branch: master Commit: 29580704e196 Files: 126 Total size: 177.1 KB Directory structure: gitextract_ol89q38l/ ├── .gitignore ├── README.md ├── chapter01/ │ ├── README.txt │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── mybatis3/ │ │ │ ├── domain/ │ │ │ │ └── Student.java │ │ │ ├── mappers/ │ │ │ │ └── StudentMapper.java │ │ │ ├── services/ │ │ │ │ ├── JdbcStudentService.java │ │ │ │ └── StudentService.java │ │ │ └── util/ │ │ │ └── MyBatisSqlSessionFactory.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── com/ │ │ │ └── mybatis3/ │ │ │ └── mappers/ │ │ │ └── StudentMapper.xml │ │ ├── log4j.properties │ │ ├── mybatis-config.xml │ │ └── sql/ │ │ ├── create_tables.sql │ │ ├── drop_tables.sql │ │ └── sample_data.sql │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── mybatis3/ │ │ └── services/ │ │ ├── StudentServiceTest.java │ │ └── TestDataPopulator.java │ └── resources/ │ └── log4j.properties ├── chapter02/ │ ├── README.txt │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── mybatis3/ │ │ │ ├── domain/ │ │ │ │ ├── PhoneNumber.java │ │ │ │ └── Student.java │ │ │ ├── mappers/ │ │ │ │ └── StudentMapper.java │ │ │ ├── services/ │ │ │ │ └── StudentService.java │ │ │ ├── typehandlers/ │ │ │ │ └── PhoneTypeHandler.java │ │ │ └── util/ │ │ │ ├── DataSourceFactory.java │ │ │ └── MyBatisUtil.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── com/ │ │ │ └── mybatis3/ │ │ │ └── mappers/ │ │ │ └── StudentMapper.xml │ │ ├── full-mybatis-config.xml │ │ ├── log4j.properties │ │ ├── mybatis-config.xml │ │ └── sql/ │ │ ├── create_tables.sql │ │ ├── drop_tables.sql │ │ └── sample_data.sql │ └── test/ │ └── java/ │ └── com/ │ └── mybatis3/ │ └── services/ │ ├── StudentServiceTest.java │ └── TestDataPopulator.java ├── chapter03/ │ ├── README.txt │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── mybatis3/ │ │ │ ├── domain/ │ │ │ │ ├── Address.java │ │ │ │ ├── Course.java │ │ │ │ ├── PhoneNumber.java │ │ │ │ ├── Student.java │ │ │ │ └── Tutor.java │ │ │ ├── mappers/ │ │ │ │ ├── AddressMapper.java │ │ │ │ ├── CourseMapper.java │ │ │ │ ├── StudentMapper.java │ │ │ │ └── TutorMapper.java │ │ │ ├── services/ │ │ │ │ ├── CourseService.java │ │ │ │ ├── StudentService.java │ │ │ │ └── TutorService.java │ │ │ ├── typehandlers/ │ │ │ │ └── PhoneTypeHandler.java │ │ │ └── util/ │ │ │ └── MyBatisUtil.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── com/ │ │ │ └── mybatis3/ │ │ │ └── mappers/ │ │ │ ├── AddressMapper.xml │ │ │ ├── CourseMapper.xml │ │ │ ├── StudentMapper.xml │ │ │ └── TutorMapper.xml │ │ ├── log4j.properties │ │ ├── mybatis-config.xml │ │ └── sql/ │ │ ├── create_tables.sql │ │ ├── drop_tables.sql │ │ └── sample_data.sql │ └── test/ │ └── java/ │ └── com/ │ └── mybatis3/ │ └── services/ │ ├── CourseServiceTest.java │ ├── StudentServiceTest.java │ ├── TestDataPopulator.java │ └── TutorServiceTest.java ├── chapter04/ │ ├── README.txt │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── mybatis3/ │ │ │ ├── domain/ │ │ │ │ ├── Address.java │ │ │ │ ├── Course.java │ │ │ │ ├── PhoneNumber.java │ │ │ │ ├── Student.java │ │ │ │ └── Tutor.java │ │ │ ├── mappers/ │ │ │ │ ├── AddressMapper.java │ │ │ │ ├── StudentMapper.java │ │ │ │ └── TutorMapper.java │ │ │ ├── services/ │ │ │ │ ├── StudentService.java │ │ │ │ └── TutorService.java │ │ │ ├── sqlproviders/ │ │ │ │ └── TutorDynaSqlProvider.java │ │ │ ├── typehandlers/ │ │ │ │ └── PhoneTypeHandler.java │ │ │ └── util/ │ │ │ └── MyBatisUtil.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── com/ │ │ │ └── mybatis3/ │ │ │ └── mappers/ │ │ │ ├── StudentMapper.xml │ │ │ └── TutorMapper.xml │ │ ├── log4j.properties │ │ ├── mybatis-config.xml │ │ └── sql/ │ │ ├── create_tables.sql │ │ ├── drop_tables.sql │ │ └── sample_data.sql │ └── test/ │ └── java/ │ └── com/ │ └── mybatis3/ │ └── services/ │ ├── StudentServiceTest.java │ ├── TestDataPopulator.java │ └── TutorServiceTest.java ├── chapter05/ │ ├── README.txt │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── mybatis3/ │ │ │ ├── config/ │ │ │ │ └── AppConfig.java │ │ │ ├── domain/ │ │ │ │ ├── Address.java │ │ │ │ ├── Course.java │ │ │ │ ├── PhoneNumber.java │ │ │ │ ├── Student.java │ │ │ │ └── Tutor.java │ │ │ ├── mappers/ │ │ │ │ ├── AddressMapper.java │ │ │ │ ├── StudentMapper.java │ │ │ │ └── TutorMapper.java │ │ │ ├── services/ │ │ │ │ ├── StudentService.java │ │ │ │ └── TutorService.java │ │ │ ├── sqlproviders/ │ │ │ │ └── TutorDynaSqlProvider.java │ │ │ ├── typehandlers/ │ │ │ │ └── PhoneTypeHandler.java │ │ │ └── util/ │ │ │ └── MyBatisUtil.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── applicationContext.xml │ │ ├── com/ │ │ │ └── mybatis3/ │ │ │ └── mappers/ │ │ │ ├── StudentMapper.xml │ │ │ └── TutorMapper.xml │ │ ├── log4j.properties │ │ └── sql/ │ │ ├── create_tables.sql │ │ ├── drop_tables.sql │ │ └── sample_data.sql │ └── test/ │ └── java/ │ └── com/ │ └── mybatis3/ │ └── services/ │ ├── StudentServiceTest.java │ ├── TestDataPopulator.java │ └── TutorServiceTest.java └── elearning/ ├── README.txt ├── pom.xml └── src/ └── main/ ├── resources/ │ └── log4j.properties └── webapp/ ├── WEB-INF/ │ └── web.xml └── index.jsp ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .project .classpath .settings .springBeans target bin build *.class # Package Files # *.jar *.war *.ear ================================================ FILE: README.md ================================================ Java Persistence with MyBatis3 Book Sample Code ======================== 1. Getting started with MyBatis 2. Bootstrapping MyBatis 3. SQL Mappers using XML 4. SQL Mappers using Annotations 5. Integration with Spring ================================================ FILE: chapter01/README.txt ================================================ Chapter 1: Getting started with MyBatis ======================================= This module, chapter01, is a maven based java project with MyBatis configured. How to Run: 1. Create MySQL Database tables using scripts in src/main/resources/sql folder. 2. Configure Database Connection properties like hostname, username and password in src/main/resources/application.properties file. 3. Run StudentServiceTest JUnit Test class. ================================================ FILE: chapter01/pom.xml ================================================ 4.0.0 com.mybatis3 chapter01 0.0.1 jar chapter01 http://www.mybatis.org MyBatis Book Chapter 01 UTF-8 1.6 4.11 1.7.5 1.2.17 3.2.2 5.1.21 2.3.2 ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin} ${java.version} ${java.version} ${project.build.sourceEncoding} junit junit ${junit.version} test org.mybatis mybatis ${mybatis.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} runtime log4j log4j ${log4j.version} runtime mysql mysql-connector-java ${mysql.version} runtime ================================================ FILE: chapter01/src/main/java/com/mybatis3/domain/Student.java ================================================ package com.mybatis3.domain; import java.util.Date; /** * @author Siva * */ public class Student { private Integer studId; private String name; private String email; private Date dob; public Student() { } public Student(Integer studId) { this.studId = studId; } public Student(Integer studId, String name, String email, Date dob) { this.studId = studId; this.name = name; this.email = email; this.dob = dob; } @Override public String toString() { return "Student [studId=" + studId + ", name=" + name + ", email=" + email + ", dob=" + dob + "]"; } public Integer getStudId() { return studId; } public void setStudId(Integer studId) { this.studId = studId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getDob() { return dob; } public void setDob(Date dob) { this.dob = dob; } } ================================================ FILE: chapter01/src/main/java/com/mybatis3/mappers/StudentMapper.java ================================================ package com.mybatis3.mappers; import java.util.List; import com.mybatis3.domain.Student; /** * @author Siva * */ public interface StudentMapper { List findAllStudents(); Student findStudentById(Integer id); void insertStudent(Student student); void updateStudent(Student student); } ================================================ FILE: chapter01/src/main/java/com/mybatis3/services/JdbcStudentService.java ================================================ package com.mybatis3.services; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; import com.mybatis3.domain.Student; /** * @author Siva * */ public class JdbcStudentService { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/elearning"; private static final String USERNAME = "root"; private static final String PASSWORD = "admin"; public static void main(String[] args) { JdbcStudentService service = new JdbcStudentService(); Student existingStudent = service.findStudentById(1); System.out.println(existingStudent); long ts = System.currentTimeMillis();//For creating unique student names Student newStudent = new Student(0,"student_"+ts,"student_"+ts+"@gmail.com",new Date()); service.createStudent(newStudent); System.out.println(newStudent); int updateStudId = 3; Student updateStudent = service.findStudentById(updateStudId); ts = System.currentTimeMillis();//For creating unique student email updateStudent.setEmail("student_"+ts+"@gmail.com"); service.updateStudent(updateStudent); } public Student findStudentById(int studId) { Student student = null; Connection conn = null; try { conn = getDatabaseConnection(); String sql = "select * from students where stud_id=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, studId); ResultSet rs = pstmt.executeQuery(); if(rs.next()) { student = new Student(); student.setStudId(rs.getInt("stud_id")); student.setName(rs.getString("name")); student.setEmail(rs.getString("email")); student.setDob(rs.getDate("dob")); } } catch (SQLException e) { throw new RuntimeException(e); } finally { if(conn!= null){ try { conn.close(); } catch (SQLException e){ } } } return student; } public void createStudent(Student student) { Connection conn = null; try { conn = getDatabaseConnection(); String sql = "INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, student.getStudId()); pstmt.setString(2, student.getName()); pstmt.setString(3, student.getEmail()); pstmt.setDate(4, new java.sql.Date(student.getDob().getTime())); pstmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); } finally { if(conn!= null){ try { conn.close(); } catch (SQLException e){ } } } } public void updateStudent(Student student) { Connection conn = null; try { conn = getDatabaseConnection(); conn = getDatabaseConnection(); String sql = "UPDATE STUDENTS SET NAME=?,EMAIL=?,DOB=? WHERE STUD_ID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, student.getName()); pstmt.setString(2, student.getEmail()); pstmt.setDate(3, new java.sql.Date(student.getDob().getTime())); pstmt.setInt(4, student.getStudId()); pstmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e.getCause()); } finally { if(conn!= null){ try { conn.close(); } catch (SQLException e){ } } } } protected Connection getDatabaseConnection() throws SQLException { try { Class.forName(JdbcStudentService.DRIVER); return DriverManager.getConnection(JdbcStudentService.URL, JdbcStudentService.USERNAME, JdbcStudentService.PASSWORD); } catch (SQLException e) { throw e; } catch (Exception e) { throw new RuntimeException(e.getCause()); } } } ================================================ FILE: chapter01/src/main/java/com/mybatis3/services/StudentService.java ================================================ package com.mybatis3.services; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.domain.Student; import com.mybatis3.mappers.StudentMapper; import com.mybatis3.util.MyBatisSqlSessionFactory; /** * @author Siva * */ public class StudentService { private Logger logger = LoggerFactory.getLogger(getClass()); public List findAllStudents() { SqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findAllStudents(); } finally { sqlSession.close(); } } public Student findStudentById(Integer studId) { logger.debug("Select Student By ID :{}", studId); SqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findStudentById(studId); //return sqlSession.selectOne("com.mybatis3.StudentMapper.findStudentById", studId); } finally { sqlSession.close(); } } public void createStudent(Student student) { SqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); studentMapper.insertStudent(student); sqlSession.commit(); } finally { sqlSession.close(); } } public void updateStudent(Student student) { SqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); studentMapper.updateStudent(student); sqlSession.commit(); } finally { sqlSession.close(); } } } ================================================ FILE: chapter01/src/main/java/com/mybatis3/util/MyBatisSqlSessionFactory.java ================================================ package com.mybatis3.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; import org.apache.ibatis.datasource.DataSourceFactory; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author Siva * */ public class MyBatisSqlSessionFactory { private static SqlSessionFactory sqlSessionFactory; private static final Properties PROPERTIES = new Properties(); static { try { InputStream is = DataSourceFactory.class.getResourceAsStream("/application.properties"); PROPERTIES.load(is); } catch (IOException e) { e.printStackTrace(); } } public static SqlSessionFactory getSqlSessionFactory() { if(sqlSessionFactory==null) { InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e) { throw new RuntimeException(e.getCause()); }finally { if(inputStream != null){ try { inputStream.close(); } catch (IOException e) { } } } } return sqlSessionFactory; } public static SqlSession getSqlSession() { return getSqlSessionFactory().openSession(); } public static Connection getConnection() { String driver = PROPERTIES.getProperty("jdbc.driverClassName"); String url = PROPERTIES.getProperty("jdbc.url"); String username = PROPERTIES.getProperty("jdbc.username"); String password = PROPERTIES.getProperty("jdbc.password"); Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { throw new RuntimeException(e); } return connection; } } ================================================ FILE: chapter01/src/main/resources/application.properties ================================================ ################### DataSource Configuration ########################## jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/elearning jdbc.username=root jdbc.password=admin ================================================ FILE: chapter01/src/main/resources/com/mybatis3/mappers/StudentMapper.xml ================================================ INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(#{studId},#{name},#{email},#{dob}) UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob} WHERE STUD_ID=#{studId} ================================================ FILE: chapter01/src/main/resources/log4j.properties ================================================ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.com.mybatis3=DEBUG ================================================ FILE: chapter01/src/main/resources/mybatis-config.xml ================================================ ================================================ FILE: chapter01/src/main/resources/sql/create_tables.sql ================================================ CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VARCHAR(50) NOT NULL, CITY VARCHAR(50) NOT NULL, STATE VARCHAR(50) NOT NULL, ZIP VARCHAR(10) DEFAULT NULL, COUNTRY VARCHAR(50) NOT NULL, PRIMARY KEY (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE STUDENTS ( STUD_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (STUD_ID), CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE TUTORS ( TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (TUTOR_ID), CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSES ( COURSE_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, DESCRIPTION VARCHAR(512) DEFAULT NULL, START_DATE DATE DEFAULT NULL, END_DATE DATE DEFAULT NULL, TUTOR_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID), CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSE_ENROLLMENT ( COURSE_ID INT(11) NOT NULL, STUD_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID,STUD_ID), CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID), CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID) ) ENGINE=INNODB DEFAULT CHARSET=LATIN1; CREATE TABLE USER_PICS ( ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) DEFAULT NULL, PIC BLOB, BIO LONGTEXT, PRIMARY KEY (ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; ================================================ FILE: chapter01/src/main/resources/sql/drop_tables.sql ================================================ DROP TABLE IF EXISTS USER_PICS; DROP TABLE IF EXISTS COURSE_ENROLLMENT; DROP TABLE IF EXISTS COURSES; DROP TABLE IF EXISTS TUTORS; DROP TABLE IF EXISTS STUDENTS; DROP TABLE IF EXISTS ADDRESSES; ================================================ FILE: chapter01/src/main/resources/sql/sample_data.sql ================================================ --Sample data for table ADDRESSES INSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'), (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'), (3,'710 N Cable Rd','Lima','OH','45825','Allen'), (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche'); -- Sample data for table STUDENTS INSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25',NULL,NULL,3), (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15',NULL,NULL,4); -- Sample data for table TUTORS INSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES (1,'John','john@gmail.com','111-222-3333','1980-05-20',NULL,NULL,1), (2,'Paul','paul@gmail.com','123-321-4444','1981-03-15',NULL,NULL,2); -- Sample data for table courses INSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1), (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1), (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2); -- Sample data for table COURSE_ENROLLMENT INSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES (1,1), (1,2), (2,2); ================================================ FILE: chapter01/src/test/java/com/mybatis3/services/StudentServiceTest.java ================================================ package com.mybatis3.services; import java.util.Date; import java.util.List; import org.junit.AfterClass; import static org.junit.Assert.*; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.Student; /** * @author Siva * */ public class StudentServiceTest { private static StudentService studentService; @BeforeClass public static void setup() { studentService = new StudentService(); TestDataPopulator.initDatabase(); } @AfterClass public static void teardown() { studentService = null; } @Test public void testFindAllStudents() { List students = studentService.findAllStudents(); assertNotNull(students); for (Student student : students) { assertNotNull(student); //System.out.println(student); } } @Test public void testFindStudentById() { Student student = studentService.findStudentById(1); assertNotNull(student); } @Test public void testCreateUStudent() { Student student = new Student(); int id = 4; student.setStudId(id); student.setName("student_"+id); student.setEmail("student_"+id+"gmail.com"); student.setDob(new Date()); studentService.createStudent(student); Student newStudent = studentService.findStudentById(id); assertNotNull(newStudent); assertEquals("student_"+id, newStudent.getName()); assertEquals("student_"+id+"gmail.com", newStudent.getEmail()); } @Test public void testUpdateStudent() { int id = 2; Student student =studentService.findStudentById(id); student.setStudId(id); student.setName("student_"+id); student.setEmail("student_"+id+"gmail.com"); Date now = new Date(); student.setDob(now); studentService.updateStudent(student); Student updatedStudent = studentService.findStudentById(id); assertNotNull(updatedStudent); assertEquals("student_"+id, updatedStudent.getName()); assertEquals("student_"+id+"gmail.com", updatedStudent.getEmail()); } } ================================================ FILE: chapter01/src/test/java/com/mybatis3/services/TestDataPopulator.java ================================================ /** * */ package com.mybatis3.services; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.ScriptRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.util.MyBatisSqlSessionFactory; /** * @author Siva * */ public class TestDataPopulator { private static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class); public static void main(String[] args) { initDatabase(); } public static void initDatabase() { Connection connection = null; Reader reader = null; try { connection = MyBatisSqlSessionFactory.getConnection(); ScriptRunner scriptRunner = new ScriptRunner(connection); reader = Resources.getResourceAsReader("sql/drop_tables.sql"); scriptRunner.runScript(reader); logger.info("drop_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/create_tables.sql"); scriptRunner.runScript(reader ); logger.info("create_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/sample_data.sql"); scriptRunner.runScript(reader ); logger.info("sample_data.sql executed successfully"); connection.commit(); reader.close(); scriptRunner.closeConnection(); } catch (Exception e) { throw new RuntimeException(e); } } } ================================================ FILE: chapter01/src/test/resources/log4j.properties ================================================ log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.com.mybatis3=DEBUG ================================================ FILE: chapter02/README.txt ================================================ Chapter 2: Bootstrapping MyBatis ======================================= This module, chapter02, is a maven based java project to demonstrate the following approaches to configure and bootstrap MyBatis. . Configuration using XML . Configuration using Java API. Note: You can create MySQL Database tables using scripts in src/main/resources/sql folder. How to Run: 1. Configure Database Connection properties like hostname, username and password in src/main/resources/application.properties file. 2. Run StudentServiceTest JUnit Test class by using the appropriate configuration style in com.mybatis3.services.StudentServiceTest.setup() method. ================================================ FILE: chapter02/pom.xml ================================================ 4.0.0 com.mybatis3 chapter02 0.0.1 chapter02 http://www.mybatis.org MyBatis Book Chapter 02 UTF-8 1.6 4.11 1.7.5 1.2.17 3.2.2 5.1.21 2.3.2 ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin} ${java.version} ${java.version} ${project.build.sourceEncoding} junit junit ${junit.version} test org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} runtime log4j log4j ${log4j.version} runtime org.mybatis mybatis ${mybatis.version} mysql mysql-connector-java ${mysql.version} runtime ================================================ FILE: chapter02/src/main/java/com/mybatis3/domain/PhoneNumber.java ================================================ /** * */ package com.mybatis3.domain; /** * @author Siva * */ public class PhoneNumber { private String countryCode; private String stateCode; private String number; public PhoneNumber() { } public PhoneNumber(String countryCode, String stateCode, String number) { super(); this.countryCode = countryCode; this.stateCode = stateCode; this.number = number; } public PhoneNumber(String string) { if(string != null){ String[] parts = string.split("-"); if(parts.length>0) this.countryCode=parts[0]; if(parts.length>1) this.stateCode=parts[1]; if(parts.length>2) this.number=parts[2]; } } @Override public String toString() { return this.getAsString(); } public String getCountryCode() { return countryCode; } public void setCountryCode(String countryCode) { this.countryCode = countryCode; } public String getStateCode() { return stateCode; } public void setStateCode(String stateCode) { this.stateCode = stateCode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getAsString() { return countryCode+"-"+stateCode+"-"+number; } } ================================================ FILE: chapter02/src/main/java/com/mybatis3/domain/Student.java ================================================ package com.mybatis3.domain; import java.util.Date; import org.apache.ibatis.type.Alias; /** * @author Siva * */ @Alias("Student") public class Student { private Integer studId; private String name; private String email; private Date dob; public Student() { } public Student(Integer studId) { this.studId = studId; } public Student(Integer studId, String name, String email, Date dob) { this.studId = studId; this.name = name; this.email = email; this.dob = dob; } @Override public String toString() { return "Student [studId=" + studId + ", name=" + name + ", email=" + email + ", dob=" + dob + "]"; } public Integer getStudId() { return studId; } public void setStudId(Integer studId) { this.studId = studId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getDob() { return dob; } public void setDob(Date dob) { this.dob = dob; } } ================================================ FILE: chapter02/src/main/java/com/mybatis3/mappers/StudentMapper.java ================================================ package com.mybatis3.mappers; import java.util.List; import com.mybatis3.domain.Student; /** * @author Siva * */ public interface StudentMapper { List findAllStudents(); Student findStudentById(Integer id); void insertStudent(Student student); void updateStudent(Student student); } ================================================ FILE: chapter02/src/main/java/com/mybatis3/services/StudentService.java ================================================ package com.mybatis3.services; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.domain.Student; import com.mybatis3.mappers.StudentMapper; public class StudentService { private Logger logger = LoggerFactory.getLogger(getClass()); private SqlSessionFactory factory; public StudentService(SqlSessionFactory factory) { this.factory = factory; } protected SqlSession openSqlSession() { return factory.openSession(); } public List findAllStudents() { SqlSession sqlSession = openSqlSession(); try { //sqlSession.selectList("com.mybatis3.mappers.StudentMapper.findAllStudents"); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findAllStudents(); } finally { sqlSession.close(); } } public Student findStudentById(Integer studId) { logger.debug("Select Student By ID :{}", studId); SqlSession sqlSession = openSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findStudentById(studId); } finally { sqlSession.close(); } } public Student createStudent(Student student) { SqlSession sqlSession = openSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); studentMapper.insertStudent(student); sqlSession.commit(); return student; } finally { sqlSession.close(); } } public void updateStudent(Student student) { SqlSession sqlSession = openSqlSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); studentMapper.updateStudent(student); sqlSession.commit(); } finally { sqlSession.close(); } } } ================================================ FILE: chapter02/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java ================================================ /** * */ package com.mybatis3.typehandlers; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.mybatis3.domain.PhoneNumber; /** * @author Siva * */ public class PhoneTypeHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.getAsString()); } @Override public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException { return new PhoneNumber(rs.getString(columnName)); } @Override public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new PhoneNumber(rs.getString(columnIndex)); } @Override public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new PhoneNumber(cs.getString(columnIndex)); } } ================================================ FILE: chapter02/src/main/java/com/mybatis3/util/DataSourceFactory.java ================================================ /** * */ package com.mybatis3.util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.ibatis.datasource.pooled.PooledDataSource; /** * @author Siva * */ public class DataSourceFactory { private static final Properties PROPERTIES = new Properties(); static { try { InputStream is = DataSourceFactory.class.getResourceAsStream("/application.properties"); PROPERTIES.load(is); } catch (IOException e) { e.printStackTrace(); } } public static DataSource getDataSource() { String driver = PROPERTIES.getProperty("jdbc.driverClassName"); String url = PROPERTIES.getProperty("jdbc.url"); String username = PROPERTIES.getProperty("jdbc.username"); String password = PROPERTIES.getProperty("jdbc.password"); PooledDataSource dataSource = new PooledDataSource(driver, url, username, password); return dataSource; } public static DataSource getJNDIDataSource() { String dataSourceJNDIName = "java:comp/env/jdbc/MyBatisDemoDS"; try { InitialContext ctx = new InitialContext(); DataSource dataSource = (DataSource) ctx.lookup(dataSourceJNDIName); return dataSource; } catch (NamingException e) { throw new RuntimeException(e); } } } ================================================ FILE: chapter02/src/main/java/com/mybatis3/util/MyBatisUtil.java ================================================ package com.mybatis3.util; import java.io.IOException; import java.io.InputStream; import javax.sql.DataSource; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import com.mybatis3.domain.Student; import com.mybatis3.mappers.StudentMapper; import com.mybatis3.typehandlers.PhoneTypeHandler; /** * @author Siva * */ public class MyBatisUtil { private static SqlSessionFactory xmlSqlSessionFactory; private static SqlSessionFactory javaSqlSessionFactory; public static SqlSessionFactory getSqlSessionFactoryUsingXML() { if(xmlSqlSessionFactory==null) { InputStream inputStream; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); xmlSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e) { throw new RuntimeException(e); } } return xmlSqlSessionFactory; } public static SqlSessionFactory getSqlSessionFactoryUsingJavaAPI() { if(javaSqlSessionFactory==null) { try { DataSource dataSource = DataSourceFactory.getDataSource(); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.getTypeAliasRegistry().registerAlias("student", Student.class); configuration.getTypeHandlerRegistry().register(PhoneTypeHandler.class); configuration.addMapper(StudentMapper.class); javaSqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); }catch (Exception e) { throw new RuntimeException(e); } } return javaSqlSessionFactory; } } ================================================ FILE: chapter02/src/main/resources/application.properties ================================================ ################### DataSource Configuration ########################## jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/elearning jdbc.username=root jdbc.password=admin ================================================ FILE: chapter02/src/main/resources/com/mybatis3/mappers/StudentMapper.xml ================================================ INSERT INTO STUDENTS(NAME,EMAIL,DOB) VALUES(#{name},#{email},#{dob}) UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob} WHERE STUD_ID=#{studId} ================================================ FILE: chapter02/src/main/resources/full-mybatis-config.xml ================================================ ================================================ FILE: chapter02/src/main/resources/log4j.properties ================================================ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.com.mybatis3=DEBUG ================================================ FILE: chapter02/src/main/resources/mybatis-config.xml ================================================ ================================================ FILE: chapter02/src/main/resources/sql/create_tables.sql ================================================ CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VARCHAR(50) NOT NULL, CITY VARCHAR(50) NOT NULL, STATE VARCHAR(50) NOT NULL, ZIP VARCHAR(10) DEFAULT NULL, COUNTRY VARCHAR(50) NOT NULL, PRIMARY KEY (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE STUDENTS ( STUD_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (STUD_ID), CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE TUTORS ( TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (TUTOR_ID), CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSES ( COURSE_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, DESCRIPTION VARCHAR(512) DEFAULT NULL, START_DATE DATE DEFAULT NULL, END_DATE DATE DEFAULT NULL, TUTOR_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID), CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSE_ENROLLMENT ( COURSE_ID INT(11) NOT NULL, STUD_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID,STUD_ID), CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID), CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID) ) ENGINE=INNODB DEFAULT CHARSET=LATIN1; CREATE TABLE USER_PICS ( ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) DEFAULT NULL, PIC BLOB, BIO LONGTEXT, PRIMARY KEY (ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; ================================================ FILE: chapter02/src/main/resources/sql/drop_tables.sql ================================================ DROP TABLE IF EXISTS USER_PICS; DROP TABLE IF EXISTS COURSE_ENROLLMENT; DROP TABLE IF EXISTS COURSES; DROP TABLE IF EXISTS TUTORS; DROP TABLE IF EXISTS STUDENTS; DROP TABLE IF EXISTS ADDRESSES; ================================================ FILE: chapter02/src/main/resources/sql/sample_data.sql ================================================ --Sample data for table ADDRESSES INSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'), (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'), (3,'710 N Cable Rd','Lima','OH','45825','Allen'), (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche'); -- Sample data for table STUDENTS INSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25',NULL,NULL,3), (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15',NULL,NULL,4); -- Sample data for table TUTORS INSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES (1,'John','john@gmail.com','111-222-3333','1980-05-20',NULL,NULL,1), (2,'Paul','paul@gmail.com','123-321-4444','1981-03-15',NULL,NULL,2); -- Sample data for table courses INSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1), (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1), (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2); -- Sample data for table COURSE_ENROLLMENT INSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES (1,1), (1,2), (2,2); ================================================ FILE: chapter02/src/test/java/com/mybatis3/services/StudentServiceTest.java ================================================ package com.mybatis3.services; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.Date; import java.util.List; import org.apache.ibatis.session.SqlSessionFactory; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.Student; import com.mybatis3.util.MyBatisUtil; public class StudentServiceTest { private static StudentService studentService; @BeforeClass public static void setup() { TestDataPopulator.initDatabase(); SqlSessionFactory sqlSessionFactory = null; //Use this if you want XML based configuration sqlSessionFactory = MyBatisUtil.getSqlSessionFactoryUsingXML(); //Use this if you want to use Java API configuration //sqlSessionFactory = MyBatisUtil.getSqlSessionFactoryUsingJavaAPI(); studentService = new StudentService(sqlSessionFactory); } @AfterClass public static void teardown() { studentService = null; } @Test public void testFindAllStudents() { List students = studentService.findAllStudents(); assertNotNull(students); for (Student student : students) { assertNotNull(student); //System.out.println(student); } } @Test public void testFindStudentById() { Student student = studentService.findStudentById(1); assertNotNull(student); } @Test public void testCreateUStudent() { Student student = new Student(); int id = 4; student.setStudId(id); student.setName("student_"+id); student.setEmail("student_"+id+"gmail.com"); student.setDob(new Date()); Student newStudent = studentService.createStudent(student); assertNotNull(newStudent); assertEquals("student_"+id, newStudent.getName()); assertEquals("student_"+id+"gmail.com", newStudent.getEmail()); } @Test public void testUpdateStudent() { int id = 2; Student student =studentService.findStudentById(id); student.setStudId(id); student.setName("student_"+id); student.setEmail("student_"+id+"gmail.com"); Date now = new Date(); student.setDob(now); studentService.updateStudent(student); Student updatedStudent = studentService.findStudentById(id); assertNotNull(updatedStudent); assertEquals("student_"+id, updatedStudent.getName()); assertEquals("student_"+id+"gmail.com", updatedStudent.getEmail()); } } ================================================ FILE: chapter02/src/test/java/com/mybatis3/services/TestDataPopulator.java ================================================ /** * */ package com.mybatis3.services; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.ScriptRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.util.DataSourceFactory; /** * @author Siva * */ public class TestDataPopulator { private static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class); public static void main(String[] args) { initDatabase(); } public static void initDatabase() { Connection connection = null; Reader reader = null; try { connection = DataSourceFactory.getDataSource().getConnection(); ScriptRunner scriptRunner = new ScriptRunner(connection); reader = Resources.getResourceAsReader("sql/drop_tables.sql"); scriptRunner.runScript(reader); logger.info("drop_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/create_tables.sql"); scriptRunner.runScript(reader ); logger.info("create_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/sample_data.sql"); scriptRunner.runScript(reader ); logger.info("sample_data.sql executed successfully"); connection.commit(); reader.close(); scriptRunner.closeConnection(); } catch (Exception e) { throw new RuntimeException(e); } } } ================================================ FILE: chapter03/README.txt ================================================ Chapter 3: SQL Mappers using XML ================================= This chapter describes mapping SQL statements and query results to java beans in SQL Mappers using XML based approach. Topics covered: • CRUD Mapping • ResultSet Mapping • One-To-One, One-To-Many mappings • Dynamic SQL mapping How to Run: 1. Configure Database Connection properties like hostname, username and password in src/main/resources/application.properties file. 2. Run JUnit Test classes in com.mybatis3.services package under src/test/java/ folder. ================================================ FILE: chapter03/pom.xml ================================================ 4.0.0 com.mybatis3 chapter03 0.0.1 chapter03 http://www.mybatis.org MyBatis Book Chapter 03 UTF-8 1.6 4.11 1.7.5 1.2.17 3.2.2 5.1.21 2.3.2 ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin} ${java.version} ${java.version} ${project.build.sourceEncoding} junit junit ${junit.version} test org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} runtime log4j log4j ${log4j.version} runtime org.mybatis mybatis ${mybatis.version} mysql mysql-connector-java ${mysql.version} runtime ================================================ FILE: chapter03/src/main/java/com/mybatis3/domain/Address.java ================================================ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class Address implements Serializable { private static final long serialVersionUID = 1L; private Integer addrId; private String street; private String city; private String state; private String zip; private String country; @Override public String toString() { return "Address [addrId=" + addrId + ", street=" + street + ", city=" + city + ", state=" + state + ", zip=" + zip + ", country=" + country + "]"; } public Address() { } public Address(Integer addrId) { this.addrId = addrId; } public Address(Integer addrId, String street, String city, String state, String zip, String country) { this.addrId = addrId; this.street = street; this.city = city; this.state = state; this.zip = zip; this.country = country; } public Integer getAddrId() { return addrId; } public void setAddrId(Integer addrId) { this.addrId = addrId; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/domain/Course.java ================================================ package com.mybatis3.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Siva * */ public class Course implements Serializable { private static final long serialVersionUID = 1L; private Integer courseId; private String name; private String description; private Date startDate; private Date endDate; private Tutor tutor; private List students; @Override public String toString() { return "Course [courseId=" + courseId + ", name=" + name + ", description=" + description + ", startDate=" + startDate + ", endDate=" + endDate + ", tutor=" + tutor + ", students=" + students + "]"; } public Integer getCourseId() { return courseId; } public void setCourseId(Integer id) { this.courseId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public List getStudents() { if(students == null){ students = new ArrayList(0); } return students; } public void setStudents(List students) { this.students = students; } public Tutor getTutor() { return tutor; } public void setTutor(Tutor tutor) { this.tutor = tutor; } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/domain/PhoneNumber.java ================================================ /** * */ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class PhoneNumber implements Serializable { private static final long serialVersionUID = 1L; private String countryCode; private String stateCode; private String number; public PhoneNumber() { } public PhoneNumber(String countryCode, String stateCode, String number) { super(); this.countryCode = countryCode; this.stateCode = stateCode; this.number = number; } public PhoneNumber(String string) { if(string != null){ String[] parts = string.split("-"); if(parts.length>0) this.countryCode=parts[0]; if(parts.length>1) this.stateCode=parts[1]; if(parts.length>2) this.number=parts[2]; } } /*@Override public String toString() { return this.getAsString(); }*/ public String getCountryCode() { return countryCode; } public void setCountryCode(String countryCode) { this.countryCode = countryCode; } public String getStateCode() { return stateCode; } public void setStateCode(String stateCode) { this.stateCode = stateCode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getAsString() { return countryCode+"-"+stateCode+"-"+number; } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/domain/Student.java ================================================ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class Student implements Serializable { private static final long serialVersionUID = 1L; private Integer studId; private String name; private String email; private PhoneNumber phone; private Address address; @Override public String toString() { return "Student [studId=" + studId + ", name=" + name + ", email=" + email + ", phone=" + (phone==null?null:phone.getAsString()) + ", address=" + address + "]"; } public Student() { } public Student(Integer id) { this.studId = id; } public Integer getStudId() { return studId; } public void setStudId(Integer id) { this.studId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public PhoneNumber getPhone() { return phone; } public void setPhone(PhoneNumber phone) { this.phone = phone; } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/domain/Tutor.java ================================================ package com.mybatis3.domain; import java.io.Serializable; import java.util.List; /** * @author Siva * */ public class Tutor implements Serializable { private static final long serialVersionUID = 1L; private Integer tutorId; private String name; private String email; private Address address; private List courses; @Override public String toString() { return "Tutor [tutorId=" + tutorId + ", name=" + name + ", email=" + email + ", address=" + address + ", courses=" + courses + "]"; } public Tutor() { } public Tutor(Integer id) { this.tutorId = id; } public Integer getTutorId() { return tutorId; } public void setTutorId(Integer id) { this.tutorId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List getCourses() { return courses; } public void setCourses(List courses) { this.courses = courses; } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/mappers/AddressMapper.java ================================================ package com.mybatis3.mappers; import com.mybatis3.domain.Address; /** * @author Siva * */ public interface AddressMapper { Address findAddressById(Integer id); } ================================================ FILE: chapter03/src/main/java/com/mybatis3/mappers/CourseMapper.java ================================================ package com.mybatis3.mappers; import java.util.List; import java.util.Map; import com.mybatis3.domain.Course; /** * @author Siva * */ public interface CourseMapper { List selectCoursesByTutor(int tutorId); List searchCourses(Map map); List searchCoursesByTutors(Map map); } ================================================ FILE: chapter03/src/main/java/com/mybatis3/mappers/StudentMapper.java ================================================ package com.mybatis3.mappers; import java.util.List; import java.util.Map; import com.mybatis3.domain.Student; /** * @author Siva * */ public interface StudentMapper { List findAllStudents(); Student findStudentById(Integer id); Student selectStudentWithAddress(int id); void insertStudent(Student student); void insertStudentWithMap(Map map); void updateStudent(Student student); int deleteStudent(int id); } ================================================ FILE: chapter03/src/main/java/com/mybatis3/mappers/TutorMapper.java ================================================ package com.mybatis3.mappers; import com.mybatis3.domain.Tutor; /** * @author Siva * */ public interface TutorMapper { Tutor selectTutorWithCourses(int tutorId); Tutor selectTutorById(int tutorId); } ================================================ FILE: chapter03/src/main/java/com/mybatis3/services/CourseService.java ================================================ package com.mybatis3.services; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.domain.Course; import com.mybatis3.mappers.CourseMapper; import com.mybatis3.util.MyBatisUtil; public class CourseService { private Logger logger = LoggerFactory.getLogger(getClass()); public List searchCourses(Map map) { logger.debug("searchCourses By :"+map); SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { CourseMapper mapper = sqlSession.getMapper(CourseMapper.class); return mapper.searchCourses(map); } finally { sqlSession.close(); } } public List searchCoursesByTutors(Map map) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { CourseMapper mapper = sqlSession.getMapper(CourseMapper.class); return mapper.searchCoursesByTutors(map); } finally { sqlSession.close(); } } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/services/StudentService.java ================================================ package com.mybatis3.services; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import com.mybatis3.domain.Student; import com.mybatis3.mappers.StudentMapper; import com.mybatis3.util.MyBatisUtil; public class StudentService { public List findAllStudents() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findAllStudents(); } finally { sqlSession.close(); } } public Student findStudentById(Integer id) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findStudentById(id); } finally { sqlSession.close(); } } public Student findStudentWithAddressById(int id) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.selectStudentWithAddress(id); } finally { sqlSession.close(); } } public Student createStudent(Student student) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.insertStudent(student); sqlSession.commit(); return student; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public void createStudentWithMap(Map studentDataMap) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.insertStudentWithMap(studentDataMap); sqlSession.commit(); } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public Student updateStudent(Student student) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.updateStudent(student); sqlSession.commit(); return student; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public boolean deleteStudent(int id) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); int count = mapper.deleteStudent(id); sqlSession.commit(); return count > 0; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/services/TutorService.java ================================================ package com.mybatis3.services; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.domain.Tutor; import com.mybatis3.mappers.TutorMapper; import com.mybatis3.util.MyBatisUtil; public class TutorService { private Logger logger = LoggerFactory.getLogger(getClass()); public Tutor findTutorById(int tutorId) { logger.debug("findTutorById :"+tutorId); SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); return mapper.selectTutorById(tutorId); } finally { sqlSession.close(); } } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java ================================================ /** * */ package com.mybatis3.typehandlers; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.mybatis3.domain.PhoneNumber; /** * @author Siva * */ public class PhoneTypeHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.getAsString()); } @Override public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException { return new PhoneNumber(rs.getString(columnName)); } @Override public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new PhoneNumber(rs.getString(columnIndex)); } @Override public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new PhoneNumber(cs.getString(columnIndex)); } } ================================================ FILE: chapter03/src/main/java/com/mybatis3/util/MyBatisUtil.java ================================================ package com.mybatis3.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; import org.apache.ibatis.datasource.DataSourceFactory; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author Siva * */ public class MyBatisUtil { private static final String DEFAULT_MYBATIS_CONFIG_FILE="mybatis-config.xml"; private static SqlSessionFactory sqlSessionFactory; private static final Properties PROPERTIES = new Properties(); static { try { InputStream is = DataSourceFactory.class.getResourceAsStream("/application.properties"); PROPERTIES.load(is); } catch (IOException e) { e.printStackTrace(); } } public static SqlSessionFactory getSqlSessionFactory() { if(sqlSessionFactory==null){ //org.apache.ibatis.logging.LogFactory.useLog4JLogging(); try { InputStream inputStream = Resources.getResourceAsStream(DEFAULT_MYBATIS_CONFIG_FILE); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { throw new RuntimeException(e.getCause()); } } return sqlSessionFactory; } public static Connection getConnection() { String driver = PROPERTIES.getProperty("jdbc.driverClassName"); String url = PROPERTIES.getProperty("jdbc.url"); String username = PROPERTIES.getProperty("jdbc.username"); String password = PROPERTIES.getProperty("jdbc.password"); Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { throw new RuntimeException(e); } return connection; } } ================================================ FILE: chapter03/src/main/resources/application.properties ================================================ ################### DataSource Configuration ########################## jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/elearning jdbc.username=root jdbc.password=admin ================================================ FILE: chapter03/src/main/resources/com/mybatis3/mappers/AddressMapper.xml ================================================ ================================================ FILE: chapter03/src/main/resources/com/mybatis3/mappers/CourseMapper.xml ================================================ ================================================ FILE: chapter03/src/main/resources/com/mybatis3/mappers/StudentMapper.xml ================================================ insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone}) insert into students(name,email,addr_id,phone) values(#{name},#{email},#{address.addrId},#{phone}) update students name=#{name}, email=#{email}, phone=#{phone}, where stud_id=#{studId} delete from students where stud_id=#{studId} ================================================ FILE: chapter03/src/main/resources/com/mybatis3/mappers/TutorMapper.xml ================================================ ================================================ FILE: chapter03/src/main/resources/log4j.properties ================================================ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.com.mybatis3=DEBUG ================================================ FILE: chapter03/src/main/resources/mybatis-config.xml ================================================ ================================================ FILE: chapter03/src/main/resources/sql/create_tables.sql ================================================ CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VARCHAR(50) NOT NULL, CITY VARCHAR(50) NOT NULL, STATE VARCHAR(50) NOT NULL, ZIP VARCHAR(10) DEFAULT NULL, COUNTRY VARCHAR(50) NOT NULL, PRIMARY KEY (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE STUDENTS ( STUD_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, GENDER VARCHAR(6) DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (STUD_ID), UNIQUE KEY UK_EMAIL (EMAIL), CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE TUTORS ( TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, GENDER VARCHAR(6) DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (TUTOR_ID), UNIQUE KEY UK_EMAIL (EMAIL), CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSES ( COURSE_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, DESCRIPTION VARCHAR(512) DEFAULT NULL, START_DATE DATE DEFAULT NULL, END_DATE DATE DEFAULT NULL, TUTOR_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID), CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSE_ENROLLMENT ( COURSE_ID INT(11) NOT NULL, STUD_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID,STUD_ID), CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID), CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID) ) ENGINE=INNODB DEFAULT CHARSET=LATIN1; ================================================ FILE: chapter03/src/main/resources/sql/drop_tables.sql ================================================ DROP TABLE IF EXISTS USER_PICS; DROP TABLE IF EXISTS COURSE_ENROLLMENT; DROP TABLE IF EXISTS COURSES; DROP TABLE IF EXISTS TUTORS; DROP TABLE IF EXISTS STUDENTS; DROP TABLE IF EXISTS ADDRESSES; ================================================ FILE: chapter03/src/main/resources/sql/sample_data.sql ================================================ --Sample data for table ADDRESSES INSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'), (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'), (3,'710 N Cable Rd','Lima','OH','45825','Allen'), (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche'); -- Sample data for table STUDENTS INSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25',NULL,NULL,3), (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15',NULL,NULL,4); -- Sample data for table TUTORS INSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1), (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1), (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2), (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2); -- Sample data for table courses INSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1), (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1), (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2); -- Sample data for table COURSE_ENROLLMENT INSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES (1,1), (1,2), (2,2); ================================================ FILE: chapter03/src/test/java/com/mybatis3/services/CourseServiceTest.java ================================================ package com.mybatis3.services; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.Course; public class CourseServiceTest { private static CourseService courseService; @BeforeClass public static void setup() { TestDataPopulator.initDatabase(); courseService = new CourseService(); } @AfterClass public static void teardown() { courseService = null; } @Test public void searchCourses() { Map map = new HashMap(); map.put("tutorId", 1); //map.put("courseName", "%java%"); map.put("startDate", new Date()); List courses = courseService.searchCourses(map); Assert.assertNotNull(courses); for (Course course : courses) { Assert.assertNotNull(course); //System.out.println(course); } } @Test public void searchCoursesByTutors() { Map map = new HashMap(); List tutorIds = new ArrayList(); tutorIds.add(1); tutorIds.add(2); map.put("tutorIds", tutorIds); map.put("courseName", "%java%"); map.put("startDate", new Date()); List courses = courseService.searchCoursesByTutors(map); Assert.assertNotNull(courses); for (Course course : courses) { Assert.assertNotNull(course); //System.out.println(course); } } } ================================================ FILE: chapter03/src/test/java/com/mybatis3/services/StudentServiceTest.java ================================================ package com.mybatis3.services; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.AfterClass; import static org.junit.Assert.*; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.PhoneNumber; import com.mybatis3.domain.Student; public class StudentServiceTest { private static StudentService studentService; @BeforeClass public static void setup() { studentService = new StudentService(); TestDataPopulator.initDatabase(); } @AfterClass public static void teardown() { studentService = null; } @Test public void testFindAllStudents() { List students = studentService.findAllStudents(); assertNotNull(students); for (Student student : students) { assertNotNull(student); //System.out.println(student); } } @Test public void testFindStudentById() { Student student = studentService.findStudentById(1); assertNotNull(student); System.out.println(student); } @Test public void testFindStudentWithAddressById() { Student student = studentService.findStudentWithAddressById(1); assertNotNull(student); System.out.println(student); } @Test public void testCreateStudent() { Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setName("stud_"+ts); stud.setEmail("stud_"+ts+"@gmail.com"); stud.setPhone(new PhoneNumber("123-456-7890")); Student student = studentService.createStudent(stud); assertNotNull(student); assertEquals("stud_"+ts, student.getName()); assertEquals("stud_"+ts+"@gmail.com", student.getEmail()); System.out.println("Created Student:"+student); } @Test public void testCreateStudentWithMap() { Map studMap = new HashMap(); long ts = System.currentTimeMillis(); studMap.put("name","stud_"+ts); studMap.put("email","stud_"+ts+"@gmail.com"); studMap.put("phone",null); studentService.createStudentWithMap(studMap); } @Test public void testUpdateStudent() { Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setStudId(2); stud.setName("stud_"+ts); stud.setEmail("stud_"+ts+"@gmail.com"); Student updatedStudent = studentService.updateStudent(stud); assertNotNull(updatedStudent); assertEquals("stud_"+ts, updatedStudent.getName()); assertEquals("stud_"+ts+"@gmail.com", updatedStudent.getEmail()); } @Test public void testDeleteStudent() { boolean deleteStudent = studentService.deleteStudent(3); assertTrue(deleteStudent); System.out.println("deleteStudent:"+deleteStudent); } } ================================================ FILE: chapter03/src/test/java/com/mybatis3/services/TestDataPopulator.java ================================================ /** * */ package com.mybatis3.services; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.ScriptRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.util.MyBatisUtil;; /** * @author Siva * */ public class TestDataPopulator { private static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class); public static void main(String[] args) { initDatabase(); } public static void initDatabase() { Connection connection = null; Reader reader = null; try { connection = MyBatisUtil.getConnection(); ScriptRunner scriptRunner = new ScriptRunner(connection); reader = Resources.getResourceAsReader("sql/drop_tables.sql"); scriptRunner.runScript(reader); logger.info("drop_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/create_tables.sql"); scriptRunner.runScript(reader ); logger.info("create_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/sample_data.sql"); scriptRunner.runScript(reader ); logger.info("sample_data.sql executed successfully"); connection.commit(); reader.close(); scriptRunner.closeConnection(); } catch (Exception e) { throw new RuntimeException(e); } } } ================================================ FILE: chapter03/src/test/java/com/mybatis3/services/TutorServiceTest.java ================================================ package com.mybatis3.services; import java.util.List; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.Course; import com.mybatis3.domain.Tutor; public class TutorServiceTest { private static TutorService tutorService; @BeforeClass public static void setup() { TestDataPopulator.initDatabase(); tutorService = new TutorService(); } @AfterClass public static void teardown() { tutorService = null; } @Test public void testFindTutorById() { Tutor tutor = tutorService.findTutorById(1); Assert.assertNotNull(tutor); List courses = tutor.getCourses(); Assert.assertNotNull(courses); for (Course course : courses) { Assert.assertNotNull(course); System.out.println(course); } } } ================================================ FILE: chapter04/README.txt ================================================ Chapter 4: SQL Mappers using Annotations ======================================== This chapter describes mapping SQL statements and query results to java beans in SQL Mappers using Annotation based approach. Topics covered: • CRUD Mapping • ResultSet Mapping • One-To-One, One-To-Many mappings • Dynamic SQL mapping How to Run: Update the database properties in application.properties file. You can run the JUnit tests in src/test/java folder. In JUnit Tests we have Database Initialization logic to setup sample data. public class StudentServiceTest { @BeforeClass public static void setup() { studentService = new StudentService(); TestDataPopulator.initDatabase(); // this will drop and re-create database and populates sample data. } } ================================================ FILE: chapter04/pom.xml ================================================ 4.0.0 com.mybatis3 chapter04 0.0.1 jar chapter04 http://www.mybatis.org MyBatis Book Chapter 04 UTF-8 1.6 4.11 1.7.5 1.2.17 3.2.2 5.1.21 2.3.2 ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin} ${java.version} ${java.version} ${project.build.sourceEncoding} junit junit ${junit.version} test org.mybatis mybatis ${mybatis.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} runtime log4j log4j ${log4j.version} runtime mysql mysql-connector-java ${mysql.version} runtime ================================================ FILE: chapter04/src/main/java/com/mybatis3/domain/Address.java ================================================ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class Address implements Serializable { private static final long serialVersionUID = 1L; private Integer addrId; private String street; private String city; private String state; private String zip; private String country; @Override public String toString() { return "Address [addrId=" + addrId + ", street=" + street + ", city=" + city + ", state=" + state + ", zip=" + zip + ", country=" + country + "]"; } public Address() { } public Address(Integer addrId) { this.addrId = addrId; } public Address(Integer addrId, String street, String city, String state, String zip, String country) { this.addrId = addrId; this.street = street; this.city = city; this.state = state; this.zip = zip; this.country = country; } public Integer getAddrId() { return addrId; } public void setAddrId(Integer addrId) { this.addrId = addrId; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/domain/Course.java ================================================ package com.mybatis3.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Siva * */ public class Course implements Serializable { private static final long serialVersionUID = 1L; private Integer courseId; private String name; private String description; private Date startDate; private Date endDate; private Tutor tutor; private List students; @Override public String toString() { return "Course [courseId=" + courseId + ", name=" + name + ", description=" + description + ", startDate=" + startDate + ", endDate=" + endDate + ", tutor=" + tutor + ", students=" + students + "]"; } public Integer getCourseId() { return courseId; } public void setCourseId(Integer id) { this.courseId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public List getStudents() { if(students == null){ students = new ArrayList(0); } return students; } public void setStudents(List students) { this.students = students; } public Tutor getTutor() { return tutor; } public void setTutor(Tutor tutor) { this.tutor = tutor; } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/domain/PhoneNumber.java ================================================ /** * */ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class PhoneNumber implements Serializable { private static final long serialVersionUID = 1L; private String countryCode; private String stateCode; private String number; public PhoneNumber() { } public PhoneNumber(String countryCode, String stateCode, String number) { super(); this.countryCode = countryCode; this.stateCode = stateCode; this.number = number; } public PhoneNumber(String string) { if(string != null){ String[] parts = string.split("-"); if(parts.length>0) this.countryCode=parts[0]; if(parts.length>1) this.stateCode=parts[1]; if(parts.length>2) this.number=parts[2]; } } /*@Override public String toString() { return this.getAsString(); }*/ public String getCountryCode() { return countryCode; } public void setCountryCode(String countryCode) { this.countryCode = countryCode; } public String getStateCode() { return stateCode; } public void setStateCode(String stateCode) { this.stateCode = stateCode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getAsString() { return countryCode+"-"+stateCode+"-"+number; } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/domain/Student.java ================================================ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class Student implements Serializable { private static final long serialVersionUID = 1L; private Integer studId; private String name; private String email; private PhoneNumber phone; private Address address; @Override public String toString() { return "Student [studId=" + studId + ", name=" + name + ", email=" + email + ", phone=" + (phone==null?null:phone.getAsString()) + ", address=" + address + "]"; } public Student() { } public Student(Integer id) { this.studId = id; } public Integer getStudId() { return studId; } public void setStudId(Integer id) { this.studId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public PhoneNumber getPhone() { return phone; } public void setPhone(PhoneNumber phone) { this.phone = phone; } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/domain/Tutor.java ================================================ package com.mybatis3.domain; import java.io.Serializable; import java.util.List; /** * @author Siva * */ public class Tutor implements Serializable { private static final long serialVersionUID = 1L; private Integer tutorId; private String name; private String email; private Address address; private List courses; @Override public String toString() { return "Tutor [tutorId=" + tutorId + ", name=" + name + ", email=" + email + ", address=" + address + ", courses=" + courses + "]"; } public Tutor() { } public Tutor(Integer id) { this.tutorId = id; } public Integer getTutorId() { return tutorId; } public void setTutorId(Integer id) { this.tutorId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List getCourses() { return courses; } public void setCourses(List courses) { this.courses = courses; } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/mappers/AddressMapper.java ================================================ /** * */ package com.mybatis3.mappers; import org.apache.ibatis.annotations.Select; import com.mybatis3.domain.Address; /** * @author Siva * */ public interface AddressMapper { @Select("select addr_id as addrId, street, city, state, zip, country from addresses where addr_id=#{id}") Address selectAddressById(int id); } ================================================ FILE: chapter04/src/main/java/com/mybatis3/mappers/StudentMapper.java ================================================ package com.mybatis3.mappers; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.mybatis3.domain.Student; /** * @author Siva * */ public interface StudentMapper { @Select("select * from students") @Results({ @Result(id=true, column="stud_id", property="studId"), @Result(column="name", property="name"), @Result(column="email", property="email"), @Result(column="addr_id", property="address.addrId") }) List findAllStudents(); @Select("select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students") List> findAllStudentsMap(); @Select("select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}") Student findStudentById(Integer id); @Select("select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}") Map findStudentMapById(Integer id); @Select("select stud_id, name, email, a.addr_id, street, city, state, zip, country"+ " FROM students s left outer join addresses a on s.addr_id=a.addr_id"+ " where stud_id=#{studId} ") @ResultMap("com.mybatis3.mappers.StudentMapper.StudentWithAddressResult") Student selectStudentWithAddress(int studId); @Insert("insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})") @Options(useGeneratedKeys=true, keyProperty="studId") void insertStudent(Student student); @Insert("insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})") @Options(useGeneratedKeys=true, keyProperty="studId") void insertStudentWithMap(Map map); @Update("update students set name=#{name}, email=#{email}, phone=#{phone} where stud_id=#{studId}") void updateStudent(Student student); @Delete("delete from students where stud_id=#{studId}") int deleteStudent(int studId); } ================================================ FILE: chapter04/src/main/java/com/mybatis3/mappers/TutorMapper.java ================================================ /** * */ package com.mybatis3.mappers; import java.util.List; import org.apache.ibatis.annotations.DeleteProvider; import org.apache.ibatis.annotations.InsertProvider; import org.apache.ibatis.annotations.Many; import org.apache.ibatis.annotations.One; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.annotations.UpdateProvider; import com.mybatis3.domain.Course; import com.mybatis3.domain.Tutor; import com.mybatis3.sqlproviders.TutorDynaSqlProvider; /** * @author Siva * */ public interface TutorMapper { @Select("select * from courses where tutor_id=#{tutorId}") @ResultMap("com.mybatis3.mappers.TutorMapper.CourseResult") List selectCoursesByTutorId(int tutorId); @Select("SELECT tutor_id, t.name as tutor_name, email, addr_id FROM tutors t where t.tutor_id=#{tutorId}") @Results({ @Result(id=true, column="tutor_id", property="tutorId"), @Result(column="tutor_name", property="name"), @Result(column="email", property="email"), @Result(property="address", column="addr_id", one=@One(select="com.mybatis3.mappers.AddressMapper.selectAddressById")), @Result(property="courses", column="tutor_id", many=@Many(select="com.mybatis3.mappers.TutorMapper.selectCoursesByTutorId")) }) Tutor selectTutorWithCoursesById(int tutorId); @SelectProvider(type=TutorDynaSqlProvider.class, method="findAllTutorsSql") List findAllTutors(); @SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql") Tutor findTutorById(int tutorId); @SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByNameAndEmailSql") Tutor findTutorByNameAndEmail(@Param("name")String name, @Param("email")String email); @InsertProvider(type=TutorDynaSqlProvider.class, method="insertTutor") @Options(useGeneratedKeys=true, keyProperty="tutorId") int insertTutor(Tutor tutor); @UpdateProvider(type=TutorDynaSqlProvider.class, method="updateTutor") int updateTutor(Tutor tutor); @DeleteProvider(type=TutorDynaSqlProvider.class, method="deleteTutor") int deleteTutor(int tutorId); @SelectProvider(type=TutorDynaSqlProvider.class, method="selectTutorById") @ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult") Tutor selectTutorById(int tutorId); } ================================================ FILE: chapter04/src/main/java/com/mybatis3/services/StudentService.java ================================================ package com.mybatis3.services; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.domain.Student; import com.mybatis3.mappers.StudentMapper; import com.mybatis3.util.MyBatisUtil; public class StudentService { private Logger logger = LoggerFactory.getLogger(getClass()); public List findAllStudents() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class); return StudentMapper.findAllStudents(); } finally { sqlSession.close(); } } public Student findStudentById(Integer id) { logger.debug("findStudentById :"+id); SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findStudentById(id); } finally { sqlSession.close(); } } public Student findStudentWithAddressById(int id) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.selectStudentWithAddress(id); } finally { sqlSession.close(); } } public Student createStudent(Student student) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.insertStudent(student); sqlSession.commit(); return student; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public void createStudentWithMap(Map studentDataMap) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.insertStudentWithMap(studentDataMap); sqlSession.commit(); } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public Student updateStudent(Student student) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.updateStudent(student); sqlSession.commit(); return student; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public boolean deleteStudent(int id) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); int count = mapper.deleteStudent(id); sqlSession.commit(); return count > 0; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); throw new RuntimeException(e.getCause()); } finally { sqlSession.close(); } } public Map findStudentMapById(int id) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); return studentMapper.findStudentMapById(id); } finally { sqlSession.close(); } } public List> findAllStudentsMap() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class); return StudentMapper.findAllStudentsMap(); } finally { sqlSession.close(); } } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/services/TutorService.java ================================================ /** * */ package com.mybatis3.services; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.mybatis3.domain.Tutor; import com.mybatis3.mappers.TutorMapper; import com.mybatis3.util.MyBatisUtil; /** * @author Siva * */ public class TutorService { public List findAllTutors() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); return mapper.findAllTutors(); } finally { sqlSession.close(); } } public Tutor findTutorById(int tutorId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); return mapper.findTutorById(tutorId); } finally { sqlSession.close(); } } public Tutor findTutorByNameAndEmail(String name, String email) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); return mapper.findTutorByNameAndEmail(name, email); } finally { sqlSession.close(); } } public Tutor createTutor(Tutor tutor) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); mapper.insertTutor(tutor); sqlSession.commit(); } finally { sqlSession.close(); } return tutor; } public Tutor updateTutor(Tutor tutor) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); mapper.updateTutor(tutor); sqlSession.commit(); } finally { sqlSession.close(); } return tutor; } public boolean deleteTutor(int tutorId) { boolean deleted = false; SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); int nor = mapper.deleteTutor(tutorId); deleted = (nor == 1); sqlSession.commit(); } finally { sqlSession.close(); } return deleted; } public Tutor selectTutorById(int tutorId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); return mapper.selectTutorById(tutorId); } finally { sqlSession.close(); } } public Tutor selectTutorWithCoursesById(int tutorId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { TutorMapper mapper = sqlSession.getMapper(TutorMapper.class); return mapper.selectTutorWithCoursesById(tutorId); } finally { sqlSession.close(); } } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/sqlproviders/TutorDynaSqlProvider.java ================================================ /** * */ package com.mybatis3.sqlproviders; import java.util.Map; import org.apache.ibatis.jdbc.SQL; import com.mybatis3.domain.Tutor; /** * @author Siva * */ public class TutorDynaSqlProvider { public String findAllTutorsSql() { return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); }}.toString(); } public String findTutorByIdSql(final int tutorId) { /*return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("tutor_id = #{tutorId}"); }}.toString();*/ return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("tutor_id="+tutorId); }}.toString(); } public String findTutorByNameAndEmailSql(Map map) { //String name = (String) map.get("name"); //String email = (String) map.get("email"); //System.err.println(name+":"+email); return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("name=#{name} AND email=#{email}"); }}.toString(); } public String insertTutor(final Tutor tutor) { return new SQL() {{ INSERT_INTO("TUTORS"); if (tutor.getName() != null) { VALUES("NAME", "#{name}"); } if (tutor.getEmail() != null) { VALUES("EMAIL", "#{email}"); } }}.toString(); } public String updateTutor(final Tutor tutor) { return new SQL() {{ UPDATE("TUTORS"); if (tutor.getName() != null) { SET("NAME = #{name}"); } if (tutor.getEmail() != null) { SET("EMAIL = #{email}"); } WHERE("TUTOR_ID = #{tutorId}"); }}.toString(); } public String deleteTutor(int tutorId) { return new SQL() {{ DELETE_FROM("TUTORS"); WHERE("TUTOR_ID = #{tutorId}"); }}.toString(); } public String selectTutorById() { return new SQL() {{ SELECT("t.tutor_id, t.name as tutor_name, email"); SELECT("a.addr_id, street, city, state, zip, country"); SELECT("course_id, c.name as course_name, description, start_date, end_date"); FROM("TUTORS t"); LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id"); LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id"); WHERE("t.TUTOR_ID = #{id}"); }}.toString(); } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java ================================================ /** * */ package com.mybatis3.typehandlers; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.mybatis3.domain.PhoneNumber; /** * @author Siva * */ public class PhoneTypeHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.getAsString()); } @Override public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException { return new PhoneNumber(rs.getString(columnName)); } @Override public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new PhoneNumber(rs.getString(columnIndex)); } @Override public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new PhoneNumber(cs.getString(columnIndex)); } } ================================================ FILE: chapter04/src/main/java/com/mybatis3/util/MyBatisUtil.java ================================================ package com.mybatis3.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; import org.apache.ibatis.datasource.DataSourceFactory; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author Siva * */ public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; private static final Properties PROPERTIES = new Properties(); static { try { InputStream is = DataSourceFactory.class.getResourceAsStream("/application.properties"); PROPERTIES.load(is); } catch (IOException e) { e.printStackTrace(); } } public static Connection getConnection() { String driver = PROPERTIES.getProperty("jdbc.driverClassName"); String url = PROPERTIES.getProperty("jdbc.url"); String username = PROPERTIES.getProperty("jdbc.username"); String password = PROPERTIES.getProperty("jdbc.password"); Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { throw new RuntimeException(e); } return connection; } public static SqlSessionFactory getSqlSessionFactory() { if(sqlSessionFactory==null) { InputStream inputStream; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e) { throw new RuntimeException(e.getCause()); } } return sqlSessionFactory; } } ================================================ FILE: chapter04/src/main/resources/application.properties ================================================ ################### DataSource Configuration ########################## jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/elearning jdbc.username=root jdbc.password=admin ================================================ FILE: chapter04/src/main/resources/com/mybatis3/mappers/StudentMapper.xml ================================================ ================================================ FILE: chapter04/src/main/resources/com/mybatis3/mappers/TutorMapper.xml ================================================ ================================================ FILE: chapter04/src/main/resources/log4j.properties ================================================ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.com.mybatis3=DEBUG ================================================ FILE: chapter04/src/main/resources/mybatis-config.xml ================================================ ================================================ FILE: chapter04/src/main/resources/sql/create_tables.sql ================================================ CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VARCHAR(50) NOT NULL, CITY VARCHAR(50) NOT NULL, STATE VARCHAR(50) NOT NULL, ZIP VARCHAR(10) DEFAULT NULL, COUNTRY VARCHAR(50) NOT NULL, PRIMARY KEY (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE STUDENTS ( STUD_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, GENDER VARCHAR(6) DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (STUD_ID), UNIQUE KEY UK_EMAIL (EMAIL), CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE TUTORS ( TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, GENDER VARCHAR(6) DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (TUTOR_ID), UNIQUE KEY UK_EMAIL (EMAIL), CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSES ( COURSE_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, DESCRIPTION VARCHAR(512) DEFAULT NULL, START_DATE DATE DEFAULT NULL, END_DATE DATE DEFAULT NULL, TUTOR_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID), CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSE_ENROLLMENT ( COURSE_ID INT(11) NOT NULL, STUD_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID,STUD_ID), CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID), CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID) ) ENGINE=INNODB DEFAULT CHARSET=LATIN1; ================================================ FILE: chapter04/src/main/resources/sql/drop_tables.sql ================================================ DROP TABLE IF EXISTS USER_PICS; DROP TABLE IF EXISTS COURSE_ENROLLMENT; DROP TABLE IF EXISTS COURSES; DROP TABLE IF EXISTS TUTORS; DROP TABLE IF EXISTS STUDENTS; DROP TABLE IF EXISTS ADDRESSES; ================================================ FILE: chapter04/src/main/resources/sql/sample_data.sql ================================================ --Sample data for table ADDRESSES INSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'), (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'), (3,'710 N Cable Rd','Lima','OH','45825','Allen'), (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche'); -- Sample data for table STUDENTS INSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25','MALE',NULL,NULL,3), (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15','MALE',NULL,NULL,4); -- Sample data for table TUTORS INSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1), (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1), (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2), (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2); -- Sample data for table courses INSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1), (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1), (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2); -- Sample data for table COURSE_ENROLLMENT INSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES (1,1), (1,2), (2,2); ================================================ FILE: chapter04/src/test/java/com/mybatis3/services/StudentServiceTest.java ================================================ package com.mybatis3.services; import static org.junit.Assert.*; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.PhoneNumber; import com.mybatis3.domain.Student; public class StudentServiceTest { private static StudentService studentService; @BeforeClass public static void setup() { studentService = new StudentService(); TestDataPopulator.initDatabase(); } @AfterClass public static void teardown() { studentService = null; } @Test public void testFindAllStudents() { List students = studentService.findAllStudents(); assertNotNull(students); for (Student student : students) { System.err.println(student); } } @Test public void testFindStudentById() { Student student = studentService.findStudentById(1); System.err.println(student); System.err.println(student.getAddress().getAddrId()+":"+student.getAddress().getCity()); } @Test public void testFindStudentWithAddressById() { Student student = studentService.findStudentWithAddressById(2); assertNotNull(student); System.out.println(student.getAddress().getAddrId()+":"+student.getAddress().getCity()); } @Test public void testCreateStudent() { Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setName("stud_"+ts); stud.setEmail("stud_"+ts+"@gmail.com"); stud.setPhone(new PhoneNumber("123-456-7890")); Student student = studentService.createStudent(stud); assertNotNull(student); assertEquals("stud_"+ts, student.getName()); assertEquals("stud_"+ts+"@gmail.com", student.getEmail()); System.err.println("CreatedStudent: "+student); } @Test public void testCreateStudentWithMap() { Map studMap = new HashMap(); long ts = System.currentTimeMillis(); studMap.put("name","stud_"+ts); studMap.put("email","stud_"+ts+"@gmail.com"); studMap.put("phone",null); studentService.createStudentWithMap(studMap); } @Test public void testUpdateStudent() { Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setStudId(2); stud.setName("studddd_"+ts); stud.setEmail("studddd_"+ts+"@gmail.com"); Student student = studentService.updateStudent(stud); assertNotNull(student); assertEquals("studddd_"+ts, student.getName()); assertEquals("studddd_"+ts+"@gmail.com", student.getEmail()); assertEquals(new Integer(2), student.getStudId()); System.out.println("UpdatedStudent: "+student); } @Test public void testDeleteStudent() { boolean deleted = studentService.deleteStudent(3); assertTrue(deleted); System.err.println("deleteStudent:"+deleted); } @Test public void testFindStudentMapById() { Map studentMap = studentService.findStudentMapById(1); System.err.println(studentMap); } @Test public void testFindAllStudentsMap() { List> studentMapList = studentService.findAllStudentsMap(); for(Map studentMap : studentMapList) { System.out.println("id :"+studentMap.get("id")); System.out.println("name :"+studentMap.get("name")); System.out.println("email :"+studentMap.get("email")); System.out.println("phone :"+studentMap.get("phone")); } } } ================================================ FILE: chapter04/src/test/java/com/mybatis3/services/TestDataPopulator.java ================================================ /** * */ package com.mybatis3.services; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.ScriptRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.util.MyBatisUtil; /** * @author Siva * */ public class TestDataPopulator { private static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class); public static void main(String[] args) { initDatabase(); } public static void initDatabase() { Connection connection = null; Reader reader = null; try { connection = MyBatisUtil.getConnection(); ScriptRunner scriptRunner = new ScriptRunner(connection); reader = Resources.getResourceAsReader("sql/drop_tables.sql"); scriptRunner.runScript(reader); logger.info("drop_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/create_tables.sql"); scriptRunner.runScript(reader ); logger.info("create_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/sample_data.sql"); scriptRunner.runScript(reader ); logger.info("sample_data.sql executed successfully"); connection.commit(); reader.close(); scriptRunner.closeConnection(); } catch (Exception e) { throw new RuntimeException(e); } } } ================================================ FILE: chapter04/src/test/java/com/mybatis3/services/TutorServiceTest.java ================================================ package com.mybatis3.services; import static org.junit.Assert.*; import java.util.List; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.mybatis3.domain.Tutor; public class TutorServiceTest { private static TutorService tutorService; @BeforeClass public static void setup() { tutorService = new TutorService(); TestDataPopulator.initDatabase(); } @AfterClass public static void teardown() { tutorService = null; } @Test public void testFindAllTutors() { List tutors = tutorService.findAllTutors(); assertNotNull(tutors); for (Tutor tutor : tutors) { System.err.println(tutor); } } @Test public void testFindTutorById() { Tutor tutor = tutorService.findTutorById(1); assertNotNull(tutor); System.err.println(tutor); } @Test public void testFindTutorByNameAndEmail() { Tutor tutor = tutorService.findTutorByNameAndEmail("Paul", "paul@gmail.com"); assertNotNull(tutor); System.err.println(tutor); } @Test public void testCreateTutor() { Tutor tutor = new Tutor(); tutor.setName("siva"); tutor.setEmail("siva@gmail.com"); tutor = tutorService.createTutor(tutor); assertNotNull(tutor); System.err.println(tutor.getTutorId()); } @Test public void testUpdateTutor() { Tutor tutor = new Tutor(); tutor.setTutorId(1); tutor.setName("sivaprasad"); tutor.setEmail("sivaprasad@gmail.com"); tutor = tutorService.updateTutor(tutor); Tutor updTutor = tutorService.findTutorById(1); assertNotNull(updTutor); System.err.println(updTutor); } @Test public void testDeleteTutor() { boolean deleted = tutorService.deleteTutor(4); assertTrue(deleted); } @Test public void testSelectTutorById() { Tutor tutor = tutorService.selectTutorById(1); assertNotNull(tutor); System.err.println(tutor); } @Test public void testSelectTutorWithCoursesById() { Tutor tutor = tutorService.selectTutorWithCoursesById(1); assertNotNull(tutor); System.err.println(tutor); } } ================================================ FILE: chapter05/README.txt ================================================ Chapter 5: Integration with Spring This chapter explains how to integration MyBatis with Spring framework. Topics covered: . Configuring MyBatis in Spring ApplicationContext . Injecting SqlSession and SQL Mappers . Transaction Management using Spring How to Run: Update the database properties in application.properties file. You can run the JUnit tests in src/test/java folder. In JUnit Tests we have Database Initialization logic to setup sample data. public class StudentServiceTest { @BeforeClass public static void setup() { studentService = new StudentService(); TestDataPopulator.initDatabase(); // this will drop and re-create database and populates sample data. } } ================================================ FILE: chapter05/pom.xml ================================================ 4.0.0 com.mybatis3 chapter05 0.0.1 jar chapter04 http://www.mybatis.org MyBatis Book Chapter 05 UTF-8 1.6 4.11 1.7.5 1.2.17 3.2.2 1.2.0 5.1.21 3.1.3.RELEASE 1.6.8 2.2 1.4 1.6 2.5 2.3.2 ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin} ${java.version} ${java.version} ${project.build.sourceEncoding} junit junit ${junit.version} test org.springframework spring-context-support ${spring.version} commons-logging commons-logging org.springframework spring-jdbc ${spring.version} org.springframework spring-test ${spring.version} test org.aspectj aspectjrt ${aspectj.version} org.aspectj aspectjweaver ${aspectj.version} cglib cglib-nodep ${cglib.version} org.mybatis mybatis ${mybatis.version} org.mybatis mybatis-spring ${mybatis-spring.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j jcl-over-slf4j ${slf4j.version} runtime org.slf4j slf4j-log4j12 ${slf4j.version} runtime log4j log4j ${log4j.version} runtime mysql mysql-connector-java ${mysql.version} runtime commons-dbcp commons-dbcp ${commons.dbcp.version} ================================================ FILE: chapter05/src/main/java/com/mybatis3/config/AppConfig.java ================================================ package com.mybatis3.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; /* import javax.sql.DataSource; import org.apache.ibatis.datasource.pooled.PooledDataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.context.annotation.Bean; */ /** * @author Siva * */ @Configuration @MapperScan(value="com.mybatis3.mappers") public class AppConfig { /* @Bean public DataSource dataSource() { return new PooledDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/elearning", "root", "admin"); } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); return sessionFactory.getObject(); } */ } ================================================ FILE: chapter05/src/main/java/com/mybatis3/domain/Address.java ================================================ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class Address implements Serializable { private static final long serialVersionUID = 1L; private Integer addrId; private String street; private String city; private String state; private String zip; private String country; @Override public String toString() { return "Address [addrId=" + addrId + ", street=" + street + ", city=" + city + ", state=" + state + ", zip=" + zip + ", country=" + country + "]"; } public Address() { } public Address(Integer addrId) { this.addrId = addrId; } public Address(Integer addrId, String street, String city, String state, String zip, String country) { this.addrId = addrId; this.street = street; this.city = city; this.state = state; this.zip = zip; this.country = country; } public Integer getAddrId() { return addrId; } public void setAddrId(Integer addrId) { this.addrId = addrId; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/domain/Course.java ================================================ package com.mybatis3.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Siva * */ public class Course implements Serializable { private static final long serialVersionUID = 1L; private Integer courseId; private String name; private String description; private Date startDate; private Date endDate; private Tutor tutor; private List students; @Override public String toString() { return "Course [courseId=" + courseId + ", name=" + name + ", description=" + description + ", startDate=" + startDate + ", endDate=" + endDate + ", tutor=" + tutor + ", students=" + students + "]"; } public Integer getCourseId() { return courseId; } public void setCourseId(Integer id) { this.courseId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public List getStudents() { if(students == null){ students = new ArrayList(0); } return students; } public void setStudents(List students) { this.students = students; } public Tutor getTutor() { return tutor; } public void setTutor(Tutor tutor) { this.tutor = tutor; } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/domain/PhoneNumber.java ================================================ /** * */ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class PhoneNumber implements Serializable { private static final long serialVersionUID = 1L; private String countryCode; private String stateCode; private String number; public PhoneNumber() { } public PhoneNumber(String countryCode, String stateCode, String number) { super(); this.countryCode = countryCode; this.stateCode = stateCode; this.number = number; } public PhoneNumber(String string) { if(string != null){ String[] parts = string.split("-"); if(parts.length>0) this.countryCode=parts[0]; if(parts.length>1) this.stateCode=parts[1]; if(parts.length>2) this.number=parts[2]; } } /*@Override public String toString() { return this.getAsString(); }*/ public String getCountryCode() { return countryCode; } public void setCountryCode(String countryCode) { this.countryCode = countryCode; } public String getStateCode() { return stateCode; } public void setStateCode(String stateCode) { this.stateCode = stateCode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getAsString() { return countryCode+"-"+stateCode+"-"+number; } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/domain/Student.java ================================================ package com.mybatis3.domain; import java.io.Serializable; /** * @author Siva * */ public class Student implements Serializable { private static final long serialVersionUID = 1L; private Integer studId; private String name; private String email; private PhoneNumber phone; private Address address; @Override public String toString() { return "Student [studId=" + studId + ", name=" + name + ", email=" + email + ", phone=" + (phone==null?null:phone.getAsString()) + ", address=" + address + "]"; } public Student() { } public Student(Integer id) { this.studId = id; } public Integer getStudId() { return studId; } public void setStudId(Integer id) { this.studId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public PhoneNumber getPhone() { return phone; } public void setPhone(PhoneNumber phone) { this.phone = phone; } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/domain/Tutor.java ================================================ package com.mybatis3.domain; import java.io.Serializable; import java.util.List; /** * @author Siva * */ public class Tutor implements Serializable { private static final long serialVersionUID = 1L; private Integer tutorId; private String name; private String email; private Address address; private List courses; @Override public String toString() { return "Tutor [tutorId=" + tutorId + ", name=" + name + ", email=" + email + ", address=" + address + ", courses=" + courses + "]"; } public Tutor() { } public Tutor(Integer id) { this.tutorId = id; } public Integer getTutorId() { return tutorId; } public void setTutorId(Integer id) { this.tutorId = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List getCourses() { return courses; } public void setCourses(List courses) { this.courses = courses; } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/mappers/AddressMapper.java ================================================ /** * */ package com.mybatis3.mappers; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import com.mybatis3.domain.Address; /** * @author Siva * */ public interface AddressMapper { @Select("select addr_id as addrId, street, city, state, zip, country from addresses where addr_id=#{id}") Address selectAddressById(int id); @Insert("insert into addresses(street, city, state, zip, country) values(#{street},#{city},#{state},#{zip},#{country})") int insertAddress(Address address); } ================================================ FILE: chapter05/src/main/java/com/mybatis3/mappers/StudentMapper.java ================================================ package com.mybatis3.mappers; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.mybatis3.domain.Student; /** * @author Siva * */ public interface StudentMapper { @Select("select * from students") @Results({ @Result(id=true, column="stud_id", property="studId"), @Result(column="name", property="name"), @Result(column="email", property="email"), @Result(column="addr_id", property="address.addrId") }) List findAllStudents(); @Select("select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students") List> findAllStudentsMap(); @Select("select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}") Student findStudentById(Integer id); @Select("select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}") Map findStudentMapById(Integer id); @Select("select stud_id, name, email, a.addr_id, street, city, state, zip, country"+ " FROM students s left outer join addresses a on s.addr_id=a.addr_id"+ " where stud_id=#{studId} ") @ResultMap("com.mybatis3.mappers.StudentMapper.StudentWithAddressResult") Student selectStudentWithAddress(int studId); @Insert("insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})") @Options(useGeneratedKeys=true, keyProperty="studId") void insertStudent(Student student); @Insert("insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})") @Options(useGeneratedKeys=true, keyProperty="studId") void insertStudentWithMap(Map map); @Update("update students set name=#{name}, email=#{email}, phone=#{phone} where stud_id=#{studId}") void updateStudent(Student student); @Delete("delete from students where stud_id=#{studId}") int deleteStudent(int studId); } ================================================ FILE: chapter05/src/main/java/com/mybatis3/mappers/TutorMapper.java ================================================ /** * */ package com.mybatis3.mappers; import java.util.List; import org.apache.ibatis.annotations.DeleteProvider; import org.apache.ibatis.annotations.InsertProvider; import org.apache.ibatis.annotations.Many; import org.apache.ibatis.annotations.One; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.annotations.UpdateProvider; import com.mybatis3.domain.Course; import com.mybatis3.domain.Tutor; import com.mybatis3.sqlproviders.TutorDynaSqlProvider; /** * @author Siva * */ public interface TutorMapper { @Select("select * from courses where tutor_id=#{tutorId}") @ResultMap("com.mybatis3.mappers.TutorMapper.CourseResult") List selectCoursesByTutorId(int tutorId); @Select("SELECT tutor_id, t.name as tutor_name, email, addr_id FROM tutors t where t.tutor_id=#{tutorId}") @Results({ @Result(id=true, column="tutor_id", property="tutorId"), @Result(column="tutor_name", property="name"), @Result(column="email", property="email"), @Result(property="address", column="addr_id", one=@One(select="com.mybatis3.mappers.AddressMapper.selectAddressById")), @Result(property="courses", column="tutor_id", many=@Many(select="com.mybatis3.mappers.TutorMapper.selectCoursesByTutorId")) }) Tutor selectTutorWithCoursesById(int tutorId); @SelectProvider(type=TutorDynaSqlProvider.class, method="findAllTutorsSql") List findAllTutors(); @SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql") Tutor findTutorById(int tutorId); @SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByNameAndEmailSql") Tutor findTutorByNameAndEmail(@Param("name")String name, @Param("email")String email); @InsertProvider(type=TutorDynaSqlProvider.class, method="insertTutor") @Options(useGeneratedKeys=true, keyProperty="tutorId") int insertTutor(Tutor tutor); @UpdateProvider(type=TutorDynaSqlProvider.class, method="updateTutor") int updateTutor(Tutor tutor); @DeleteProvider(type=TutorDynaSqlProvider.class, method="deleteTutor") int deleteTutor(int tutorId); @SelectProvider(type=TutorDynaSqlProvider.class, method="selectTutorById") @ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult") Tutor selectTutorById(int tutorId); } ================================================ FILE: chapter05/src/main/java/com/mybatis3/services/StudentService.java ================================================ package com.mybatis3.services; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.mybatis3.domain.Address; import com.mybatis3.domain.Student; import com.mybatis3.mappers.AddressMapper; import com.mybatis3.mappers.StudentMapper; @Service @Transactional public class StudentService { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private StudentMapper studentMapper; @Autowired private AddressMapper addressMapper; public List findAllStudents() { return studentMapper.findAllStudents(); } public Student findStudentById(Integer id) { logger.debug("findStudentById :"+id); return studentMapper.findStudentById(id); } public Student findStudentWithAddressById(int id) { return studentMapper.selectStudentWithAddress(id); } public Student createStudent(Student student) { Address address = student.getAddress(); if(address != null){ addressMapper.insertAddress(address); } if(student.getName()==null || student.getName().trim().length()==0){ throw new RuntimeException("Student Name should not be null"); } studentMapper.insertStudent(student); return student; } public void createStudentWithMap(Map studentDataMap) { studentMapper.insertStudentWithMap(studentDataMap); } public Student updateStudent(Student student) { studentMapper.updateStudent(student); return student; } public boolean deleteStudent(int id) { int count = studentMapper.deleteStudent(id); return count > 0; } public Map findStudentMapById(int id) { return studentMapper.findStudentMapById(id); } public List> findAllStudentsMap() { return studentMapper.findAllStudentsMap(); } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/services/TutorService.java ================================================ /** * */ package com.mybatis3.services; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.mybatis3.domain.Tutor; import com.mybatis3.mappers.TutorMapper; /** * @author Siva * */ @Service @Transactional public class TutorService { @Autowired private SqlSession sqlSession; private TutorMapper getTutorMapper(){ return sqlSession.getMapper(TutorMapper.class); } public List findAllTutors() { return getTutorMapper().findAllTutors(); } public Tutor findTutorById(int tutorId) { return getTutorMapper().findTutorById(tutorId); } public Tutor findTutorByNameAndEmail(String name, String email) { return getTutorMapper().findTutorByNameAndEmail(name, email); } public Tutor createTutor(Tutor tutor) { getTutorMapper().insertTutor(tutor); return tutor; } public Tutor updateTutor(Tutor tutor) { getTutorMapper().updateTutor(tutor); return tutor; } public boolean deleteTutor(int tutorId) { boolean deleted = false; int nor = getTutorMapper().deleteTutor(tutorId); deleted = (nor == 1); return deleted; } public Tutor selectTutorById(int tutorId) { return getTutorMapper().selectTutorById(tutorId); } public Tutor selectTutorWithCoursesById(int tutorId) { return getTutorMapper().selectTutorWithCoursesById(tutorId); } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/sqlproviders/TutorDynaSqlProvider.java ================================================ /** * */ package com.mybatis3.sqlproviders; import java.util.Map; import org.apache.ibatis.jdbc.SQL; import com.mybatis3.domain.Tutor; /** * @author Siva * */ public class TutorDynaSqlProvider { public String findAllTutorsSql() { return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); }}.toString(); } public String findTutorByIdSql(final int tutorId) { return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("tutor_id="+tutorId); }}.toString(); } public String findTutorByNameAndEmailSql(Map map) { //String name = (String) map.get("name"); //String email = (String) map.get("email"); //System.err.println(name+":"+email); return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("name=#{name} AND email=#{email}"); }}.toString(); } public String insertTutor(final Tutor tutor) { return new SQL() {{ INSERT_INTO("TUTORS"); if (tutor.getName() != null) { VALUES("NAME", "#{name}"); } if (tutor.getEmail() != null) { VALUES("EMAIL", "#{email}"); } }}.toString(); } public String updateTutor(final Tutor tutor) { return new SQL() {{ UPDATE("TUTORS"); if (tutor.getName() != null) { SET("NAME = #{name}"); } if (tutor.getEmail() != null) { SET("EMAIL = #{email}"); } WHERE("TUTOR_ID = #{tutorId}"); }}.toString(); } public String deleteTutor(int tutorId) { return new SQL() {{ DELETE_FROM("TUTORS"); WHERE("TUTOR_ID = #{tutorId}"); }}.toString(); } public String selectTutorById() { return new SQL() {{ SELECT("t.tutor_id, t.name as tutor_name, email, a.addr_id, street, city, state, zip, country,course_id, c.name as course_name, description, start_date, end_date"); FROM("TUTORS t"); LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id"); LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id"); WHERE("t.TUTOR_ID = #{tutorId}"); }}.toString(); } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java ================================================ /** * */ package com.mybatis3.typehandlers; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.mybatis3.domain.PhoneNumber; /** * @author Siva * */ public class PhoneTypeHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.getAsString()); } @Override public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException { return new PhoneNumber(rs.getString(columnName)); } @Override public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new PhoneNumber(rs.getString(columnIndex)); } @Override public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new PhoneNumber(cs.getString(columnIndex)); } } ================================================ FILE: chapter05/src/main/java/com/mybatis3/util/MyBatisUtil.java ================================================ package com.mybatis3.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; import org.apache.ibatis.datasource.DataSourceFactory; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author Siva * */ public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; private static final Properties PROPERTIES = new Properties(); static { try { InputStream is = DataSourceFactory.class.getResourceAsStream("/application.properties"); PROPERTIES.load(is); } catch (IOException e) { e.printStackTrace(); } } public static Connection getConnection() { String driver = PROPERTIES.getProperty("jdbc.driverClassName"); String url = PROPERTIES.getProperty("jdbc.url"); String username = PROPERTIES.getProperty("jdbc.username"); String password = PROPERTIES.getProperty("jdbc.password"); Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { throw new RuntimeException(e); } return connection; } public static SqlSessionFactory getSqlSessionFactory() { if(sqlSessionFactory==null) { InputStream inputStream; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e) { throw new RuntimeException(e.getCause()); } } return sqlSessionFactory; } } ================================================ FILE: chapter05/src/main/resources/application.properties ================================================ ################### DataSource Configuration ########################## jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/elearning jdbc.username=root jdbc.password=admin ================================================ FILE: chapter05/src/main/resources/applicationContext.xml ================================================ ================================================ FILE: chapter05/src/main/resources/com/mybatis3/mappers/StudentMapper.xml ================================================ ================================================ FILE: chapter05/src/main/resources/com/mybatis3/mappers/TutorMapper.xml ================================================ ================================================ FILE: chapter05/src/main/resources/log4j.properties ================================================ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.com.mybatis3=DEBUG ================================================ FILE: chapter05/src/main/resources/sql/create_tables.sql ================================================ CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VARCHAR(50) NOT NULL, CITY VARCHAR(50) NOT NULL, STATE VARCHAR(50) NOT NULL, ZIP VARCHAR(10) DEFAULT NULL, COUNTRY VARCHAR(50) NOT NULL, PRIMARY KEY (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE STUDENTS ( STUD_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, GENDER VARCHAR(6) DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (STUD_ID), UNIQUE KEY UK_EMAIL (EMAIL), CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE TUTORS ( TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(50) NOT NULL, EMAIL VARCHAR(50) NOT NULL, PHONE VARCHAR(15) DEFAULT NULL, DOB DATE DEFAULT NULL, GENDER VARCHAR(6) DEFAULT NULL, BIO LONGTEXT DEFAULT NULL, PIC BLOB DEFAULT NULL, ADDR_ID INT(11) DEFAULT NULL, PRIMARY KEY (TUTOR_ID), UNIQUE KEY UK_EMAIL (EMAIL), CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSES ( COURSE_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, DESCRIPTION VARCHAR(512) DEFAULT NULL, START_DATE DATE DEFAULT NULL, END_DATE DATE DEFAULT NULL, TUTOR_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID), CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1; CREATE TABLE COURSE_ENROLLMENT ( COURSE_ID INT(11) NOT NULL, STUD_ID INT(11) NOT NULL, PRIMARY KEY (COURSE_ID,STUD_ID), CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID), CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID) ) ENGINE=INNODB DEFAULT CHARSET=LATIN1; ================================================ FILE: chapter05/src/main/resources/sql/drop_tables.sql ================================================ DROP TABLE IF EXISTS USER_PICS; DROP TABLE IF EXISTS COURSE_ENROLLMENT; DROP TABLE IF EXISTS COURSES; DROP TABLE IF EXISTS TUTORS; DROP TABLE IF EXISTS STUDENTS; DROP TABLE IF EXISTS ADDRESSES; ================================================ FILE: chapter05/src/main/resources/sql/sample_data.sql ================================================ --Sample data for table ADDRESSES INSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'), (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'), (3,'710 N Cable Rd','Lima','OH','45825','Allen'), (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche'); -- Sample data for table STUDENTS INSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25','MALE',NULL,NULL,3), (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15','MALE',NULL,NULL,4); -- Sample data for table TUTORS INSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1), (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1), (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2), (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2); -- Sample data for table courses INSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1), (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1), (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2); -- Sample data for table COURSE_ENROLLMENT INSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES (1,1), (1,2), (2,2); ================================================ FILE: chapter05/src/test/java/com/mybatis3/services/StudentServiceTest.java ================================================ package com.mybatis3.services; import static org.junit.Assert.*; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.mybatis3.domain.Address; import com.mybatis3.domain.PhoneNumber; import com.mybatis3.domain.Student; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class StudentServiceTest { @Autowired private StudentService studentService; @BeforeClass public static void setup() { TestDataPopulator.initDatabase(); } @Test public void testFindAllStudents() { List students = studentService.findAllStudents(); assertNotNull(students); for (Student student : students) { System.err.println(student); } } @Test public void testFindStudentById() { Student student = studentService.findStudentById(1); System.err.println(student); System.err.println(student.getAddress().getAddrId()+":"+student.getAddress().getCity()); } @Test public void testFindStudentWithAddressById() { Student student = studentService.findStudentWithAddressById(2); assertNotNull(student); System.out.println(student.getAddress().getAddrId()+":"+student.getAddress().getCity()); } @Test public void testCreateStudent() { //Address address = new Address(); Address address = new Address(1,"Quaker Ridge Rd.","Bethel","Brooklyn","06801","USA"); /*address.setStreet("Quaker Ridge Rd."); address.setCity("Bethel"); address.setState("Brooklyn"); address.setZip("06801"); address.setCountry("USA");*/ Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setName("stud_"+ts); stud.setEmail("stud_"+ts+"@gmail.com"); stud.setPhone(new PhoneNumber("123-456-7890")); stud.setAddress(address); Student student = studentService.createStudent(stud); assertNotNull(student); assertEquals("stud_"+ts, student.getName()); assertEquals("stud_"+ts+"@gmail.com", student.getEmail()); System.err.println("CreatedStudent: "+student); } @Test(expected=DataAccessException.class) public void testCreateStudentForException() { Address address = new Address(); address.setStreet("Quaker Ridge Rd."); address.setCity("Bethel"); address.setState("Brooklyn"); address.setZip("06801"); address.setCountry("USA"); Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setName("stud_"+ts); stud.setEmail("timothy@gmail.com"); stud.setPhone(new PhoneNumber("123-456-7890")); stud.setAddress(address); studentService.createStudent(stud); fail("You should not reach here"); } @Test public void testCreateStudentWithMap() { Map studMap = new HashMap(); long ts = System.currentTimeMillis(); studMap.put("name","stud_"+ts); studMap.put("email","stud_"+ts+"@gmail.com"); studMap.put("phone",null); studentService.createStudentWithMap(studMap); } @Test public void testUpdateStudent() { Student stud = new Student(); long ts = System.currentTimeMillis(); stud.setStudId(2); stud.setName("studddd_"+ts); stud.setEmail("studddd_"+ts+"@gmail.com"); Student student = studentService.updateStudent(stud); assertNotNull(student); assertEquals("studddd_"+ts, student.getName()); assertEquals("studddd_"+ts+"@gmail.com", student.getEmail()); assertEquals(new Integer(2), student.getStudId()); System.out.println("UpdatedStudent: "+student); } @Test public void testDeleteStudent() { boolean deleted = studentService.deleteStudent(3); assertTrue(deleted); System.err.println("deleteStudent:"+deleted); } @Test public void testFindStudentMapById() { Map studentMap = studentService.findStudentMapById(1); System.err.println(studentMap); } @Test public void testFindAllStudentsMap() { List> studentMapList = studentService.findAllStudentsMap(); for(Map studentMap : studentMapList) { System.out.println("id :"+studentMap.get("id")); System.out.println("name :"+studentMap.get("name")); System.out.println("email :"+studentMap.get("email")); System.out.println("phone :"+studentMap.get("phone")); } } } ================================================ FILE: chapter05/src/test/java/com/mybatis3/services/TestDataPopulator.java ================================================ /** * */ package com.mybatis3.services; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.ScriptRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mybatis3.util.MyBatisUtil; /** * @author Siva * */ public class TestDataPopulator { private static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class); public static void main(String[] args) { initDatabase(); } public static void initDatabase() { Connection connection = null; Reader reader = null; try { connection = MyBatisUtil.getConnection(); ScriptRunner scriptRunner = new ScriptRunner(connection); reader = Resources.getResourceAsReader("sql/drop_tables.sql"); scriptRunner.runScript(reader); logger.info("drop_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/create_tables.sql"); scriptRunner.runScript(reader ); logger.info("create_tables.sql executed successfully"); reader = Resources.getResourceAsReader("sql/sample_data.sql"); scriptRunner.runScript(reader ); logger.info("sample_data.sql executed successfully"); connection.commit(); reader.close(); scriptRunner.closeConnection(); } catch (Exception e) { throw new RuntimeException(e); } } } ================================================ FILE: chapter05/src/test/java/com/mybatis3/services/TutorServiceTest.java ================================================ package com.mybatis3.services; import static org.junit.Assert.*; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.mybatis3.domain.Tutor; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class TutorServiceTest { @Autowired private TutorService tutorService; @BeforeClass public static void setup() { TestDataPopulator.initDatabase(); } @Test public void testFindAllTutors() { List tutors = tutorService.findAllTutors(); assertNotNull(tutors); for (Tutor tutor : tutors) { System.err.println(tutor); } } @Test public void testFindTutorById() { Tutor tutor = tutorService.findTutorById(1); assertNotNull(tutor); //System.err.println(tutor); } @Test public void testFindTutorByNameAndEmail() { Tutor tutor = tutorService.findTutorByNameAndEmail("Paul", "paul@gmail.com"); assertNotNull(tutor); //System.err.println(tutor); } @Test public void testCreateTutor() { Tutor tutor = new Tutor(); tutor.setName("siva"); tutor.setEmail("siva@gmail.com"); tutor = tutorService.createTutor(tutor); assertNotNull(tutor); } @Test public void testUpdateTutor() { Tutor tutor = new Tutor(); tutor.setTutorId(1); tutor.setName("sivaprasad"); tutor.setEmail("sivaprasad@gmail.com"); tutor = tutorService.updateTutor(tutor); Tutor updTutor = tutorService.findTutorById(1); assertNotNull(updTutor); System.err.println(updTutor); } @Test public void testDeleteTutor() { boolean deleted = tutorService.deleteTutor(4); assertTrue(deleted); } @Test public void testSelectTutorById() { Tutor tutor = tutorService.selectTutorById(1); assertNotNull(tutor); System.err.println(tutor); } @Test public void testSelectTutorWithCoursesById() { Tutor tutor = tutorService.selectTutorWithCoursesById(1); assertNotNull(tutor); System.err.println(tutor); } } ================================================ FILE: elearning/README.txt ================================================ This module demonstrate developing a simple web app using MyBatis persistence framework. ================================================ FILE: elearning/pom.xml ================================================ 4.0.0 com.mybatis3 0.0.1 elearning war E-Learning Webapp http://maven.apache.org UTF-8 1.6 4.8.2 1.6.2 1.0.1 1.2.16 3.1.0.RELEASE 3.2.2 1.2.0 1.0.0 1.6.8 2.2 5.1.18 1.4 1.6 2.5 2.5 2.1 1.2 1.1.2 2.3.2 2.4.3-alpha-1 org.mybatis mybatis-spring mysql mysql-connector-java runtime org.slf4j slf4j-api org.slf4j slf4j-log4j12 runtime log4j log4j runtime junit junit test ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin} ${java.version} ${java.version} ${project.build.sourceEncoding} org.codehaus.mojo failsafe-maven-plugin ${maven.failsafe.plugin} integration-test verify junit junit ${junit.version} test org.slf4j slf4j-api ${slf4j.version} org.slf4j jcl-over-slf4j ${slf4j.version} runtime org.slf4j slf4j-log4j12 ${slf4j.version} runtime log4j log4j ${log4j.version} runtime org.springframework spring-context-support ${spring.version} commons-logging commons-logging org.springframework spring-orm ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-test ${spring.version} test org.aspectj aspectjrt ${aspectj.version} org.aspectj aspectjweaver ${aspectj.version} cglib cglib-nodep ${cglib.version} org.mybatis mybatis ${mybatis.version} org.mybatis mybatis-spring ${mybatis-spring.version} org.mybatis mybatis-ehcache 1.0.0 commons-dbcp commons-dbcp ${commons.dbcp.version} commons-lang commons-lang ${commons.lang.version} commons-pool commons-pool ${commons.pool.version} mysql mysql-connector-java ${mysql.version} runtime javax.servlet servlet-api ${servlet.version} provided javax.servlet.jsp jsp-api ${jsp.version} provided taglibs standard ${taglibs-standard.version} javax.servlet jstl ${jstl.version} opensymphony sitemesh 2.4.2 ================================================ FILE: elearning/src/main/resources/log4j.properties ================================================ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=mybatisapp.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d [%-5p] %c - %m%n log4j.logger.chapter02=DEBUG ================================================ FILE: elearning/src/main/webapp/WEB-INF/web.xml ================================================ Archetype Created Web Application ================================================ FILE: elearning/src/main/webapp/index.jsp ================================================

Hello World!