[
  {
    "path": ".gitignore",
    "content": "\n.project\n.classpath\n.settings\n.springBeans\n\ntarget\nbin\nbuild\n\n*.class\n\n# Package Files #\n*.jar\n*.war\n*.ear\n"
  },
  {
    "path": "README.md",
    "content": "Java Persistence with MyBatis3 Book Sample Code\n========================\n1. Getting started with MyBatis\n2. Bootstrapping MyBatis\n3. SQL Mappers using XML\n4. SQL Mappers using Annotations\n5. Integration with Spring\n"
  },
  {
    "path": "chapter01/README.txt",
    "content": "Chapter 1: Getting started with MyBatis\r\n=======================================\r\nThis module, chapter01, is a maven based java project with MyBatis configured.\r\n\r\nHow to Run:\r\n\t1. Create MySQL Database tables using scripts in src/main/resources/sql folder.\r\n\t2. Configure Database Connection properties like hostname, username and password in src/main/resources/application.properties file.\r\n\t3. Run StudentServiceTest JUnit Test class."
  },
  {
    "path": "chapter01/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 \r\n\thttp://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\r\n\t<groupId>com.mybatis3</groupId>\r\n\t<artifactId>chapter01</artifactId>\r\n\t<version>0.0.1</version>\r\n\t<packaging>jar</packaging>\r\n\r\n\t<name>chapter01</name>\r\n\t<url>http://www.mybatis.org</url>\r\n\t<description>MyBatis Book Chapter 01</description>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<java.version>1.6</java.version>\r\n\t\t<junit.version>4.11</junit.version>\r\n\t\t<slf4j.version>1.7.5</slf4j.version>\r\n\t\t<log4j.version>1.2.17</log4j.version>\r\n\t\t<mybatis.version>3.2.2</mybatis.version>\r\n\t\t<mysql.version>5.1.21</mysql.version>\r\n\t\t<maven.compiler.plugin>2.3.2</maven.compiler.plugin>\r\n\t</properties>\r\n\r\n\t<build>\r\n\t\t<finalName>${project.artifactId}</finalName>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\r\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\r\n\t\t\t\t<version>${maven.compiler.plugin}</version>\r\n\t\t\t\t<configuration>\r\n\t\t\t\t\t<source>${java.version}</source>\r\n\t\t\t\t\t<target>${java.version}</target>\r\n\t\t\t\t\t<encoding>${project.build.sourceEncoding}</encoding>\r\n\t\t\t\t</configuration>\r\n\t\t\t</plugin>\r\n\r\n\t\t</plugins>\r\n\t</build>\r\n\r\n\t<dependencies>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>junit</groupId>\r\n\t\t\t<artifactId>junit</artifactId>\r\n\t\t\t<version>${junit.version}</version>\r\n\t\t\t<scope>test</scope>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.mybatis</groupId>\r\n\t\t\t<artifactId>mybatis</artifactId>\r\n\t\t\t<version>${mybatis.version}</version>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.slf4j</groupId>\r\n\t\t\t<artifactId>slf4j-api</artifactId>\r\n\t\t\t<version>${slf4j.version}</version>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.slf4j</groupId>\r\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\r\n\t\t\t<version>${slf4j.version}</version>\r\n\t\t\t<scope>runtime</scope>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>log4j</groupId>\r\n\t\t\t<artifactId>log4j</artifactId>\r\n\t\t\t<version>${log4j.version}</version>\r\n\t\t\t<scope>runtime</scope>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>mysql</groupId>\r\n\t\t\t<artifactId>mysql-connector-java</artifactId>\r\n\t\t\t<version>${mysql.version}</version>\r\n\t\t\t<scope>runtime</scope>\r\n\t\t</dependency>\r\n\r\n\t</dependencies>\r\n\r\n</project>\r\n"
  },
  {
    "path": "chapter01/src/main/java/com/mybatis3/domain/Student.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.util.Date;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Student\r\n{\r\n\tprivate Integer studId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate Date dob;\r\n\t\r\n\tpublic Student() {\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic Student(Integer studId) {\r\n\t\tthis.studId = studId;\r\n\t}\r\n\t\r\n\tpublic Student(Integer studId, String name, String email, Date dob) {\r\n\t\tthis.studId = studId;\r\n\t\tthis.name = name;\r\n\t\tthis.email = email;\r\n\t\tthis.dob = dob;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Student [studId=\" + studId + \", name=\" + name + \", email=\"\r\n\t\t\t\t+ email + \", dob=\" + dob + \"]\";\r\n\t}\r\n\t\r\n\tpublic Integer getStudId() {\r\n\t\treturn studId;\r\n\t}\r\n\tpublic void setStudId(Integer studId) {\r\n\t\tthis.studId = studId;\r\n\t}\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail() {\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email) {\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Date getDob() {\r\n\t\treturn dob;\r\n\t}\r\n\tpublic void setDob(Date dob) {\r\n\t\tthis.dob = dob;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter01/src/main/java/com/mybatis3/mappers/StudentMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\n\r\nimport com.mybatis3.domain.Student;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface StudentMapper\r\n{\r\n\r\n\tList<Student> findAllStudents();\r\n\r\n\tStudent findStudentById(Integer id);\r\n\r\n\tvoid insertStudent(Student student);\r\n\r\n\tvoid updateStudent(Student student);\r\n\r\n}\r\n"
  },
  {
    "path": "chapter01/src/main/java/com/mybatis3/services/JdbcStudentService.java",
    "content": "package com.mybatis3.services;\r\n\r\nimport java.sql.Connection;\r\nimport java.sql.DriverManager;\r\nimport java.sql.PreparedStatement;\r\nimport java.sql.ResultSet;\r\nimport java.sql.SQLException;\r\nimport java.util.Date;\r\n\r\nimport com.mybatis3.domain.Student;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n\r\npublic class JdbcStudentService\r\n{\r\n\t\r\n\tprivate static final String DRIVER = \"com.mysql.jdbc.Driver\";\r\n\tprivate static final String URL = \"jdbc:mysql://localhost:3306/elearning\";\r\n\tprivate static final String USERNAME = \"root\";\r\n\tprivate static final String PASSWORD = \"admin\";\r\n\r\n\tpublic static void main(String[] args)\r\n\t{\r\n\t\t\r\n\t\tJdbcStudentService service = new JdbcStudentService();\r\n\t\t\r\n\t\tStudent existingStudent = service.findStudentById(1);\r\n\t\tSystem.out.println(existingStudent);\r\n\t\t\r\n\t\t\r\n\t\tlong ts = System.currentTimeMillis();//For creating unique student names\r\n\t\tStudent newStudent = new Student(0,\"student_\"+ts,\"student_\"+ts+\"@gmail.com\",new Date());\r\n\t\tservice.createStudent(newStudent);\r\n\t\tSystem.out.println(newStudent);\r\n\t\t\r\n\t\tint updateStudId = 3;\r\n\t\tStudent updateStudent = service.findStudentById(updateStudId);\r\n\t\tts = System.currentTimeMillis();//For creating unique student email\r\n\t\tupdateStudent.setEmail(\"student_\"+ts+\"@gmail.com\");\r\n\t\tservice.updateStudent(updateStudent);\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic Student findStudentById(int studId)\r\n\t{\r\n\t\tStudent student = null;\r\n\t\tConnection conn = null;\r\n\t\ttry\r\n\t\t{\r\n\t\t\tconn = getDatabaseConnection();\r\n\t\t\tString sql = \"select * from students where stud_id=?\";\r\n\t\t\tPreparedStatement pstmt = conn.prepareStatement(sql);\r\n\t\t\tpstmt.setInt(1, studId);\r\n\t\t\tResultSet rs = pstmt.executeQuery();\r\n\t\t\tif(rs.next())\r\n\t\t\t{\r\n\t\t\t\tstudent = new Student();\r\n\t\t\t\tstudent.setStudId(rs.getInt(\"stud_id\"));\r\n\t\t\t\tstudent.setName(rs.getString(\"name\"));\r\n\t\t\t\tstudent.setEmail(rs.getString(\"email\"));\r\n\t\t\t\tstudent.setDob(rs.getDate(\"dob\"));\r\n\t\t\t}\r\n\t\t\t\r\n\t\t} catch (SQLException e)\r\n\t\t{\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\tfinally\r\n\t\t{\r\n\t\t\tif(conn!= null){\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconn.close();\r\n\t\t\t\t} catch (SQLException e){ }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn student;\r\n\t}\r\n\t\r\n\tpublic void createStudent(Student student)\r\n\t{\r\n\t\tConnection conn = null;\r\n\t\ttry\r\n\t\t{\r\n\t\t\tconn = getDatabaseConnection();\r\n\t\t\tString sql = \"INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)\";\r\n\t\t\tPreparedStatement pstmt = conn.prepareStatement(sql);\r\n\t\t\tpstmt.setInt(1, student.getStudId());\r\n\t\t\tpstmt.setString(2, student.getName());\r\n\t\t\tpstmt.setString(3, student.getEmail());\r\n\t\t\tpstmt.setDate(4, new java.sql.Date(student.getDob().getTime()));\r\n\t\t\tpstmt.executeUpdate();\r\n\t\t\t\r\n\t\t} catch (SQLException e)\r\n\t\t{\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\tfinally\r\n\t\t{\r\n\t\t\tif(conn!= null){\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconn.close();\r\n\t\t\t\t} catch (SQLException e){ }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void updateStudent(Student student)\r\n\t{\r\n\t\tConnection conn = null;\r\n\t\ttry\r\n\t\t{\r\n\t\t\tconn = getDatabaseConnection();\r\n\t\t\tconn = getDatabaseConnection();\r\n\t\t\tString sql = \"UPDATE STUDENTS SET NAME=?,EMAIL=?,DOB=? WHERE STUD_ID=?\";\r\n\t\t\tPreparedStatement pstmt = conn.prepareStatement(sql);\r\n\t\t\tpstmt.setString(1, student.getName());\r\n\t\t\tpstmt.setString(2, student.getEmail());\r\n\t\t\tpstmt.setDate(3, new java.sql.Date(student.getDob().getTime()));\r\n\t\t\tpstmt.setInt(4, student.getStudId());\r\n\t\t\tpstmt.executeUpdate();\r\n\t\t\t\r\n\t\t} catch (SQLException e)\r\n\t\t{\r\n\t\t\tthrow new RuntimeException(e.getCause());\r\n\t\t}\r\n\t\tfinally\r\n\t\t{\r\n\t\t\tif(conn!= null){\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconn.close();\r\n\t\t\t\t} catch (SQLException e){ }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tprotected Connection getDatabaseConnection() throws SQLException\r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\tClass.forName(JdbcStudentService.DRIVER);\r\n\t\t\treturn DriverManager.getConnection(JdbcStudentService.URL, \r\n\t\t\t\t\t\t\t\t\t\t\t\tJdbcStudentService.USERNAME, \r\n\t\t\t\t\t\t\t\t\t\t\t\tJdbcStudentService.PASSWORD);\r\n\t\t} catch (SQLException e)\r\n\t\t{\r\n\t\t\tthrow e;\r\n\t\t} catch (Exception e)\r\n\t\t{\r\n\t\t\tthrow new RuntimeException(e.getCause());\r\n\t\t} \r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "chapter01/src/main/java/com/mybatis3/services/StudentService.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\n\nimport org.apache.ibatis.session.SqlSession;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.mybatis3.domain.Student;\nimport com.mybatis3.mappers.StudentMapper;\nimport com.mybatis3.util.MyBatisSqlSessionFactory;\n\n\n/**\n * @author Siva\n *\n */\npublic class StudentService \n{\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\tpublic List<Student> findAllStudents()\n\t{\n\t\tSqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findAllStudents();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student findStudentById(Integer studId)\n\t{\n\t\tlogger.debug(\"Select Student By ID :{}\", studId);\n\t\tSqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findStudentById(studId);\n\t\t\t//return sqlSession.selectOne(\"com.mybatis3.StudentMapper.findStudentById\", studId);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic void createStudent(Student student)\n\t{\n\t\tSqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tstudentMapper.insertStudent(student);\n\t\t\tsqlSession.commit();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic void updateStudent(Student student)\n\t{\n\t\tSqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tstudentMapper.updateStudent(student);\n\t\t\tsqlSession.commit();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "chapter01/src/main/java/com/mybatis3/util/MyBatisSqlSessionFactory.java",
    "content": "package com.mybatis3.util;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.sql.Connection;\r\nimport java.sql.DriverManager;\r\nimport java.util.Properties;\r\n\r\nimport org.apache.ibatis.datasource.DataSourceFactory;\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.session.SqlSession;\r\nimport org.apache.ibatis.session.SqlSessionFactory;\r\nimport org.apache.ibatis.session.SqlSessionFactoryBuilder;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class MyBatisSqlSessionFactory\r\n{\r\n\tprivate static SqlSessionFactory sqlSessionFactory;\r\n\t\r\n\tprivate static final Properties PROPERTIES = new Properties();\r\n\t\r\n\tstatic\r\n\t{\r\n\t\ttry {\r\n\t\t\tInputStream is = DataSourceFactory.class.getResourceAsStream(\"/application.properties\");\r\n\t\t\tPROPERTIES.load(is);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static SqlSessionFactory getSqlSessionFactory()\r\n\t{\r\n\t\tif(sqlSessionFactory==null) \r\n\t\t{\r\n\t\t\tInputStream inputStream = null;\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tinputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");\r\n\t\t\t\tsqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);\r\n\t\t\t}catch (IOException e)\r\n\t\t\t{\r\n\t\t\t\tthrow new RuntimeException(e.getCause());\r\n\t\t\t}finally {\r\n\t\t\t\tif(inputStream != null){\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tinputStream.close();\r\n\t\t\t\t\t} catch (IOException e) {\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sqlSessionFactory;\r\n\t}\r\n\t\r\n\tpublic static SqlSession getSqlSession() \r\n\t{\r\n\t\treturn getSqlSessionFactory().openSession();\r\n\t}\r\n\t\r\n\tpublic static Connection getConnection() \r\n\t{\r\n\t\tString driver = PROPERTIES.getProperty(\"jdbc.driverClassName\");\r\n\t\tString url = PROPERTIES.getProperty(\"jdbc.url\");\r\n\t\tString username = PROPERTIES.getProperty(\"jdbc.username\");\r\n\t\tString password = PROPERTIES.getProperty(\"jdbc.password\");\r\n\t\tConnection connection = null;\r\n\t\ttry {\r\n\t\t\tClass.forName(driver);\r\n\t\t\tconnection = DriverManager.getConnection(url, username, password);\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t} \r\n\t\treturn connection;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter01/src/main/resources/application.properties",
    "content": "\r\n\r\n################### DataSource Configuration ##########################\r\n\r\njdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/elearning\r\njdbc.username=root\r\njdbc.password=admin\r\n"
  },
  {
    "path": "chapter01/src/main/resources/com/mybatis3/mappers/StudentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.StudentMapper\">\r\n\t\r\n\t<resultMap type=\"Student\" id=\"StudentResult\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\"/>\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<result property=\"dob\" column=\"dob\"/>\r\n\t</resultMap>\r\n  \r\n  \t<select id=\"findAllStudents\" resultMap=\"StudentResult\">\r\n    \tselect * from Students\r\n  \t</select>\r\n  \t\r\n  \t<select id=\"findStudentById\" parameterType=\"int\" resultType=\"Student\">\r\n    \tselect stud_id as studId, name, email, dob from Students where stud_id=#{studId}\r\n  \t</select>\r\n  \t\r\n  \t<insert id=\"insertStudent\" parameterType=\"Student\">\r\n  \t\tINSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(#{studId},#{name},#{email},#{dob})\r\n  \t</insert>\r\n  \t\r\n  \t<update id=\"updateStudent\" parameterType=\"Student\">\r\n  \t\tUPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob} WHERE STUD_ID=#{studId}\r\n  \t</update>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter01/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.com.mybatis3=DEBUG"
  },
  {
    "path": "chapter01/src/main/resources/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE configuration\r\n  PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\r\n<configuration>\r\n\r\n\t  <properties resource=\"application.properties\"/>\r\n\t\t\r\n\t  <typeAliases>\r\n\t  \t<package name=\"com.mybatis3.domain\"/>\r\n\t  </typeAliases>\r\n\t\r\n\t  <environments default=\"development\">\r\n\t    <environment id=\"development\">\r\n\t      <transactionManager type=\"JDBC\"/>\r\n\t      <dataSource type=\"POOLED\">\r\n\t        <property name=\"driver\" value=\"${jdbc.driverClassName}\"/>\r\n\t        <property name=\"url\" value=\"${jdbc.url}\"/>\r\n\t        <property name=\"username\" value=\"${jdbc.username}\"/>\r\n\t        <property name=\"password\" value=\"${jdbc.password}\"/>\r\n\t      </dataSource>\r\n\t    </environment>\r\n\t  </environments>\r\n\t  \r\n\t  <mappers>\r\n\t    <mapper resource=\"com/mybatis3/mappers/StudentMapper.xml\"/>\r\n\t  </mappers>\r\n  \t\r\n  \t\r\n</configuration>"
  },
  {
    "path": "chapter01/src/main/resources/sql/create_tables.sql",
    "content": "\r\nCREATE TABLE ADDRESSES \r\n(\r\n  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  STREET VARCHAR(50) NOT NULL,\r\n  CITY VARCHAR(50) NOT NULL,\r\n  STATE VARCHAR(50) NOT NULL,\r\n  ZIP VARCHAR(10) DEFAULT NULL,\r\n  COUNTRY VARCHAR(50) NOT NULL,\r\n  PRIMARY KEY (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE STUDENTS \r\n(\r\n  STUD_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,  \r\n  PRIMARY KEY (STUD_ID),\r\n  CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE TUTORS \r\n(\r\n  TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,\r\n  PRIMARY KEY (TUTOR_ID),\r\n  CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)  \r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSES \r\n(\r\n  COURSE_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(100) NOT NULL,\r\n  DESCRIPTION VARCHAR(512) DEFAULT NULL,\r\n  START_DATE DATE DEFAULT NULL,\r\n  END_DATE DATE DEFAULT NULL,\r\n  TUTOR_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID),\r\n  CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSE_ENROLLMENT\r\n(\r\n  COURSE_ID INT(11) NOT NULL,\r\n  STUD_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID,STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID)\r\n) ENGINE=INNODB DEFAULT CHARSET=LATIN1;\r\n\r\n\r\n\r\nCREATE TABLE USER_PICS \r\n(\r\n  ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) DEFAULT NULL,\r\n  PIC BLOB,\r\n  BIO LONGTEXT,\r\n  PRIMARY KEY (ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\n"
  },
  {
    "path": "chapter01/src/main/resources/sql/drop_tables.sql",
    "content": "\r\nDROP TABLE IF EXISTS USER_PICS;\r\nDROP TABLE IF EXISTS COURSE_ENROLLMENT;\r\nDROP TABLE IF EXISTS COURSES;\r\nDROP TABLE IF EXISTS TUTORS;\r\nDROP TABLE IF EXISTS STUDENTS;\r\nDROP TABLE IF EXISTS ADDRESSES;\r\n\r\n"
  },
  {
    "path": "chapter01/src/main/resources/sql/sample_data.sql",
    "content": "\n\n--Sample data for table ADDRESSES\n\nINSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES \n (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'),\n (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'),\n (3,'710 N Cable Rd','Lima','OH','45825','Allen'),\n (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche');\n\n-- Sample data for table STUDENTS\n\nINSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES \n (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25',NULL,NULL,3),\n (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15',NULL,NULL,4);\n\n-- Sample data for table TUTORS\n\nINSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES \n (1,'John','john@gmail.com','111-222-3333','1980-05-20',NULL,NULL,1),\n (2,'Paul','paul@gmail.com','123-321-4444','1981-03-15',NULL,NULL,2);\n\n-- Sample data for table courses\n\nINSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES \n (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1),\n (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1),\n (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2);\n\n-- Sample data for table COURSE_ENROLLMENT\n\nINSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES \n (1,1),\n (1,2),\n (2,2);\n\n"
  },
  {
    "path": "chapter01/src/test/java/com/mybatis3/services/StudentServiceTest.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport org.junit.AfterClass;\nimport static org.junit.Assert.*;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport com.mybatis3.domain.Student;\n\n\n\n/**\n * @author Siva\n *\n */\npublic class StudentServiceTest \n{\n\tprivate static StudentService studentService;\n\t\n\t@BeforeClass\n\tpublic static void setup()\n\t{\n\t\tstudentService = new StudentService();\n\t\tTestDataPopulator.initDatabase();\n\t}\n\t@AfterClass\n\tpublic static void teardown()\n\t{\n\t\tstudentService = null;\n\t}\n\t\n\t@Test\n    public void testFindAllStudents() \n\t{\n\t\tList<Student> students = studentService.findAllStudents();\n\t\tassertNotNull(students);\n\t\tfor (Student student : students)\n\t\t{\n\t\t\tassertNotNull(student);\n\t\t\t//System.out.println(student);\n\t\t}\n\t\t\n\t}\n\t\n\t@Test\n    public void testFindStudentById() \n\t{\n\t\tStudent student = studentService.findStudentById(1);\n\t\tassertNotNull(student);\n\t}\n\t\n\t@Test\n\tpublic void testCreateUStudent() \n\t{\n\t\tStudent student = new Student();\n\t\tint id = 4;\n\t\tstudent.setStudId(id);\n\t\tstudent.setName(\"student_\"+id);\n\t\tstudent.setEmail(\"student_\"+id+\"gmail.com\");\n\t\tstudent.setDob(new Date());\n\t\tstudentService.createStudent(student);\n\t\tStudent newStudent = studentService.findStudentById(id);\n\t\tassertNotNull(newStudent);\n\t\tassertEquals(\"student_\"+id, newStudent.getName());\n\t\tassertEquals(\"student_\"+id+\"gmail.com\", newStudent.getEmail());\n\t}\n\t\n\t@Test\t\n\tpublic void testUpdateStudent() \n\t{\n\t\tint id = 2;\n\t\tStudent student =studentService.findStudentById(id);\n\t\tstudent.setStudId(id);\n\t\tstudent.setName(\"student_\"+id);\n\t\tstudent.setEmail(\"student_\"+id+\"gmail.com\");\n\t\tDate now = new Date();\n\t\tstudent.setDob(now);\n\t\tstudentService.updateStudent(student);\n\t\tStudent updatedStudent = studentService.findStudentById(id);\n\t\tassertNotNull(updatedStudent);\n\t\tassertEquals(\"student_\"+id, updatedStudent.getName());\n\t\tassertEquals(\"student_\"+id+\"gmail.com\", updatedStudent.getEmail());\n\t\t\n\t}\n}\n"
  },
  {
    "path": "chapter01/src/test/java/com/mybatis3/services/TestDataPopulator.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.io.Reader;\r\nimport java.sql.Connection;\r\n\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.jdbc.ScriptRunner;\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport com.mybatis3.util.MyBatisSqlSessionFactory;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TestDataPopulator \r\n{\r\n\tprivate static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class);\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tinitDatabase();\r\n\t}\r\n\t\r\n\tpublic static void initDatabase()\r\n\t{\r\n\t\tConnection connection = null;\r\n\t\tReader reader = null;\r\n\t\ttry {\r\n\t\t\tconnection = MyBatisSqlSessionFactory.getConnection();\r\n\t\t\tScriptRunner scriptRunner = new ScriptRunner(connection);\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/drop_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader);\r\n\t\t\tlogger.info(\"drop_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/create_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"create_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/sample_data.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"sample_data.sql executed successfully\");\r\n\t\t\tconnection.commit();\r\n\t\t\treader.close();\r\n\t\t\tscriptRunner.closeConnection();\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter01/src/test/resources/log4j.properties",
    "content": "log4j.rootLogger=DEBUG, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.com.mybatis3=DEBUG"
  },
  {
    "path": "chapter02/README.txt",
    "content": "Chapter 2: Bootstrapping MyBatis\r\n=======================================\r\nThis module, chapter02, is a maven based java project to demonstrate the following approaches to configure and bootstrap MyBatis.\r\n\t. Configuration using XML \r\n\t. Configuration using Java API.\r\n\r\nNote: You can create MySQL Database tables using scripts in src/main/resources/sql folder.\t\r\n\r\nHow to Run:\r\n\t1. Configure Database Connection properties like hostname, username and password in src/main/resources/application.properties file.\r\n\t2. Run StudentServiceTest JUnit Test class by using the appropriate configuration style in com.mybatis3.services.StudentServiceTest.setup() method.\r\n\t\t"
  },
  {
    "path": "chapter02/pom.xml",
    "content": "<?xml version=\"1.0\"?>\n<project\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 \n\thttp://maven.apache.org/xsd/maven-4.0.0.xsd\"\n\txmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.mybatis3</groupId>\n\t<artifactId>chapter02</artifactId>\n\t<version>0.0.1</version>\n\t<name>chapter02</name>\n\t<url>http://www.mybatis.org</url>\n\t<description>MyBatis Book Chapter 02</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.6</java.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<slf4j.version>1.7.5</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\t\t<mybatis.version>3.2.2</mybatis.version>\n\t\t<mysql.version>5.1.21</mysql.version>\n\t\t<maven.compiler.plugin>2.3.2</maven.compiler.plugin>\n\t</properties>\n\n\t<build>\n\t\t<finalName>${project.artifactId}</finalName>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>${maven.compiler.plugin}</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${java.version}</source>\n\t\t\t\t\t<target>${java.version}</target>\n\t\t\t\t\t<encoding>${project.build.sourceEncoding}</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t</build>\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis</artifactId>\n\t\t\t<version>${mybatis.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/domain/PhoneNumber.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.domain;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneNumber \r\n{\r\n\tprivate String countryCode;\r\n\tprivate String stateCode;\r\n\tprivate String number;\r\n\t\r\n\tpublic PhoneNumber() {\r\n\t}\r\n\r\n\tpublic PhoneNumber(String countryCode, String stateCode, String number) {\r\n\t\tsuper();\r\n\t\tthis.countryCode = countryCode;\r\n\t\tthis.stateCode = stateCode;\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic PhoneNumber(String string) {\r\n\t\tif(string != null){\r\n\t\t\tString[] parts = string.split(\"-\");\r\n\t\t\tif(parts.length>0) this.countryCode=parts[0];\r\n\t\t\tif(parts.length>1) this.stateCode=parts[1];\r\n\t\t\tif(parts.length>2) this.number=parts[2];\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn this.getAsString();\r\n\t}\r\n\t\r\n\tpublic String getCountryCode() {\r\n\t\treturn countryCode;\r\n\t}\r\n\r\n\tpublic void setCountryCode(String countryCode) {\r\n\t\tthis.countryCode = countryCode;\r\n\t}\r\n\r\n\tpublic String getStateCode() {\r\n\t\treturn stateCode;\r\n\t}\r\n\r\n\tpublic void setStateCode(String stateCode) {\r\n\t\tthis.stateCode = stateCode;\r\n\t}\r\n\r\n\tpublic String getNumber() {\r\n\t\treturn number;\r\n\t}\r\n\r\n\tpublic void setNumber(String number) {\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic String getAsString() {\r\n\t\treturn countryCode+\"-\"+stateCode+\"-\"+number;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/domain/Student.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.util.Date;\r\n\r\nimport org.apache.ibatis.type.Alias;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n@Alias(\"Student\")\r\npublic class Student\r\n{\r\n\tprivate Integer studId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate Date dob;\r\n\t\r\n\tpublic Student() {\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic Student(Integer studId) {\r\n\t\tthis.studId = studId;\r\n\t}\r\n\t\r\n\tpublic Student(Integer studId, String name, String email, Date dob) {\r\n\t\tthis.studId = studId;\r\n\t\tthis.name = name;\r\n\t\tthis.email = email;\r\n\t\tthis.dob = dob;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Student [studId=\" + studId + \", name=\" + name + \", email=\"\r\n\t\t\t\t+ email + \", dob=\" + dob + \"]\";\r\n\t}\r\n\t\r\n\tpublic Integer getStudId() {\r\n\t\treturn studId;\r\n\t}\r\n\tpublic void setStudId(Integer studId) {\r\n\t\tthis.studId = studId;\r\n\t}\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail() {\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email) {\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Date getDob() {\r\n\t\treturn dob;\r\n\t}\r\n\tpublic void setDob(Date dob) {\r\n\t\tthis.dob = dob;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/mappers/StudentMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\n\r\nimport com.mybatis3.domain.Student;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface StudentMapper\r\n{\r\n\r\n\tList<Student> findAllStudents();\r\n\r\n\tStudent findStudentById(Integer id);\r\n\r\n\tvoid insertStudent(Student student);\r\n\r\n\tvoid updateStudent(Student student);\r\n\r\n}\r\n"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/services/StudentService.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\n\nimport org.apache.ibatis.session.SqlSession;\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.mybatis3.domain.Student;\nimport com.mybatis3.mappers.StudentMapper;\n\n\npublic class StudentService \n{\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\tprivate SqlSessionFactory factory;\n\tpublic StudentService(SqlSessionFactory factory) {\n\t\tthis.factory = factory;\n\t}\n\t\n\tprotected SqlSession openSqlSession()\n\t{\n\t\treturn factory.openSession();\n\t}\n\tpublic List<Student> findAllStudents()\n\t{\n\t\tSqlSession sqlSession = openSqlSession();\n\t\ttry {\n\t\t\t//sqlSession.selectList(\"com.mybatis3.mappers.StudentMapper.findAllStudents\");\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findAllStudents();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student findStudentById(Integer studId)\n\t{\n\t\tlogger.debug(\"Select Student By ID :{}\", studId);\n\t\tSqlSession sqlSession = openSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findStudentById(studId);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student createStudent(Student student)\n\t{\n\t\tSqlSession sqlSession = openSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tstudentMapper.insertStudent(student);\n\t\t\tsqlSession.commit();\n\t\t\treturn student;\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic void updateStudent(Student student)\n\t{\n\t\tSqlSession sqlSession = openSqlSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tstudentMapper.updateStudent(student);\n\t\t\tsqlSession.commit();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.typehandlers;\r\n\r\nimport java.sql.CallableStatement;\r\nimport java.sql.PreparedStatement;\r\nimport java.sql.ResultSet;\r\nimport java.sql.SQLException;\r\n\r\nimport org.apache.ibatis.type.BaseTypeHandler;\r\nimport org.apache.ibatis.type.JdbcType;\r\n\r\nimport com.mybatis3.domain.PhoneNumber;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{\r\n\r\n\t@Override\r\n\tpublic void setNonNullParameter(PreparedStatement ps, int i,\r\n\t\t\tPhoneNumber parameter, JdbcType jdbcType) throws SQLException {\r\n\t\tps.setString(i, parameter.getAsString());\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, String columnName)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnName));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnIndex));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(cs.getString(columnIndex));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/util/DataSourceFactory.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.util;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.util.Properties;\r\n\r\nimport javax.naming.InitialContext;\r\nimport javax.naming.NamingException;\r\nimport javax.sql.DataSource;\r\n\r\nimport org.apache.ibatis.datasource.pooled.PooledDataSource;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class DataSourceFactory \r\n{\r\n\tprivate static final Properties PROPERTIES = new Properties();\r\n\t\r\n\tstatic\r\n\t{\r\n\t\ttry {\r\n\t\t\tInputStream is = DataSourceFactory.class.getResourceAsStream(\"/application.properties\");\r\n\t\t\tPROPERTIES.load(is);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static DataSource getDataSource() \r\n\t{\r\n\t\tString driver = PROPERTIES.getProperty(\"jdbc.driverClassName\");\r\n\t\tString url = PROPERTIES.getProperty(\"jdbc.url\");\r\n\t\tString username = PROPERTIES.getProperty(\"jdbc.username\");\r\n\t\tString password = PROPERTIES.getProperty(\"jdbc.password\");\r\n\t\tPooledDataSource dataSource = new PooledDataSource(driver, url, username, password);\r\n\t\treturn dataSource;\r\n\t}\r\n\t\r\n\tpublic static DataSource getJNDIDataSource() \r\n\t{\r\n\t\tString dataSourceJNDIName = \"java:comp/env/jdbc/MyBatisDemoDS\";\r\n\t\ttry \r\n\t\t{\r\n\t\t\tInitialContext ctx = new InitialContext();\r\n\t\t\tDataSource dataSource = (DataSource) ctx.lookup(dataSourceJNDIName);\r\n\t\t\treturn dataSource;\r\n\t\t} \r\n\t\tcatch (NamingException e) \r\n\t\t{\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter02/src/main/java/com/mybatis3/util/MyBatisUtil.java",
    "content": "package com.mybatis3.util;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\n\r\nimport javax.sql.DataSource;\r\n\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.mapping.Environment;\r\nimport org.apache.ibatis.session.Configuration;\r\nimport org.apache.ibatis.session.SqlSessionFactory;\r\nimport org.apache.ibatis.session.SqlSessionFactoryBuilder;\r\nimport org.apache.ibatis.transaction.TransactionFactory;\r\nimport org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;\r\n\r\nimport com.mybatis3.domain.Student;\r\nimport com.mybatis3.mappers.StudentMapper;\r\nimport com.mybatis3.typehandlers.PhoneTypeHandler;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class MyBatisUtil\r\n{\r\n\tprivate static SqlSessionFactory xmlSqlSessionFactory;\r\n\tprivate static SqlSessionFactory javaSqlSessionFactory;\r\n\t\r\n\tpublic static SqlSessionFactory getSqlSessionFactoryUsingXML()\r\n\t{\r\n\t\tif(xmlSqlSessionFactory==null) \r\n\t\t{\r\n\t\t\tInputStream inputStream;\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tinputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");\r\n\t\t\t\txmlSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);\r\n\t\t\t}catch (IOException e)\r\n\t\t\t{\r\n\t\t\t\tthrow new RuntimeException(e);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn xmlSqlSessionFactory;\r\n\t}\r\n\t\r\n\tpublic static SqlSessionFactory getSqlSessionFactoryUsingJavaAPI()\r\n\t{\r\n\t\tif(javaSqlSessionFactory==null) \r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tDataSource dataSource = DataSourceFactory.getDataSource();\r\n\t\t\t\tTransactionFactory transactionFactory = new JdbcTransactionFactory();\r\n\t\t\t\tEnvironment environment = new Environment(\"development\", transactionFactory, dataSource);\r\n\t\t\t\tConfiguration configuration = new Configuration(environment);\r\n\t\t\t\tconfiguration.getTypeAliasRegistry().registerAlias(\"student\", Student.class);\r\n\t\t\t\tconfiguration.getTypeHandlerRegistry().register(PhoneTypeHandler.class);\r\n\t\t\t\tconfiguration.addMapper(StudentMapper.class);\r\n\t\t\t\tjavaSqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);\r\n\t\t\t\t\r\n\t\t\t}catch (Exception e)\r\n\t\t\t{\r\n\t\t\t\tthrow new RuntimeException(e);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn javaSqlSessionFactory;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter02/src/main/resources/application.properties",
    "content": "\r\n\r\n################### DataSource Configuration ##########################\r\n\r\njdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/elearning\r\njdbc.username=root\r\njdbc.password=admin\r\n"
  },
  {
    "path": "chapter02/src/main/resources/com/mybatis3/mappers/StudentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.StudentMapper\">\r\n\t\r\n\t<resultMap type=\"Student\" id=\"StudentResult\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\"/>\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<result property=\"dob\" column=\"dob\"/>\r\n\t</resultMap>\r\n  \r\n  \t<select id=\"findAllStudents\" resultMap=\"StudentResult\">\r\n    \tselect * from Students\r\n  \t</select>\r\n  \t\r\n  \t<select id=\"findStudentById\" parameterType=\"int\" resultType=\"Student\">\r\n    \tselect stud_id as studId, name, email, dob from Students where stud_id=#{studId}\r\n  \t</select>\r\n  \t\r\n  \t<insert id=\"insertStudent\" parameterType=\"Student\" useGeneratedKeys=\"true\" keyProperty=\"studId\">\r\n  \t\tINSERT INTO STUDENTS(NAME,EMAIL,DOB) VALUES(#{name},#{email},#{dob})\r\n  \t</insert>\r\n  \t\r\n  \t<update id=\"updateStudent\" parameterType=\"Student\">\r\n  \t\tUPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob} WHERE STUD_ID=#{studId}\r\n  \t</update>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter02/src/main/resources/full-mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE configuration\r\n  PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\r\n<configuration>\r\n\r\n\t<!--  This file is for a reference purpose for various configuration options -->\r\n\t<properties resource=\"application.properties\">\r\n\t\t<property name=\"username\" value=\"db_user\"/>\r\n  \t\t<property name=\"password\" value=\"verysecurepwd\"/>\t\r\n\t</properties>\r\n\t\r\n\t<settings>\r\n\t\t  <setting name=\"cacheEnabled\" value=\"true\"/>\r\n\t\t  <setting name=\"lazyLoadingEnabled\" value=\"true\"/>\r\n\t\t  <setting name=\"multipleResultSetsEnabled\" value=\"true\"/>\r\n\t\t  <setting name=\"useColumnLabel\" value=\"true\"/>\r\n\t\t  <setting name=\"useGeneratedKeys\" value=\"false\"/>\r\n\t\t  <setting name=\"autoMappingBehavior\" value=\"PARTIAL\"/>\r\n\t\t  <setting name=\"defaultExecutorType\" value=\"SIMPLE\"/>\r\n\t\t  <setting name=\"defaultStatementTimeout\" value=\"25000\"/>\r\n\t\t  <setting name=\"safeRowBoundsEnabled\" value=\"false\"/>\r\n\t\t  <setting name=\"mapUnderscoreToCamelCase\" value=\"false\"/>\r\n\t\t  <setting name=\"localCacheScope\" value=\"SESSION\"/>\r\n\t\t  <setting name=\"jdbcTypeForNull\" value=\"OTHER\"/>\r\n\t\t  <setting name=\"lazyLoadTriggerMethods\" value=\"equals,clone,hashCode,toString\"/>\r\n\t</settings>\r\n\t\r\n\t  <typeAliases>\r\n\t  \t<typeAlias alias=\"Tutor\" type=\"com.mybatis3.domain.Tutor\"/>\r\n\t  \t<package name=\"com.mybatis3.domain\"/>\r\n\t  </typeAliases>\r\n\t  \r\n\t\t<typeHandlers>\r\n\t\t  <typeHandler handler=\"com.mybatis3.typehandlers.PhoneTypeHandler\"/>\r\n\t\t  <package name=\"com.mybatis3.typehandlers\"/>\r\n\t\t</typeHandlers>\r\n\r\n\t <environments default=\"development\">\r\n\t    <environment id=\"development\">\r\n\t      <transactionManager type=\"JDBC\"/>\r\n\t      <dataSource type=\"POOLED\">\r\n\t        <property name=\"driver\" value=\"${jdbc.driverClassName}\"/>\r\n\t        <property name=\"url\" value=\"${jdbc.url}\"/>\r\n\t        <property name=\"username\" value=\"${jdbc.username}\"/>\r\n\t        <property name=\"password\" value=\"${jdbc.password}\"/>\r\n\t      </dataSource>\r\n\t    </environment>\r\n\t    \r\n\t    <environment id=\"production\">\r\n\t      <transactionManager type=\"JDBC\"/>\r\n\t      <dataSource type=\"JNDI\">\r\n\t        <property name=\"data_source\" value=\"java:comp/jdbc/MyBatisDemoDS\"/>\r\n\t      </dataSource>\r\n\t    </environment>\r\n\t    \r\n\t  </environments>\r\n\t  \r\n\t  <mappers>\r\n\t    <mapper resource=\"com/mybatis3/mappers/StudentMapper.xml\"/>\r\n\t    <mapper url=\"file:///var/mappers/StudentMapper.xml\"/>\r\n\t    <mapper class=\"com.mybatis3.mappers.TutorMapper\"/>\r\n\t  </mappers>\r\n  \t\r\n  \t\r\n</configuration>"
  },
  {
    "path": "chapter02/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.com.mybatis3=DEBUG"
  },
  {
    "path": "chapter02/src/main/resources/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE configuration\r\n  PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\r\n<configuration>\r\n\r\n\t<properties resource=\"application.properties\">\r\n\t\t<property name=\"jdbc.username\" value=\"root\"/>\r\n  \t\t<property name=\"jdbc.password\" value=\"verysecurepwd\"/>\t\r\n\t</properties>\r\n\t\r\n\t<!-- <settings>\r\n\t   <setting name=\"cacheEnabled\" value=\"true\"/>\r\n\t\t<setting name=\"lazyLoadingEnabled\" value=\"true\"/>\r\n\t\t<setting name=\"multipleResultSetsEnabled\" value=\"true\"/>\r\n\t\t<setting name=\"useColumnLabel\" value=\"true\"/>\r\n\t\t<setting name=\"useGeneratedKeys\" value=\"false\"/>\r\n\t\t<setting name=\"autoMappingBehavior\" value=\"PARTIAL\"/>\r\n\t\t<setting name=\"defaultExecutorType\" value=\"SIMPLE\"/>\r\n\t\t<setting name=\"defaultStatementTimeout\" value=\"25000\"/>\r\n\t\t<setting name=\"safeRowBoundsEnabled\" value=\"false\"/>\r\n\t\t<setting name=\"mapUnderscoreToCamelCase\" value=\"false\"/>\r\n\t\t<setting name=\"localCacheScope\" value=\"SESSION\"/>\r\n\t\t<setting name=\"jdbcTypeForNull\" value=\"OTHER\"/>\r\n\t\t<setting name=\"lazyLoadTriggerMethods\" value=\"equals,clone,hashCode,toString\"/>\r\n\t</settings> -->\r\n\r\n\t  <typeAliases>\r\n\t  \t<package name=\"com.mybatis3.domain\"/>\r\n\t  </typeAliases>\r\n\t\r\n\t  <environments default=\"development\">\r\n\t    <environment id=\"development\">\r\n\t      <transactionManager type=\"JDBC\"/>\r\n\t      <dataSource type=\"POOLED\">\r\n\t        <property name=\"driver\" value=\"${jdbc.driverClassName}\"/>\r\n\t        <property name=\"url\" value=\"${jdbc.url}\"/>\r\n\t        <property name=\"username\" value=\"${jdbc.username}\"/>\r\n\t        <property name=\"password\" value=\"${jdbc.password}\"/>\r\n\t      </dataSource>\r\n\t    </environment>\r\n\t  </environments>\r\n\t  \r\n\t  <mappers>\r\n\t    <mapper resource=\"com/mybatis3/mappers/StudentMapper.xml\"/>\r\n\t    <!-- <package name=\"com.mybatis3.mappers\"/> -->\r\n\t  </mappers>\r\n  \t\r\n</configuration>"
  },
  {
    "path": "chapter02/src/main/resources/sql/create_tables.sql",
    "content": "\r\nCREATE TABLE ADDRESSES \r\n(\r\n  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  STREET VARCHAR(50) NOT NULL,\r\n  CITY VARCHAR(50) NOT NULL,\r\n  STATE VARCHAR(50) NOT NULL,\r\n  ZIP VARCHAR(10) DEFAULT NULL,\r\n  COUNTRY VARCHAR(50) NOT NULL,\r\n  PRIMARY KEY (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE STUDENTS \r\n(\r\n  STUD_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,  \r\n  PRIMARY KEY (STUD_ID),\r\n  CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE TUTORS \r\n(\r\n  TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,\r\n  PRIMARY KEY (TUTOR_ID),\r\n  CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)  \r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSES \r\n(\r\n  COURSE_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(100) NOT NULL,\r\n  DESCRIPTION VARCHAR(512) DEFAULT NULL,\r\n  START_DATE DATE DEFAULT NULL,\r\n  END_DATE DATE DEFAULT NULL,\r\n  TUTOR_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID),\r\n  CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSE_ENROLLMENT\r\n(\r\n  COURSE_ID INT(11) NOT NULL,\r\n  STUD_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID,STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID)\r\n) ENGINE=INNODB DEFAULT CHARSET=LATIN1;\r\n\r\n\r\n\r\nCREATE TABLE USER_PICS \r\n(\r\n  ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) DEFAULT NULL,\r\n  PIC BLOB,\r\n  BIO LONGTEXT,\r\n  PRIMARY KEY (ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\n"
  },
  {
    "path": "chapter02/src/main/resources/sql/drop_tables.sql",
    "content": "\r\nDROP TABLE IF EXISTS USER_PICS;\r\nDROP TABLE IF EXISTS COURSE_ENROLLMENT;\r\nDROP TABLE IF EXISTS COURSES;\r\nDROP TABLE IF EXISTS TUTORS;\r\nDROP TABLE IF EXISTS STUDENTS;\r\nDROP TABLE IF EXISTS ADDRESSES;\r\n\r\n"
  },
  {
    "path": "chapter02/src/main/resources/sql/sample_data.sql",
    "content": "\n\n--Sample data for table ADDRESSES\n\nINSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES \n (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'),\n (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'),\n (3,'710 N Cable Rd','Lima','OH','45825','Allen'),\n (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche');\n\n-- Sample data for table STUDENTS\n\nINSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES \n (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25',NULL,NULL,3),\n (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15',NULL,NULL,4);\n\n-- Sample data for table TUTORS\n\nINSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES \n (1,'John','john@gmail.com','111-222-3333','1980-05-20',NULL,NULL,1),\n (2,'Paul','paul@gmail.com','123-321-4444','1981-03-15',NULL,NULL,2);\n\n-- Sample data for table courses\n\nINSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES \n (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1),\n (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1),\n (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2);\n\n-- Sample data for table COURSE_ENROLLMENT\n\nINSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES \n (1,1),\n (1,2),\n (2,2);\n\n"
  },
  {
    "path": "chapter02/src/test/java/com/mybatis3/services/StudentServiceTest.java",
    "content": "package com.mybatis3.services;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport com.mybatis3.domain.Student;\nimport com.mybatis3.util.MyBatisUtil;\n\npublic class StudentServiceTest \n{\n\tprivate static StudentService studentService;\n\t\n\t@BeforeClass\n\tpublic static void setup()\n\t{\n\t\tTestDataPopulator.initDatabase();\n\t\t\n\t\tSqlSessionFactory sqlSessionFactory =  null;\n\t\t//Use this if you want XML based configuration\n\t\tsqlSessionFactory = MyBatisUtil.getSqlSessionFactoryUsingXML();\n\t\t\n\t\t//Use this if you want to use Java API configuration\n\t\t//sqlSessionFactory = MyBatisUtil.getSqlSessionFactoryUsingJavaAPI();\n\t\tstudentService = new StudentService(sqlSessionFactory);\n\t}\n\t\n\t@AfterClass\n\tpublic static void teardown()\n\t{\n\t\tstudentService = null;\n\t}\n\t\n\t@Test\n    public void testFindAllStudents() \n\t{\n\t\tList<Student> students = studentService.findAllStudents();\n\t\tassertNotNull(students);\n\t\tfor (Student student : students)\n\t\t{\n\t\t\tassertNotNull(student);\n\t\t\t//System.out.println(student);\n\t\t}\n\t\t\n\t}\n\t\n\t@Test\n    public void testFindStudentById() \n\t{\n\t\tStudent student = studentService.findStudentById(1);\n\t\tassertNotNull(student);\n\t}\n\t\n\t@Test\n\tpublic void testCreateUStudent() \n\t{\n\t\tStudent student = new Student();\n\t\tint id = 4;\n\t\tstudent.setStudId(id);\n\t\tstudent.setName(\"student_\"+id);\n\t\tstudent.setEmail(\"student_\"+id+\"gmail.com\");\n\t\tstudent.setDob(new Date());\n\t\tStudent newStudent = studentService.createStudent(student);\n\t\tassertNotNull(newStudent);\n\t\tassertEquals(\"student_\"+id, newStudent.getName());\n\t\tassertEquals(\"student_\"+id+\"gmail.com\", newStudent.getEmail());\n\t}\n\t\n\t@Test\t\n\tpublic void testUpdateStudent() \n\t{\n\t\tint id = 2;\n\t\tStudent student =studentService.findStudentById(id);\n\t\tstudent.setStudId(id);\n\t\tstudent.setName(\"student_\"+id);\n\t\tstudent.setEmail(\"student_\"+id+\"gmail.com\");\n\t\tDate now = new Date();\n\t\tstudent.setDob(now);\n\t\tstudentService.updateStudent(student);\n\t\tStudent updatedStudent = studentService.findStudentById(id);\n\t\tassertNotNull(updatedStudent);\n\t\tassertEquals(\"student_\"+id, updatedStudent.getName());\n\t\tassertEquals(\"student_\"+id+\"gmail.com\", updatedStudent.getEmail());\n\t\t\n\t}\n}\n"
  },
  {
    "path": "chapter02/src/test/java/com/mybatis3/services/TestDataPopulator.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.io.Reader;\r\nimport java.sql.Connection;\r\n\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.jdbc.ScriptRunner;\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport com.mybatis3.util.DataSourceFactory;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TestDataPopulator \r\n{\r\n\tprivate static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class);\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tinitDatabase();\r\n\t}\r\n\t\r\n\tpublic static void initDatabase()\r\n\t{\r\n\t\tConnection connection = null;\r\n\t\tReader reader = null;\r\n\t\ttry {\r\n\t\t\tconnection = DataSourceFactory.getDataSource().getConnection();\r\n\t\t\tScriptRunner scriptRunner = new ScriptRunner(connection);\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/drop_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader);\r\n\t\t\tlogger.info(\"drop_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/create_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"create_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/sample_data.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"sample_data.sql executed successfully\");\r\n\t\t\tconnection.commit();\r\n\t\t\treader.close();\r\n\t\t\tscriptRunner.closeConnection();\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter03/README.txt",
    "content": "Chapter 3: SQL Mappers using XML\r\n=================================\r\nThis chapter describes mapping SQL statements and query results to java beans in SQL Mappers using XML based approach.\r\nTopics covered:\r\n•\tCRUD Mapping\r\n•\tResultSet Mapping\r\n•\tOne-To-One, One-To-Many mappings\r\n•\tDynamic SQL mapping\t\r\n\r\nHow to Run:\r\n\t1. Configure Database Connection properties like hostname, username and password in src/main/resources/application.properties file.\r\n\t2. Run JUnit Test classes in com.mybatis3.services package under src/test/java/ folder.\r\n\t\t\r\n"
  },
  {
    "path": "chapter03/pom.xml",
    "content": "<?xml version=\"1.0\"?>\n<project\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 \n\thttp://maven.apache.org/xsd/maven-4.0.0.xsd\"\n\txmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.mybatis3</groupId>\n\t<artifactId>chapter03</artifactId>\n\t<version>0.0.1</version>\n\t<name>chapter03</name>\n\t<url>http://www.mybatis.org</url>\n\t<description>MyBatis Book Chapter 03</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.6</java.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<slf4j.version>1.7.5</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\t\t<mybatis.version>3.2.2</mybatis.version>\n\t\t<mysql.version>5.1.21</mysql.version>\n\t\t<maven.compiler.plugin>2.3.2</maven.compiler.plugin>\n\t</properties>\n\n\t<build>\n\t\t<finalName>${project.artifactId}</finalName>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>${maven.compiler.plugin}</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${java.version}</source>\n\t\t\t\t\t<target>${java.version}</target>\n\t\t\t\t\t<encoding>${project.build.sourceEncoding}</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t</build>\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis</artifactId>\n\t\t\t<version>${mybatis.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/domain/Address.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Address implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer addrId;\r\n\tprivate String street;\r\n\tprivate String city;\r\n\tprivate String state;\r\n\tprivate String zip;\r\n\tprivate String country;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Address [addrId=\" + addrId + \", street=\" + street + \", city=\" + city\r\n\t\t\t\t+ \", state=\" + state + \", zip=\" + zip + \", country=\" + country\r\n\t\t\t\t+ \"]\";\r\n\t}\r\n\tpublic Address()\r\n\t{\r\n\t}\r\n\tpublic Address(Integer addrId)\r\n\t{\r\n\t\tthis.addrId = addrId;\r\n\t}\r\n\tpublic Address(Integer addrId, String street, String city, String state,\r\n\t\t\tString zip, String country)\r\n\t{\r\n\t\tthis.addrId = addrId;\r\n\t\tthis.street = street;\r\n\t\tthis.city = city;\r\n\t\tthis.state = state;\r\n\t\tthis.zip = zip;\r\n\t\tthis.country = country;\r\n\t}\r\n\tpublic Integer getAddrId() {\r\n\t\treturn addrId;\r\n\t}\r\n\tpublic void setAddrId(Integer addrId) {\r\n\t\tthis.addrId = addrId;\r\n\t}\r\n\tpublic String getStreet()\r\n\t{\r\n\t\treturn street;\r\n\t}\r\n\tpublic void setStreet(String street)\r\n\t{\r\n\t\tthis.street = street;\r\n\t}\r\n\tpublic String getCity()\r\n\t{\r\n\t\treturn city;\r\n\t}\r\n\tpublic void setCity(String city)\r\n\t{\r\n\t\tthis.city = city;\r\n\t}\r\n\tpublic String getState()\r\n\t{\r\n\t\treturn state;\r\n\t}\r\n\tpublic void setState(String state)\r\n\t{\r\n\t\tthis.state = state;\r\n\t}\r\n\tpublic String getZip()\r\n\t{\r\n\t\treturn zip;\r\n\t}\r\n\tpublic void setZip(String zip)\r\n\t{\r\n\t\tthis.zip = zip;\r\n\t}\r\n\tpublic String getCountry()\r\n\t{\r\n\t\treturn country;\r\n\t}\r\n\tpublic void setCountry(String country)\r\n\t{\r\n\t\tthis.country = country;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/domain/Course.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Course implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer courseId;\r\n\tprivate String name;\r\n\tprivate String description;\r\n\tprivate Date startDate;\r\n\tprivate Date endDate;\r\n\tprivate Tutor tutor;\r\n\tprivate List<Student> students;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Course [courseId=\" + courseId + \", name=\" + name + \", description=\"\r\n\t\t\t\t+ description + \", startDate=\" + startDate + \", endDate=\"\r\n\t\t\t\t+ endDate + \", tutor=\" + tutor + \", students=\" + students + \"]\";\r\n\t}\r\n\tpublic Integer getCourseId()\r\n\t{\r\n\t\treturn courseId;\r\n\t}\r\n\tpublic void setCourseId(Integer id)\r\n\t{\r\n\t\tthis.courseId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getDescription()\r\n\t{\r\n\t\treturn description;\r\n\t}\r\n\tpublic void setDescription(String description)\r\n\t{\r\n\t\tthis.description = description;\r\n\t}\r\n\tpublic Date getStartDate()\r\n\t{\r\n\t\treturn startDate;\r\n\t}\r\n\tpublic void setStartDate(Date startDate)\r\n\t{\r\n\t\tthis.startDate = startDate;\r\n\t}\r\n\tpublic Date getEndDate()\r\n\t{\r\n\t\treturn endDate;\r\n\t}\r\n\tpublic void setEndDate(Date endDate)\r\n\t{\r\n\t\tthis.endDate = endDate;\r\n\t}\r\n\tpublic List<Student> getStudents()\r\n\t{\r\n\t\tif(students == null){\r\n\t\t\tstudents = new ArrayList<Student>(0);\r\n\t\t}\r\n\t\treturn students;\r\n\t}\r\n\tpublic void setStudents(List<Student> students)\r\n\t{\r\n\t\tthis.students = students;\r\n\t}\r\n\tpublic Tutor getTutor() {\r\n\t\treturn tutor;\r\n\t}\r\n\tpublic void setTutor(Tutor tutor) {\r\n\t\tthis.tutor = tutor;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/domain/PhoneNumber.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneNumber  implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate String countryCode;\r\n\tprivate String stateCode;\r\n\tprivate String number;\r\n\t\r\n\tpublic PhoneNumber() {\r\n\t}\r\n\r\n\tpublic PhoneNumber(String countryCode, String stateCode, String number) {\r\n\t\tsuper();\r\n\t\tthis.countryCode = countryCode;\r\n\t\tthis.stateCode = stateCode;\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic PhoneNumber(String string) {\r\n\t\tif(string != null){\r\n\t\t\tString[] parts = string.split(\"-\");\r\n\t\t\tif(parts.length>0) this.countryCode=parts[0];\r\n\t\t\tif(parts.length>1) this.stateCode=parts[1];\r\n\t\t\tif(parts.length>2) this.number=parts[2];\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\t\r\n\t/*@Override\r\n\tpublic String toString() {\r\n\t\treturn this.getAsString();\r\n\t}*/\r\n\t\r\n\tpublic String getCountryCode() {\r\n\t\treturn countryCode;\r\n\t}\r\n\r\n\tpublic void setCountryCode(String countryCode) {\r\n\t\tthis.countryCode = countryCode;\r\n\t}\r\n\r\n\tpublic String getStateCode() {\r\n\t\treturn stateCode;\r\n\t}\r\n\r\n\tpublic void setStateCode(String stateCode) {\r\n\t\tthis.stateCode = stateCode;\r\n\t}\r\n\r\n\tpublic String getNumber() {\r\n\t\treturn number;\r\n\t}\r\n\r\n\tpublic void setNumber(String number) {\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic String getAsString() {\r\n\t\treturn countryCode+\"-\"+stateCode+\"-\"+number;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/domain/Student.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Student implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\tprivate Integer studId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate PhoneNumber phone;\r\n\tprivate Address address;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Student [studId=\" + studId + \", name=\" + name + \", email=\" + email\r\n\t\t\t\t+ \", phone=\" + (phone==null?null:phone.getAsString()) + \", address=\" + address + \"]\";\r\n\t}\r\n\tpublic Student()\r\n\t{\r\n\t}\r\n\tpublic Student(Integer id)\r\n\t{\r\n\t\tthis.studId = id;\r\n\t}\r\n\tpublic Integer getStudId()\r\n\t{\r\n\t\treturn studId;\r\n\t}\r\n\tpublic void setStudId(Integer id)\r\n\t{\r\n\t\tthis.studId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail()\r\n\t{\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email)\r\n\t{\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Address getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(Address address) {\r\n\t\tthis.address = address;\r\n\t}\r\n\tpublic PhoneNumber getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\tpublic void setPhone(PhoneNumber phone) {\r\n\t\tthis.phone = phone;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/domain/Tutor.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.List;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Tutor implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer tutorId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate Address address;\r\n\tprivate List<Course> courses;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Tutor [tutorId=\" + tutorId + \", name=\" + name + \", email=\" + email\r\n\t\t\t\t+ \", address=\" + address + \", courses=\" + courses + \"]\";\r\n\t}\r\n\tpublic Tutor()\r\n\t{\r\n\t}\r\n\tpublic Tutor(Integer id)\r\n\t{\r\n\t\tthis.tutorId = id;\r\n\t}\r\n\tpublic Integer getTutorId()\r\n\t{\r\n\t\treturn tutorId;\r\n\t}\r\n\tpublic void setTutorId(Integer id)\r\n\t{\r\n\t\tthis.tutorId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail()\r\n\t{\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email)\r\n\t{\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Address getAddress()\r\n\t{\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(Address address)\r\n\t{\r\n\t\tthis.address = address;\r\n\t}\r\n\tpublic List<Course> getCourses() {\r\n\t\treturn courses;\r\n\t}\r\n\tpublic void setCourses(List<Course> courses) {\r\n\t\tthis.courses = courses;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/mappers/AddressMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport com.mybatis3.domain.Address;\r\n\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface AddressMapper\r\n{\r\n\tAddress findAddressById(Integer id);\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/mappers/CourseMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.mybatis3.domain.Course;\r\n\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface CourseMapper\r\n{\r\n\r\n\tList<Course> selectCoursesByTutor(int tutorId);\r\n\r\n\tList<Course> searchCourses(Map<String, Object> map);\r\n\r\n\tList<Course> searchCoursesByTutors(Map<String, Object> map);\r\n\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/mappers/StudentMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.mybatis3.domain.Student;\r\n\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface StudentMapper\r\n{\r\n\r\n\tList<Student> findAllStudents();\r\n\r\n\tStudent findStudentById(Integer id);\r\n\r\n\tStudent selectStudentWithAddress(int id);\r\n\t\r\n\tvoid insertStudent(Student student);\r\n\t\r\n\tvoid insertStudentWithMap(Map<String, Object> map);\r\n\r\n\tvoid updateStudent(Student student);\r\n\t\r\n\tint deleteStudent(int id);\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/mappers/TutorMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\n\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface TutorMapper\r\n{\r\n\r\n\tTutor selectTutorWithCourses(int tutorId);\r\n\t\r\n\tTutor selectTutorById(int tutorId);\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/services/CourseService.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.session.SqlSession;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.mybatis3.domain.Course;\nimport com.mybatis3.mappers.CourseMapper;\nimport com.mybatis3.util.MyBatisUtil;\n\n\npublic class CourseService \n{\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\tpublic List<Course> searchCourses(Map<String, Object> map) \n\t{\n\t\tlogger.debug(\"searchCourses By :\"+map);\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tCourseMapper mapper = sqlSession.getMapper(CourseMapper.class);\n\t\t\treturn mapper.searchCourses(map);\n\t\t} \n\t\t\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\n\tpublic List<Course> searchCoursesByTutors(Map<String, Object> map) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tCourseMapper mapper = sqlSession.getMapper(CourseMapper.class);\n\t\t\treturn mapper.searchCoursesByTutors(map);\n\t\t} \n\t\t\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/services/StudentService.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.session.SqlSession;\n\nimport com.mybatis3.domain.Student;\nimport com.mybatis3.mappers.StudentMapper;\nimport com.mybatis3.util.MyBatisUtil;\n\n\npublic class StudentService \n{\n\t\n\tpublic List<Student> findAllStudents()\n\t{\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findAllStudents();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student findStudentById(Integer id)\n\t{\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findStudentById(id);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\n\tpublic Student findStudentWithAddressById(int id) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.selectStudentWithAddress(id);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student createStudent(Student student) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tmapper.insertStudent(student);\n\t\t\tsqlSession.commit();\n\t\t\treturn student;\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic void createStudentWithMap(Map<String, Object> studentDataMap) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tmapper.insertStudentWithMap(studentDataMap);\n\t\t\tsqlSession.commit();\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\n\tpublic Student updateStudent(Student student) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tmapper.updateStudent(student);\n\t\t\tsqlSession.commit();\n\t\t\treturn student;\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic boolean deleteStudent(int id) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tint count = mapper.deleteStudent(id);\n\t\t\tsqlSession.commit();\n\t\t\treturn count > 0;\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/services/TutorService.java",
    "content": "package com.mybatis3.services;\n\nimport org.apache.ibatis.session.SqlSession;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.mybatis3.domain.Tutor;\nimport com.mybatis3.mappers.TutorMapper;\nimport com.mybatis3.util.MyBatisUtil;\n\n\npublic class TutorService \n{\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\t\n\tpublic Tutor findTutorById(int tutorId) {\n\t\tlogger.debug(\"findTutorById :\"+tutorId);\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\n\t\t\treturn mapper.selectTutorById(tutorId);\n\t\t} \n\t\t\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\n\t\n}\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.typehandlers;\r\n\r\nimport java.sql.CallableStatement;\r\nimport java.sql.PreparedStatement;\r\nimport java.sql.ResultSet;\r\nimport java.sql.SQLException;\r\n\r\nimport org.apache.ibatis.type.BaseTypeHandler;\r\nimport org.apache.ibatis.type.JdbcType;\r\n\r\nimport com.mybatis3.domain.PhoneNumber;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{\r\n\r\n\t@Override\r\n\tpublic void setNonNullParameter(PreparedStatement ps, int i,\r\n\t\t\tPhoneNumber parameter, JdbcType jdbcType) throws SQLException {\r\n\t\tps.setString(i, parameter.getAsString());\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, String columnName)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnName));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnIndex));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(cs.getString(columnIndex));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/java/com/mybatis3/util/MyBatisUtil.java",
    "content": "package com.mybatis3.util;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.sql.Connection;\r\nimport java.sql.DriverManager;\r\nimport java.util.Properties;\r\n\r\nimport org.apache.ibatis.datasource.DataSourceFactory;\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.session.SqlSessionFactory;\r\nimport org.apache.ibatis.session.SqlSessionFactoryBuilder;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class MyBatisUtil\r\n{\r\n\tprivate static final String DEFAULT_MYBATIS_CONFIG_FILE=\"mybatis-config.xml\";\r\n\tprivate static SqlSessionFactory sqlSessionFactory;\r\n\t\r\n\tprivate static final Properties PROPERTIES = new Properties();\r\n\t\r\n\tstatic\r\n\t{\r\n\t\ttry {\r\n\t\t\tInputStream is = DataSourceFactory.class.getResourceAsStream(\"/application.properties\");\r\n\t\t\tPROPERTIES.load(is);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\tpublic static SqlSessionFactory getSqlSessionFactory()\r\n\t{\r\n\t\tif(sqlSessionFactory==null){\r\n\t\t\t//org.apache.ibatis.logging.LogFactory.useLog4JLogging();\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tInputStream inputStream = Resources.getResourceAsStream(DEFAULT_MYBATIS_CONFIG_FILE);\r\n\t\t\t\tsqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);\r\n\t\t\t} catch (IOException e)\r\n\t\t\t{\r\n\t\t\t\tthrow new RuntimeException(e.getCause());\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sqlSessionFactory;\r\n\t}\r\n\t\r\n\t\r\n\tpublic static Connection getConnection() \r\n\t{\r\n\t\tString driver = PROPERTIES.getProperty(\"jdbc.driverClassName\");\r\n\t\tString url = PROPERTIES.getProperty(\"jdbc.url\");\r\n\t\tString username = PROPERTIES.getProperty(\"jdbc.username\");\r\n\t\tString password = PROPERTIES.getProperty(\"jdbc.password\");\r\n\t\tConnection connection = null;\r\n\t\ttry {\r\n\t\t\tClass.forName(driver);\r\n\t\t\tconnection = DriverManager.getConnection(url, username, password);\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t} \r\n\t\treturn connection;\r\n\t}\r\n\t\t\r\n}\r\n"
  },
  {
    "path": "chapter03/src/main/resources/application.properties",
    "content": "\r\n\r\n################### DataSource Configuration ##########################\r\n\r\njdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/elearning\r\njdbc.username=root\r\njdbc.password=admin\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "chapter03/src/main/resources/com/mybatis3/mappers/AddressMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.AddressMapper\">\r\n\t\r\n  \t<resultMap type=\"Address\" id=\"AddressResult\">\r\n  \t\t<id property=\"addrId\" column=\"addr_id\"/>\r\n\t\t<result property=\"street\" column=\"street\"/>\r\n\t\t<result property=\"city\" column=\"city\"/>\r\n\t\t<result property=\"state\" column=\"state\"/>\r\n\t\t<result property=\"zip\" column=\"zip\"/>\r\n\t\t<result property=\"country\" column=\"country\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<select id=\"selectAddressById\" parameterType=\"int\" resultMap=\"AddressResult\">\r\n  \t\tselect * from addresses where addr_id=#{addrId}\r\n  \t</select>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter03/src/main/resources/com/mybatis3/mappers/CourseMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.CourseMapper\">\r\n\t\r\n\t<cache eviction=\"FIFO\" flushInterval=\"60000\" size=\"512\" readOnly=\"false\"/>\r\n\t\r\n  \t<resultMap type=\"Course\" id=\"CourseResult\">\r\n  \t\t<id \tcolumn=\"course_id\" property=\"courseId\"/>\r\n  \t\t<result column=\"name\" property=\"name\"/>\r\n  \t\t<result column=\"description\" property=\"description\"/>\r\n  \t\t<result column=\"start_date\" property=\"startDate\"/>\r\n  \t\t<result column=\"end_date\" property=\"endDate\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<select id=\"selectCoursesByTutor\" parameterType=\"int\" resultMap=\"CourseResult\">\r\n  \t\tselect * from courses where tutor_id=#{tutorId}\r\n  \t</select>\r\n  \t\r\n  \t<select id=\"searchCourses\" parameterType=\"hashmap\" resultMap=\"CourseResult\" useCache=\"false\">\r\n  \t\tSELECT * FROM COURSES\r\n  \t\tWHERE TUTOR_ID= #{tutorId}\r\n  \t\t<if test=\"courseName != null\">\r\n  \t\t\tAND name like #{courseName}\r\n  \t\t</if>\r\n  \t\t<if test=\"startDate != null\">\r\n  \t\t\tAND start_date  &gt;= #{startDate}\r\n  \t\t</if>\r\n  \t\t<if test=\"endDate != null\">\r\n  \t\t\tAND end_date  &lt;= #{endDate}\r\n  \t\t</if>\r\n  \t\t\r\n  \t</select>\r\n  \t\r\n  \t<select id=\"searchCoursesByTutors\" parameterType=\"hashmap\" resultMap=\"CourseResult\">\r\n  \t\tSELECT * FROM COURSES\r\n  \t\t<if test=\"tutorIds != null\">\r\n  \t\t<where>\r\n  \t\ttutor_id IN\r\n  \t\t<foreach item=\"tutorId\" collection=\"tutorIds\"\r\n\t      open=\"(\" separator=\",\" close=\")\">\r\n\t        #{tutorId}\r\n\t  \t</foreach>\r\n   \t\t</where>  \t\t\r\n   \t\t</if>\r\n  \t</select>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter03/src/main/resources/com/mybatis3/mappers/StudentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.StudentMapper\">\r\n\t\r\n\t<resultMap type=\"Student\" id=\"StudentResult\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\" />\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<result property=\"phone\" column=\"phone\"/>\r\n\t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Student\" id=\"StudentWithAddressExtResult\" extends=\"StudentResult\">\r\n\t\t<result property=\"address.addrId\" column=\"addr_id\"/>\r\n\t\t<result property=\"address.street\" column=\"street\"/>\r\n\t\t<result property=\"address.city\" column=\"city\"/>\r\n\t\t<result property=\"address.state\" column=\"state\"/>\r\n\t\t<result property=\"address.zip\" column=\"zip\"/>\r\n\t\t<result property=\"address.country\" column=\"country\"/>\r\n\t</resultMap>\r\n\t\r\n  \t<resultMap type=\"Student\" id=\"StudentWithAddressNestedSelect\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\"/>\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<association property=\"address\" column=\"addr_id\" select=\"com.mybatis3.mappers.AddressMapper.selectAddressById\"/>\r\n\t</resultMap>\r\n\t\r\n\t<resultMap type=\"Student\" id=\"StudentWithAddressNestedResultMap\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\"/>\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<association property=\"address\" javaType=\"Address\">\r\n\t\t\t<id property=\"addrId\" column=\"addr_id\"/>\r\n\t\t\t<result property=\"street\" column=\"street\"/>\r\n\t\t\t<result property=\"city\" column=\"city\"/>\r\n\t\t\t<result property=\"state\" column=\"state\"/>\r\n\t\t\t<result property=\"zip\" column=\"zip\"/>\r\n\t\t\t<result property=\"country\" column=\"country\"/>\r\n\t\t</association>\r\n\t</resultMap>\r\n\t\r\n\t<select id=\"findAllStudents\" resultMap=\"StudentResult\">\r\n    \tselect * from Students\r\n  \t</select>\r\n  \t\r\n  \t<select id=\"findStudentById\" parameterType=\"int\" resultMap=\"StudentWithAddressNestedSelect\">\r\n    \tselect * from Students where stud_id=#{studId}\r\n  \t</select>\r\n  \t  \t  \t\r\n  \t<select id=\"selectStudentWithAddress\" parameterType=\"int\" resultMap=\"StudentWithAddressNestedResultMap\">\r\n  \t\tselect stud_id, name, email,phone, a.addr_id, street, city, state, zip, country\r\n  \t\tFROM students s left outer join addresses a on s.addr_id=a.addr_id\r\n\t\twhere stud_id=#{studId}\r\n  \t</select>\r\n  \t\r\n  \t<insert id=\"insertStudent\" parameterType=\"Student\" useGeneratedKeys=\"true\" keyProperty=\"studId\">\r\n  \t\tinsert into students(name,email,addr_id, phone)\r\n  \t\tvalues(#{name},#{email},#{address.addrId},#{phone})\r\n  \t</insert>\r\n  \t\r\n  \t<insert id=\"insertStudentWithMap\" parameterType=\"hashmap\" useGeneratedKeys=\"true\" keyProperty=\"studId\">\r\n  \t\tinsert into students(name,email,addr_id,phone)\r\n  \t\tvalues(#{name},#{email},#{address.addrId},#{phone})\r\n  \t</insert>\r\n  \t\r\n  \t<update id=\"updateStudent\" parameterType=\"Student\">\r\n  \t\tupdate students \r\n  \t\t<!-- set \r\n  \t\tname=#{name}, \r\n  \t\temail=#{email}, \r\n  \t\tphone=#{phone}\r\n  \t\twhere stud_id=#{studId} -->\r\n  \t\t\r\n  \t\t<set>\r\n      \t\t<if test=\"name != null\">name=#{name},</if>\r\n      \t\t<if test=\"email != null\">email=#{email},</if>\r\n      \t\t<if test=\"phone != null\">phone=#{phone},</if>\r\n      \t</set>\r\n      \twhere stud_id=#{studId}\r\n  \t</update>\r\n  \t\r\n  \t<delete id=\"deleteStudent\" parameterType=\"int\">\r\n  \t\tdelete from students where stud_id=#{studId}\r\n  \t</delete>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter03/src/main/resources/com/mybatis3/mappers/TutorMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.TutorMapper\">\r\n\t\r\n\t\r\n  \t<resultMap type=\"Tutor\" id=\"TutorWithCoursesNestedResult\">\r\n  \t\t<id \tcolumn=\"tutor_id\" property=\"tutorId\"/>\r\n  \t\t<result column=\"tutor_name\" property=\"name\"/>\r\n  \t\t<result column=\"email\" property=\"email\"/>\r\n  \t\t<association property=\"address\" resultMap=\"com.mybatis3.mappers.AddressMapper.AddressResult\"/>\r\n  \t\t<collection property=\"courses\"  resultMap=\"com.mybatis3.mappers.CourseMapper.CourseResult\"  />\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Tutor\" id=\"TutorWithCoursesNestedSelect\">\r\n  \t\t<id \tcolumn=\"tutor_id\" property=\"tutorId\"/>\r\n  \t\t<result column=\"tutor_name\" property=\"name\"/>\r\n  \t\t<result column=\"email\" property=\"email\"/>\r\n  \t\t<association property=\"address\" resultMap=\"com.mybatis3.mappers.AddressMapper.AddressResult\"/>\r\n  \t\t<collection property=\"courses\"  column=\"tutor_id\" select=\"com.mybatis3.mappers.CourseMapper.selectCoursesByTutor\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<select id=\"selectTutorById\" parameterType=\"int\" resultMap=\"TutorWithCoursesNestedResult\">\r\n  \t\tSELECT t.tutor_id, t.name as tutor_name, email, a.addr_id, street, city, state, zip, country,\r\n       \t\t\tcourse_id, c.name, description, start_date, end_date\r\n\t\tFROM tutors t left outer join addresses a on t.addr_id=a.addr_id\r\n\t\t  left outer join courses c on t.tutor_id=c.tutor_id\r\n\t\twhere t.tutor_id=#{tutorId}\r\n  \t</select>\r\n  \t\r\n  \t<select id=\"selectTutorWithCourses\" parameterType=\"int\" resultMap=\"TutorWithCoursesNestedSelect\">\r\n  \t\tSELECT t.tutor_id, t.name as tutor_name, email, a.addr_id, street, city, state, zip, country\r\n\t\tFROM tutors t left outer join addresses a on t.addr_id=a.addr_id\r\n\t\twhere t.tutor_id=#{tutorId}\r\n  \t</select>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter03/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.com.mybatis3=DEBUG"
  },
  {
    "path": "chapter03/src/main/resources/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE configuration\r\n  PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\r\n<configuration>\r\n\r\n\t<properties resource=\"application.properties\" />\r\n\r\n\t<typeAliases>\r\n\t\t<package name=\"com.mybatis3.domain\" />\r\n\t</typeAliases>\r\n\r\n\t<typeHandlers>\r\n\t\t<typeHandler handler=\"com.mybatis3.typehandlers.PhoneTypeHandler\" />\r\n\t</typeHandlers>\r\n\r\n\t<environments default=\"development\">\r\n\t\t<environment id=\"development\">\r\n\t\t\t<transactionManager type=\"JDBC\" />\r\n\t\t\t<dataSource type=\"POOLED\">\r\n\t\t\t\t<property name=\"driver\" value=\"${jdbc.driverClassName}\" />\r\n\t\t\t\t<property name=\"url\" value=\"${jdbc.url}\" />\r\n\t\t\t\t<property name=\"username\" value=\"${jdbc.username}\" />\r\n\t\t\t\t<property name=\"password\" value=\"${jdbc.password}\" />\r\n\t\t\t</dataSource>\r\n\t\t</environment>\r\n\r\n\t</environments>\r\n\r\n\t<mappers>\r\n\t\t<package name=\"com.mybatis3.mappers\"/>\r\n\t</mappers>\r\n\r\n</configuration>"
  },
  {
    "path": "chapter03/src/main/resources/sql/create_tables.sql",
    "content": "\r\nCREATE TABLE ADDRESSES \r\n(\r\n  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  STREET VARCHAR(50) NOT NULL,\r\n  CITY VARCHAR(50) NOT NULL,\r\n  STATE VARCHAR(50) NOT NULL,\r\n  ZIP VARCHAR(10) DEFAULT NULL,\r\n  COUNTRY VARCHAR(50) NOT NULL,\r\n  PRIMARY KEY (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE STUDENTS \r\n(\r\n  STUD_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  GENDER VARCHAR(6) DEFAULT NULL, \r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,  \r\n  PRIMARY KEY (STUD_ID),\r\n  UNIQUE KEY UK_EMAIL (EMAIL),\r\n  CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE TUTORS \r\n(\r\n  TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  GENDER VARCHAR(6) DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,\r\n  PRIMARY KEY (TUTOR_ID),\r\n  UNIQUE KEY UK_EMAIL (EMAIL),\r\n  CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)  \r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSES \r\n(\r\n  COURSE_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(100) NOT NULL,\r\n  DESCRIPTION VARCHAR(512) DEFAULT NULL,\r\n  START_DATE DATE DEFAULT NULL,\r\n  END_DATE DATE DEFAULT NULL,\r\n  TUTOR_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID),\r\n  CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSE_ENROLLMENT\r\n(\r\n  COURSE_ID INT(11) NOT NULL,\r\n  STUD_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID,STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID)\r\n) ENGINE=INNODB DEFAULT CHARSET=LATIN1;\r\n\r\n"
  },
  {
    "path": "chapter03/src/main/resources/sql/drop_tables.sql",
    "content": "\r\nDROP TABLE IF EXISTS USER_PICS;\r\nDROP TABLE IF EXISTS COURSE_ENROLLMENT;\r\nDROP TABLE IF EXISTS COURSES;\r\nDROP TABLE IF EXISTS TUTORS;\r\nDROP TABLE IF EXISTS STUDENTS;\r\nDROP TABLE IF EXISTS ADDRESSES;\r\n\r\n"
  },
  {
    "path": "chapter03/src/main/resources/sql/sample_data.sql",
    "content": "\n\n--Sample data for table ADDRESSES\n\nINSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES \n (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'),\n (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'),\n (3,'710 N Cable Rd','Lima','OH','45825','Allen'),\n (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche');\n\n-- Sample data for table STUDENTS\n\nINSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,BIO,PIC,ADDR_ID) VALUES \n (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25',NULL,NULL,3),\n (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15',NULL,NULL,4);\n\n-- Sample data for table TUTORS\n\nINSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES \n (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),\n (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),\n (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2),\n (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2);\n\n-- Sample data for table courses\n\nINSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES \n (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1),\n (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1),\n (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2);\n\n-- Sample data for table COURSE_ENROLLMENT\n\nINSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES \n (1,1),\n (1,2),\n (2,2);\n\n"
  },
  {
    "path": "chapter03/src/test/java/com/mybatis3/services/CourseServiceTest.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.junit.AfterClass;\nimport org.junit.Assert;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport com.mybatis3.domain.Course;\n\npublic class CourseServiceTest \n{\n\tprivate static CourseService courseService;\n\t\n\t@BeforeClass\n\tpublic static void setup()\n\t{\n\t\tTestDataPopulator.initDatabase();\n\t\tcourseService = new CourseService();\n\t}\n\t\n\t@AfterClass\n\tpublic static void teardown()\n\t{\n\t\tcourseService = null;\n\t}\n\t\n\t@Test\n\tpublic void searchCourses() \n\t{\n\t\tMap<String, Object> map = new HashMap<String, Object>();\n\t\tmap.put(\"tutorId\", 1);\n\t\t//map.put(\"courseName\", \"%java%\");\n\t\tmap.put(\"startDate\", new Date());\n\t\tList<Course> courses = courseService.searchCourses(map);\n\t\tAssert.assertNotNull(courses);\n\t\tfor (Course course : courses) {\n\t\t\tAssert.assertNotNull(course);\n\t\t\t//System.out.println(course);\n\t\t}\n\t}\n\t\n\t@Test\n\tpublic void searchCoursesByTutors() \n\t{\n\t\tMap<String, Object> map = new HashMap<String, Object>();\n\t\tList<Integer> tutorIds = new ArrayList<Integer>();\n\t\ttutorIds.add(1);\n\t\ttutorIds.add(2);\n\t\tmap.put(\"tutorIds\", tutorIds);\n\t\tmap.put(\"courseName\", \"%java%\");\n\t\tmap.put(\"startDate\", new Date());\n\t\tList<Course> courses = courseService.searchCoursesByTutors(map);\n\t\tAssert.assertNotNull(courses);\n\t\tfor (Course course : courses) {\n\t\t\tAssert.assertNotNull(course);\n\t\t\t//System.out.println(course);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "chapter03/src/test/java/com/mybatis3/services/StudentServiceTest.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.junit.AfterClass;\nimport static org.junit.Assert.*;\n\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport com.mybatis3.domain.PhoneNumber;\nimport com.mybatis3.domain.Student;\n\n\n\npublic class StudentServiceTest \n{\n\tprivate static StudentService studentService;\n\t\n\t@BeforeClass\n\tpublic static void setup()\n\t{\n\t\tstudentService = new StudentService();\n\t\tTestDataPopulator.initDatabase();\n\t}\n\t\n\t@AfterClass\n\tpublic static void teardown()\n\t{\n\t\tstudentService = null;\n\t}\n\t\n\t@Test\n    public void testFindAllStudents() \n\t{\n\t\tList<Student> students = studentService.findAllStudents();\n\t\tassertNotNull(students);\n\t\tfor (Student student : students)\n\t\t{\n\t\t\tassertNotNull(student);\n\t\t\t//System.out.println(student);\n\t\t}\n\t\t\n\t}\n\t\n\t@Test\n    public void testFindStudentById() \n\t{\n\t\tStudent student = studentService.findStudentById(1);\n\t\tassertNotNull(student);\n\t\tSystem.out.println(student);\n\t}\n\t\n\t@Test\n    public void testFindStudentWithAddressById() \n\t{\n\t\tStudent student = studentService.findStudentWithAddressById(1);\n\t\tassertNotNull(student);\n\t\tSystem.out.println(student);\n\t}\n\t\n\t@Test\n\tpublic void testCreateStudent() \n\t{\n\t\tStudent stud = new Student();\n\t\tlong ts = System.currentTimeMillis();\n\t\tstud.setName(\"stud_\"+ts);\n\t\tstud.setEmail(\"stud_\"+ts+\"@gmail.com\");\n\t\tstud.setPhone(new PhoneNumber(\"123-456-7890\"));\n\t\tStudent student = studentService.createStudent(stud);\n\t\tassertNotNull(student);\n\t\tassertEquals(\"stud_\"+ts, student.getName());\n\t\tassertEquals(\"stud_\"+ts+\"@gmail.com\", student.getEmail());\n\t\tSystem.out.println(\"Created Student:\"+student);\n\t\t\n\t}\n\t\n\t@Test\n\tpublic void testCreateStudentWithMap() \n\t{\n\t\tMap<String, Object> studMap = new HashMap<String, Object>();\n\t\tlong ts = System.currentTimeMillis();\n\t\tstudMap.put(\"name\",\"stud_\"+ts);\n\t\tstudMap.put(\"email\",\"stud_\"+ts+\"@gmail.com\");\n\t\tstudMap.put(\"phone\",null);\n\t\tstudentService.createStudentWithMap(studMap);\n\t}\n\t\n\t@Test\n\tpublic void testUpdateStudent() \n\t{\n\t\tStudent stud = new Student();\n\t\tlong ts = System.currentTimeMillis();\n\t\tstud.setStudId(2);\n\t\tstud.setName(\"stud_\"+ts);\n\t\tstud.setEmail(\"stud_\"+ts+\"@gmail.com\");\n\t\tStudent updatedStudent = studentService.updateStudent(stud);\n\t\tassertNotNull(updatedStudent);\n\t\tassertEquals(\"stud_\"+ts, updatedStudent.getName());\n\t\tassertEquals(\"stud_\"+ts+\"@gmail.com\", updatedStudent.getEmail());\n\t\t\n\t}\n\t\n\t@Test\n\tpublic void testDeleteStudent() \n\t{\n\t\tboolean deleteStudent = studentService.deleteStudent(3);\n\t\tassertTrue(deleteStudent);\n\t\tSystem.out.println(\"deleteStudent:\"+deleteStudent);\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "chapter03/src/test/java/com/mybatis3/services/TestDataPopulator.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.io.Reader;\r\nimport java.sql.Connection;\r\n\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.jdbc.ScriptRunner;\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport com.mybatis3.util.MyBatisUtil;;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TestDataPopulator \r\n{\r\n\tprivate static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class);\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tinitDatabase();\r\n\t}\r\n\t\r\n\tpublic static void initDatabase()\r\n\t{\r\n\t\tConnection connection = null;\r\n\t\tReader reader = null;\r\n\t\ttry {\r\n\t\t\tconnection = MyBatisUtil.getConnection();\r\n\t\t\tScriptRunner scriptRunner = new ScriptRunner(connection);\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/drop_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader);\r\n\t\t\tlogger.info(\"drop_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/create_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"create_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/sample_data.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"sample_data.sql executed successfully\");\r\n\t\t\tconnection.commit();\r\n\t\t\treader.close();\r\n\t\t\tscriptRunner.closeConnection();\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter03/src/test/java/com/mybatis3/services/TutorServiceTest.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\n\nimport org.junit.AfterClass;\nimport org.junit.Assert;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport com.mybatis3.domain.Course;\nimport com.mybatis3.domain.Tutor;\n\n\n\npublic class TutorServiceTest \n{\n\tprivate static TutorService tutorService;\n\t\n\t@BeforeClass\n\tpublic static void setup()\n\t{\n\t\tTestDataPopulator.initDatabase();\n\t\ttutorService = new TutorService();\n\t}\n\t\n\t@AfterClass\n\tpublic static void teardown()\n\t{\n\t\ttutorService = null;\n\t}\n\t\n\t\n\t@Test\n\tpublic void testFindTutorById() {\n\t\tTutor tutor = tutorService.findTutorById(1);\n\t\tAssert.assertNotNull(tutor);\n\t\tList<Course> courses = tutor.getCourses();\n\t\tAssert.assertNotNull(courses);\n\t\tfor (Course course : courses) \n\t\t{\n\t\t\tAssert.assertNotNull(course);\n\t\t\tSystem.out.println(course);\n\t\t}\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "chapter04/README.txt",
    "content": "Chapter 4: SQL Mappers using Annotations\r\n========================================\r\nThis chapter describes mapping SQL statements and query results to java beans in SQL Mappers using Annotation based approach.\r\nTopics covered:\t\t\t\r\n\t•\tCRUD Mapping\r\n\t•\tResultSet Mapping\r\n\t•\tOne-To-One, One-To-Many mappings\r\n\t•\tDynamic SQL mapping\t\r\n\r\nHow to Run:\r\n\tUpdate the database properties in application.properties file.\r\n\tYou can run the JUnit tests in src/test/java folder.\r\n\tIn JUnit Tests we have Database Initialization logic to setup sample data.\r\n\t\r\n\tpublic class StudentServiceTest \r\n\t{\r\n\t\t@BeforeClass\r\n\t\tpublic static void setup() {\r\n\t\t\tstudentService = new StudentService();\r\n\t\t\tTestDataPopulator.initDatabase(); // this will drop and re-create database and populates sample data.\r\n\t\t}\r\n\t}\r\n"
  },
  {
    "path": "chapter04/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 \n\thttp://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.mybatis3</groupId>\n\t<artifactId>chapter04</artifactId>\n\t<version>0.0.1</version>\n\t<packaging>jar</packaging>\n\n\t<name>chapter04</name>\n\t<url>http://www.mybatis.org</url>\n\t<description>MyBatis Book Chapter 04</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.6</java.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<slf4j.version>1.7.5</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\t\t<mybatis.version>3.2.2</mybatis.version>\n\t\t<mysql.version>5.1.21</mysql.version>\n\t\t<maven.compiler.plugin>2.3.2</maven.compiler.plugin>\n\t</properties>\n\n\t<build>\n\t\t<finalName>${project.artifactId}</finalName>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>${maven.compiler.plugin}</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${java.version}</source>\n\t\t\t\t\t<target>${java.version}</target>\n\t\t\t\t\t<encoding>${project.build.sourceEncoding}</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t</build>\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis</artifactId>\n\t\t\t<version>${mybatis.version}</version>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n</project>\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/domain/Address.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Address implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer addrId;\r\n\tprivate String street;\r\n\tprivate String city;\r\n\tprivate String state;\r\n\tprivate String zip;\r\n\tprivate String country;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Address [addrId=\" + addrId + \", street=\" + street + \", city=\" + city\r\n\t\t\t\t+ \", state=\" + state + \", zip=\" + zip + \", country=\" + country\r\n\t\t\t\t+ \"]\";\r\n\t}\r\n\tpublic Address()\r\n\t{\r\n\t}\r\n\tpublic Address(Integer addrId)\r\n\t{\r\n\t\tthis.addrId = addrId;\r\n\t}\r\n\tpublic Address(Integer addrId, String street, String city, String state,\r\n\t\t\tString zip, String country)\r\n\t{\r\n\t\tthis.addrId = addrId;\r\n\t\tthis.street = street;\r\n\t\tthis.city = city;\r\n\t\tthis.state = state;\r\n\t\tthis.zip = zip;\r\n\t\tthis.country = country;\r\n\t}\r\n\tpublic Integer getAddrId() {\r\n\t\treturn addrId;\r\n\t}\r\n\tpublic void setAddrId(Integer addrId) {\r\n\t\tthis.addrId = addrId;\r\n\t}\r\n\tpublic String getStreet()\r\n\t{\r\n\t\treturn street;\r\n\t}\r\n\tpublic void setStreet(String street)\r\n\t{\r\n\t\tthis.street = street;\r\n\t}\r\n\tpublic String getCity()\r\n\t{\r\n\t\treturn city;\r\n\t}\r\n\tpublic void setCity(String city)\r\n\t{\r\n\t\tthis.city = city;\r\n\t}\r\n\tpublic String getState()\r\n\t{\r\n\t\treturn state;\r\n\t}\r\n\tpublic void setState(String state)\r\n\t{\r\n\t\tthis.state = state;\r\n\t}\r\n\tpublic String getZip()\r\n\t{\r\n\t\treturn zip;\r\n\t}\r\n\tpublic void setZip(String zip)\r\n\t{\r\n\t\tthis.zip = zip;\r\n\t}\r\n\tpublic String getCountry()\r\n\t{\r\n\t\treturn country;\r\n\t}\r\n\tpublic void setCountry(String country)\r\n\t{\r\n\t\tthis.country = country;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/domain/Course.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Course implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer courseId;\r\n\tprivate String name;\r\n\tprivate String description;\r\n\tprivate Date startDate;\r\n\tprivate Date endDate;\r\n\tprivate Tutor tutor;\r\n\tprivate List<Student> students;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Course [courseId=\" + courseId + \", name=\" + name + \", description=\"\r\n\t\t\t\t+ description + \", startDate=\" + startDate + \", endDate=\"\r\n\t\t\t\t+ endDate + \", tutor=\" + tutor + \", students=\" + students + \"]\";\r\n\t}\r\n\tpublic Integer getCourseId()\r\n\t{\r\n\t\treturn courseId;\r\n\t}\r\n\tpublic void setCourseId(Integer id)\r\n\t{\r\n\t\tthis.courseId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getDescription()\r\n\t{\r\n\t\treturn description;\r\n\t}\r\n\tpublic void setDescription(String description)\r\n\t{\r\n\t\tthis.description = description;\r\n\t}\r\n\tpublic Date getStartDate()\r\n\t{\r\n\t\treturn startDate;\r\n\t}\r\n\tpublic void setStartDate(Date startDate)\r\n\t{\r\n\t\tthis.startDate = startDate;\r\n\t}\r\n\tpublic Date getEndDate()\r\n\t{\r\n\t\treturn endDate;\r\n\t}\r\n\tpublic void setEndDate(Date endDate)\r\n\t{\r\n\t\tthis.endDate = endDate;\r\n\t}\r\n\tpublic List<Student> getStudents()\r\n\t{\r\n\t\tif(students == null){\r\n\t\t\tstudents = new ArrayList<Student>(0);\r\n\t\t}\r\n\t\treturn students;\r\n\t}\r\n\tpublic void setStudents(List<Student> students)\r\n\t{\r\n\t\tthis.students = students;\r\n\t}\r\n\tpublic Tutor getTutor() {\r\n\t\treturn tutor;\r\n\t}\r\n\tpublic void setTutor(Tutor tutor) {\r\n\t\tthis.tutor = tutor;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/domain/PhoneNumber.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneNumber  implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate String countryCode;\r\n\tprivate String stateCode;\r\n\tprivate String number;\r\n\t\r\n\tpublic PhoneNumber() {\r\n\t}\r\n\r\n\tpublic PhoneNumber(String countryCode, String stateCode, String number) {\r\n\t\tsuper();\r\n\t\tthis.countryCode = countryCode;\r\n\t\tthis.stateCode = stateCode;\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic PhoneNumber(String string) {\r\n\t\tif(string != null){\r\n\t\t\tString[] parts = string.split(\"-\");\r\n\t\t\tif(parts.length>0) this.countryCode=parts[0];\r\n\t\t\tif(parts.length>1) this.stateCode=parts[1];\r\n\t\t\tif(parts.length>2) this.number=parts[2];\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\t\r\n\t/*@Override\r\n\tpublic String toString() {\r\n\t\treturn this.getAsString();\r\n\t}*/\r\n\t\r\n\tpublic String getCountryCode() {\r\n\t\treturn countryCode;\r\n\t}\r\n\r\n\tpublic void setCountryCode(String countryCode) {\r\n\t\tthis.countryCode = countryCode;\r\n\t}\r\n\r\n\tpublic String getStateCode() {\r\n\t\treturn stateCode;\r\n\t}\r\n\r\n\tpublic void setStateCode(String stateCode) {\r\n\t\tthis.stateCode = stateCode;\r\n\t}\r\n\r\n\tpublic String getNumber() {\r\n\t\treturn number;\r\n\t}\r\n\r\n\tpublic void setNumber(String number) {\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic String getAsString() {\r\n\t\treturn countryCode+\"-\"+stateCode+\"-\"+number;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/domain/Student.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Student implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\tprivate Integer studId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate PhoneNumber phone;\r\n\tprivate Address address;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Student [studId=\" + studId + \", name=\" + name + \", email=\" + email\r\n\t\t\t\t+ \", phone=\" + (phone==null?null:phone.getAsString()) + \", address=\" + address + \"]\";\r\n\t}\r\n\tpublic Student()\r\n\t{\r\n\t}\r\n\tpublic Student(Integer id)\r\n\t{\r\n\t\tthis.studId = id;\r\n\t}\r\n\tpublic Integer getStudId()\r\n\t{\r\n\t\treturn studId;\r\n\t}\r\n\tpublic void setStudId(Integer id)\r\n\t{\r\n\t\tthis.studId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail()\r\n\t{\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email)\r\n\t{\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Address getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(Address address) {\r\n\t\tthis.address = address;\r\n\t}\r\n\tpublic PhoneNumber getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\tpublic void setPhone(PhoneNumber phone) {\r\n\t\tthis.phone = phone;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/domain/Tutor.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.List;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Tutor implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer tutorId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate Address address;\r\n\tprivate List<Course> courses;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Tutor [tutorId=\" + tutorId + \", name=\" + name + \", email=\" + email\r\n\t\t\t\t+ \", address=\" + address + \", courses=\" + courses + \"]\";\r\n\t}\r\n\tpublic Tutor()\r\n\t{\r\n\t}\r\n\tpublic Tutor(Integer id)\r\n\t{\r\n\t\tthis.tutorId = id;\r\n\t}\r\n\tpublic Integer getTutorId()\r\n\t{\r\n\t\treturn tutorId;\r\n\t}\r\n\tpublic void setTutorId(Integer id)\r\n\t{\r\n\t\tthis.tutorId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail()\r\n\t{\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email)\r\n\t{\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Address getAddress()\r\n\t{\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(Address address)\r\n\t{\r\n\t\tthis.address = address;\r\n\t}\r\n\tpublic List<Course> getCourses() {\r\n\t\treturn courses;\r\n\t}\r\n\tpublic void setCourses(List<Course> courses) {\r\n\t\tthis.courses = courses;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/mappers/AddressMapper.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.mappers;\r\n\r\nimport org.apache.ibatis.annotations.Select;\r\n\r\nimport com.mybatis3.domain.Address;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface AddressMapper \r\n{\r\n\t@Select(\"select addr_id as addrId, street, city, state, zip, country from addresses where addr_id=#{id}\")\r\n\tAddress selectAddressById(int id);\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/mappers/StudentMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport org.apache.ibatis.annotations.Delete;\r\nimport org.apache.ibatis.annotations.Insert;\r\nimport org.apache.ibatis.annotations.Options;\r\nimport org.apache.ibatis.annotations.Result;\r\nimport org.apache.ibatis.annotations.ResultMap;\r\nimport org.apache.ibatis.annotations.Results;\r\nimport org.apache.ibatis.annotations.Select;\r\nimport org.apache.ibatis.annotations.Update;\r\n\r\nimport com.mybatis3.domain.Student;\r\n\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface StudentMapper\r\n{\r\n\t\r\n\t@Select(\"select * from students\")\r\n\t@Results({\r\n\t\t\t@Result(id=true, column=\"stud_id\", property=\"studId\"),\r\n\t\t\t@Result(column=\"name\", property=\"name\"),\r\n\t\t\t@Result(column=\"email\", property=\"email\"),\r\n\t\t\t@Result(column=\"addr_id\", property=\"address.addrId\")\t\t\t\r\n\t})\r\n\tList<Student> findAllStudents();\r\n\r\n\t@Select(\"select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students\")\r\n\tList<Map<String,Object>> findAllStudentsMap();\r\n\t\r\n\t@Select(\"select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}\")\r\n\tStudent findStudentById(Integer id);\r\n\t\r\n\t@Select(\"select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}\")\r\n\tMap<String,Object> findStudentMapById(Integer id);\r\n\r\n\t@Select(\"select stud_id, name, email, a.addr_id, street, city, state, zip, country\"+\r\n  \t\t\" FROM students s left outer join addresses a on s.addr_id=a.addr_id\"+\r\n\t\t\" where stud_id=#{studId} \")\r\n\t@ResultMap(\"com.mybatis3.mappers.StudentMapper.StudentWithAddressResult\")\r\n\tStudent selectStudentWithAddress(int studId);\r\n\t\r\n\t@Insert(\"insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})\")\r\n\t@Options(useGeneratedKeys=true, keyProperty=\"studId\")\r\n\tvoid insertStudent(Student student);\r\n\t\r\n\t@Insert(\"insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})\")\r\n\t@Options(useGeneratedKeys=true, keyProperty=\"studId\")\r\n\tvoid insertStudentWithMap(Map<String, Object> map);\r\n\r\n\t@Update(\"update students set name=#{name}, email=#{email}, phone=#{phone} where stud_id=#{studId}\")\r\n\tvoid updateStudent(Student student);\r\n\t\r\n\t@Delete(\"delete from students where stud_id=#{studId}\")\r\n\tint deleteStudent(int studId);\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/mappers/TutorMapper.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\n\r\nimport org.apache.ibatis.annotations.DeleteProvider;\r\nimport org.apache.ibatis.annotations.InsertProvider;\r\nimport org.apache.ibatis.annotations.Many;\r\nimport org.apache.ibatis.annotations.One;\r\nimport org.apache.ibatis.annotations.Options;\r\nimport org.apache.ibatis.annotations.Param;\r\nimport org.apache.ibatis.annotations.Result;\r\nimport org.apache.ibatis.annotations.ResultMap;\r\nimport org.apache.ibatis.annotations.Results;\r\nimport org.apache.ibatis.annotations.Select;\r\nimport org.apache.ibatis.annotations.SelectProvider;\r\nimport org.apache.ibatis.annotations.UpdateProvider;\r\n\r\nimport com.mybatis3.domain.Course;\r\nimport com.mybatis3.domain.Tutor;\r\nimport com.mybatis3.sqlproviders.TutorDynaSqlProvider;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n\r\npublic interface TutorMapper \r\n{\r\n\t\r\n\t@Select(\"select * from courses where tutor_id=#{tutorId}\")\r\n\t@ResultMap(\"com.mybatis3.mappers.TutorMapper.CourseResult\")\r\n\tList<Course> selectCoursesByTutorId(int tutorId);\r\n\t\r\n\t@Select(\"SELECT tutor_id, t.name as tutor_name, email, addr_id FROM tutors t where t.tutor_id=#{tutorId}\")\r\n\t@Results({\r\n\t\t@Result(id=true, column=\"tutor_id\", property=\"tutorId\"),\r\n\t\t@Result(column=\"tutor_name\", property=\"name\"),\r\n\t\t@Result(column=\"email\", property=\"email\"),\r\n\t\t@Result(property=\"address\", column=\"addr_id\",\r\n\t\t\t\tone=@One(select=\"com.mybatis3.mappers.AddressMapper.selectAddressById\")),\t\t\r\n\t\t@Result(property=\"courses\", column=\"tutor_id\",\r\n\t\t\t\tmany=@Many(select=\"com.mybatis3.mappers.TutorMapper.selectCoursesByTutorId\"))\t\t\r\n\t})\r\n\tTutor selectTutorWithCoursesById(int tutorId);\r\n\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"findAllTutorsSql\")\r\n\tList<Tutor> findAllTutors();\r\n\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"findTutorByIdSql\")\r\n\tTutor findTutorById(int tutorId);\r\n\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"findTutorByNameAndEmailSql\")\r\n\tTutor findTutorByNameAndEmail(@Param(\"name\")String name, @Param(\"email\")String email);\r\n\t\r\n\t@InsertProvider(type=TutorDynaSqlProvider.class, method=\"insertTutor\")\r\n\t@Options(useGeneratedKeys=true, keyProperty=\"tutorId\")\r\n\tint insertTutor(Tutor tutor);\r\n\t\r\n\t@UpdateProvider(type=TutorDynaSqlProvider.class, method=\"updateTutor\")\r\n\tint updateTutor(Tutor tutor);\r\n\t\r\n\t@DeleteProvider(type=TutorDynaSqlProvider.class, method=\"deleteTutor\")\r\n\tint deleteTutor(int tutorId);\r\n\t\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"selectTutorById\")\r\n\t@ResultMap(\"com.mybatis3.mappers.TutorMapper.TutorResult\")\r\n\tTutor selectTutorById(int tutorId);\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/services/StudentService.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.session.SqlSession;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.mybatis3.domain.Student;\nimport com.mybatis3.mappers.StudentMapper;\nimport com.mybatis3.util.MyBatisUtil;\n\npublic class StudentService \n{\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\tpublic List<Student> findAllStudents()\n\t{\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn StudentMapper.findAllStudents();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student findStudentById(Integer id)\n\t{\n\t\tlogger.debug(\"findStudentById :\"+id);\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findStudentById(id);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\n\tpublic Student findStudentWithAddressById(int id) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.selectStudentWithAddress(id);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Student createStudent(Student student) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tmapper.insertStudent(student);\n\t\t\tsqlSession.commit();\n\t\t\treturn student;\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic void createStudentWithMap(Map<String, Object> studentDataMap) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tmapper.insertStudentWithMap(studentDataMap);\n\t\t\tsqlSession.commit();\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\n\tpublic Student updateStudent(Student student) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tmapper.updateStudent(student);\n\t\t\tsqlSession.commit();\n\t\t\treturn student;\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic boolean deleteStudent(int id) {\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper mapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\tint count = mapper.deleteStudent(id);\n\t\t\tsqlSession.commit();\n\t\t\treturn count > 0;\n\t\t} \n\t\tcatch (Exception e) {\n\t\t\tsqlSession.rollback();\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(e.getCause());\n\t\t}\n\t\tfinally {\n\t\t\tsqlSession.close();\n\t\t}\n\t}\n\t\n\tpublic Map<String, Object> findStudentMapById(int id) {\n\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn studentMapper.findStudentMapById(id);\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t\n\t}\n\n\tpublic List<Map<String, Object>> findAllStudentsMap() {\n\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\n\t\ttry {\n\t\t\tStudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class);\n\t\t\treturn StudentMapper.findAllStudentsMap();\n\t\t} finally {\n\t\t\tsqlSession.close();\n\t\t}\n\t\n\t}\n}\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/services/TutorService.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.util.List;\r\n\r\nimport org.apache.ibatis.session.SqlSession;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\nimport com.mybatis3.mappers.TutorMapper;\r\nimport com.mybatis3.util.MyBatisUtil;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n\r\npublic class TutorService \r\n{\r\n\tpublic List<Tutor> findAllTutors()\r\n\t{\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\treturn mapper.findAllTutors();\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Tutor findTutorById(int tutorId)\r\n\t{\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\treturn mapper.findTutorById(tutorId);\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Tutor findTutorByNameAndEmail(String name, String email)\r\n\t{\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\treturn mapper.findTutorByNameAndEmail(name, email);\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Tutor createTutor(Tutor tutor)\r\n\t{\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\tmapper.insertTutor(tutor);\r\n\t\t\tsqlSession.commit();\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t\treturn tutor;\r\n\t}\r\n\t\r\n\tpublic Tutor updateTutor(Tutor tutor)\r\n\t{\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\tmapper.updateTutor(tutor);\r\n\t\t\tsqlSession.commit();\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t\treturn tutor;\r\n\t}\r\n\t\r\n\tpublic boolean deleteTutor(int tutorId)\r\n\t{\r\n\t\tboolean deleted = false;\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\tint nor = mapper.deleteTutor(tutorId);\r\n\t\t\tdeleted = (nor == 1);\r\n\t\t\tsqlSession.commit();\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t\treturn deleted;\r\n\t}\r\n\t\r\n\tpublic Tutor selectTutorById(int tutorId)\r\n\t{\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\treturn mapper.selectTutorById(tutorId);\r\n\t\t} finally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Tutor selectTutorWithCoursesById(int tutorId) {\r\n\t\tSqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();\r\n\t\ttry {\r\n\t\t\tTutorMapper mapper = sqlSession.getMapper(TutorMapper.class);\r\n\t\t\treturn mapper.selectTutorWithCoursesById(tutorId);\r\n\t\t} \r\n\t\t\r\n\t\tfinally {\r\n\t\t\tsqlSession.close();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/sqlproviders/TutorDynaSqlProvider.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.sqlproviders;\r\n\r\n\r\nimport java.util.Map;\r\n\r\nimport org.apache.ibatis.jdbc.SQL;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TutorDynaSqlProvider \r\n{\r\n\r\n\tpublic String findAllTutorsSql() \r\n\t{\r\n\t\treturn new SQL() {{\r\n\t\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t\t    FROM(\"tutors\");\r\n\t\t  }}.toString();\r\n\t}\r\n\t\r\n\tpublic String findTutorByIdSql(final int tutorId) \r\n\t{\r\n\t\t/*return new SQL() {{\r\n\t\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t\t\tFROM(\"tutors\");\r\n\t\t\tWHERE(\"tutor_id = #{tutorId}\");\r\n\t\t}}.toString();*/\r\n\r\n\t\treturn new SQL() {{\r\n\t\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t\t    FROM(\"tutors\");\r\n\t\t    WHERE(\"tutor_id=\"+tutorId);\r\n\t\t}}.toString();\r\n\t}\r\n\t\r\n\t\r\n\tpublic String findTutorByNameAndEmailSql(Map<String, Object> map) \r\n\t{\r\n\t\t//String name = (String) map.get(\"name\");\r\n\t\t//String email = (String) map.get(\"email\");\r\n\t\t//System.err.println(name+\":\"+email);\r\n\t\t\r\n\t\treturn new SQL() {{\r\n\t\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t\t    FROM(\"tutors\");\r\n\t\t    WHERE(\"name=#{name} AND email=#{email}\");\r\n\t\t}}.toString();\r\n\t}\r\n\t\r\n\tpublic String insertTutor(final Tutor tutor) {\r\n\t\t\r\n\t\treturn new SQL() {{\r\n\t\t\tINSERT_INTO(\"TUTORS\");\r\n\t\t    \r\n\t\t    if (tutor.getName() != null) {\r\n\t\t        VALUES(\"NAME\", \"#{name}\");\r\n\t\t    }\r\n\t\t    \r\n\t\t    if (tutor.getEmail() != null) {\r\n\t\t        VALUES(\"EMAIL\", \"#{email}\");\r\n\t\t    }\r\n\t\t}}.toString();\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String updateTutor(final Tutor tutor) \r\n\t{\r\n\t\t\r\n\t\treturn new SQL() {{\r\n\t\t\tUPDATE(\"TUTORS\");\r\n\t\t    \r\n\t\t    if (tutor.getName() != null) {\r\n\t\t    \tSET(\"NAME = #{name}\");\r\n\t\t    }\r\n\t\t    \r\n\t\t    if (tutor.getEmail() != null) {\r\n\t\t    \tSET(\"EMAIL = #{email}\");\r\n\t\t    }\r\n\t\t    WHERE(\"TUTOR_ID = #{tutorId}\");\r\n\t\t}}.toString();\r\n\t}\r\n\t\r\n\tpublic String deleteTutor(int tutorId) \r\n\t{\r\n\t\t\r\n\t\treturn new SQL() {{\r\n\t\t\tDELETE_FROM(\"TUTORS\");\r\n\t\t    WHERE(\"TUTOR_ID = #{tutorId}\");\r\n\t\t}}.toString();\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String selectTutorById() \r\n\t{\t\r\n\t\treturn new SQL() {{\r\n\t\t\tSELECT(\"t.tutor_id, t.name as tutor_name, email\");\r\n\t\t\tSELECT(\"a.addr_id, street, city, state, zip, country\");\r\n\t\t\tSELECT(\"course_id, c.name as course_name, description, start_date, end_date\");\r\n\t\t\tFROM(\"TUTORS t\");\r\n\t\t\tLEFT_OUTER_JOIN(\"addresses a on t.addr_id=a.addr_id\");\r\n\t\t\tLEFT_OUTER_JOIN(\"courses c on t.tutor_id=c.tutor_id\");\r\n\t\t\tWHERE(\"t.TUTOR_ID = #{id}\");\r\n\t\t}}.toString();\r\n\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.typehandlers;\r\n\r\nimport java.sql.CallableStatement;\r\nimport java.sql.PreparedStatement;\r\nimport java.sql.ResultSet;\r\nimport java.sql.SQLException;\r\n\r\nimport org.apache.ibatis.type.BaseTypeHandler;\r\nimport org.apache.ibatis.type.JdbcType;\r\n\r\nimport com.mybatis3.domain.PhoneNumber;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{\r\n\r\n\t@Override\r\n\tpublic void setNonNullParameter(PreparedStatement ps, int i,\r\n\t\t\tPhoneNumber parameter, JdbcType jdbcType) throws SQLException {\r\n\t\tps.setString(i, parameter.getAsString());\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, String columnName)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnName));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnIndex));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(cs.getString(columnIndex));\r\n\t}\r\n\r\n\t\r\n\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/java/com/mybatis3/util/MyBatisUtil.java",
    "content": "package com.mybatis3.util;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.sql.Connection;\r\nimport java.sql.DriverManager;\r\nimport java.util.Properties;\r\n\r\nimport org.apache.ibatis.datasource.DataSourceFactory;\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.session.SqlSessionFactory;\r\nimport org.apache.ibatis.session.SqlSessionFactoryBuilder;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class MyBatisUtil\r\n{\r\n\tprivate static SqlSessionFactory sqlSessionFactory;\r\n\t\r\n\tprivate static final Properties PROPERTIES = new Properties();\r\n\t\r\n\tstatic\r\n\t{\r\n\t\ttry {\r\n\t\t\tInputStream is = DataSourceFactory.class.getResourceAsStream(\"/application.properties\");\r\n\t\t\tPROPERTIES.load(is);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static Connection getConnection() \r\n\t{\r\n\t\tString driver = PROPERTIES.getProperty(\"jdbc.driverClassName\");\r\n\t\tString url = PROPERTIES.getProperty(\"jdbc.url\");\r\n\t\tString username = PROPERTIES.getProperty(\"jdbc.username\");\r\n\t\tString password = PROPERTIES.getProperty(\"jdbc.password\");\r\n\t\tConnection connection = null;\r\n\t\ttry {\r\n\t\t\tClass.forName(driver);\r\n\t\t\tconnection = DriverManager.getConnection(url, username, password);\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t} \r\n\t\treturn connection;\r\n\t}\r\n\t\r\n\tpublic static SqlSessionFactory getSqlSessionFactory()\r\n\t{\r\n\t\tif(sqlSessionFactory==null) \r\n\t\t{\r\n\t\t\tInputStream inputStream;\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tinputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");\r\n\t\t\t\tsqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);\r\n\t\t\t}catch (IOException e)\r\n\t\t\t{\r\n\t\t\t\tthrow new RuntimeException(e.getCause());\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sqlSessionFactory;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter04/src/main/resources/application.properties",
    "content": "\r\n\r\n################### DataSource Configuration ##########################\r\n\r\njdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/elearning\r\njdbc.username=root\r\njdbc.password=admin\r\n"
  },
  {
    "path": "chapter04/src/main/resources/com/mybatis3/mappers/StudentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.StudentMapper\">\r\n\t\r\n\t\r\n\t<resultMap type=\"Address\" id=\"AddressResult\">\r\n  \t\t<id property=\"addrId\" column=\"addr_id\"/>\r\n\t\t<result property=\"street\" column=\"street\"/>\r\n\t\t<result property=\"city\" column=\"city\"/>\r\n\t\t<result property=\"state\" column=\"state\"/>\r\n\t\t<result property=\"zip\" column=\"zip\"/>\r\n\t\t<result property=\"country\" column=\"country\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Student\" id=\"StudentWithAddressResult\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\"/>\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<association property=\"address\" resultMap=\"AddressResult\"/>\r\n\t</resultMap>\r\n\t\r\n\t\r\n</mapper>"
  },
  {
    "path": "chapter04/src/main/resources/com/mybatis3/mappers/TutorMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.TutorMapper\">\r\n\t\t  \t\r\n  \t<resultMap type=\"Address\" id=\"AddressResult\">\r\n  \t\t<id property=\"addrId\" column=\"addr_id\"/>\r\n\t\t<result property=\"street\" column=\"street\"/>\r\n\t\t<result property=\"city\" column=\"city\"/>\r\n\t\t<result property=\"state\" column=\"state\"/>\r\n\t\t<result property=\"zip\" column=\"zip\"/>\r\n\t\t<result property=\"country\" column=\"country\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Course\" id=\"CourseResult\">\r\n  \t\t<id \tcolumn=\"course_id\" property=\"courseId\"/>\r\n  \t\t<result column=\"course_name\" property=\"name\"/>\r\n  \t\t<result column=\"description\" property=\"description\"/>\r\n  \t\t<result column=\"start_date\" property=\"startDate\"/>\r\n  \t\t<result column=\"end_date\" property=\"endDate\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Tutor\" id=\"TutorResult\">\r\n  \t\t<id \tcolumn=\"tutor_id\" property=\"tutorId\"/>\r\n  \t\t<result column=\"tutor_name\" property=\"name\"/>\r\n  \t\t<result column=\"email\" property=\"email\"/>\r\n  \t\t<association property=\"address\" resultMap=\"AddressResult\"/>\r\n  \t\t<collection property=\"courses\"  resultMap=\"CourseResult\"></collection>\r\n  \t</resultMap>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter04/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.com.mybatis3=DEBUG"
  },
  {
    "path": "chapter04/src/main/resources/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE configuration\r\n  PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\r\n<configuration>\r\n\r\n\t  <properties resource=\"application.properties\"/>\r\n\t\t\r\n\t  <typeAliases>\r\n\t  \t<package name=\"com.mybatis3.domain\"/>\r\n\t  </typeAliases>\r\n\t  <typeHandlers>\r\n\t  \t<typeHandler handler=\"com.mybatis3.typehandlers.PhoneTypeHandler\"/>\r\n\t  </typeHandlers>\r\n\t\r\n\t  <environments default=\"development\">\r\n\t    <environment id=\"development\">\r\n\t      <transactionManager type=\"JDBC\"/>\r\n\t      <dataSource type=\"POOLED\">\r\n\t        <property name=\"driver\" value=\"${jdbc.driverClassName}\"/>\r\n\t        <property name=\"url\" value=\"${jdbc.url}\"/>\r\n\t        <property name=\"username\" value=\"${jdbc.username}\"/>\r\n\t        <property name=\"password\" value=\"${jdbc.password}\"/>\r\n\t      </dataSource>\r\n\t    </environment>\r\n\t  </environments>\r\n\t  \r\n\t  <mappers>\r\n\t  \t<package name=\"com.mybatis3.mappers\"/>\r\n\t  </mappers>  \t\r\n  \t\r\n</configuration>"
  },
  {
    "path": "chapter04/src/main/resources/sql/create_tables.sql",
    "content": "\r\nCREATE TABLE ADDRESSES \r\n(\r\n  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  STREET VARCHAR(50) NOT NULL,\r\n  CITY VARCHAR(50) NOT NULL,\r\n  STATE VARCHAR(50) NOT NULL,\r\n  ZIP VARCHAR(10) DEFAULT NULL,\r\n  COUNTRY VARCHAR(50) NOT NULL,\r\n  PRIMARY KEY (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE STUDENTS \r\n(\r\n  STUD_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  GENDER VARCHAR(6) DEFAULT NULL, \r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,  \r\n  PRIMARY KEY (STUD_ID),\r\n  UNIQUE KEY UK_EMAIL (EMAIL),\r\n  CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE TUTORS \r\n(\r\n  TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  GENDER VARCHAR(6) DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,\r\n  PRIMARY KEY (TUTOR_ID),\r\n  UNIQUE KEY UK_EMAIL (EMAIL),\r\n  CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)  \r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSES \r\n(\r\n  COURSE_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(100) NOT NULL,\r\n  DESCRIPTION VARCHAR(512) DEFAULT NULL,\r\n  START_DATE DATE DEFAULT NULL,\r\n  END_DATE DATE DEFAULT NULL,\r\n  TUTOR_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID),\r\n  CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSE_ENROLLMENT\r\n(\r\n  COURSE_ID INT(11) NOT NULL,\r\n  STUD_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID,STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID)\r\n) ENGINE=INNODB DEFAULT CHARSET=LATIN1;\r\n\r\n"
  },
  {
    "path": "chapter04/src/main/resources/sql/drop_tables.sql",
    "content": "\r\nDROP TABLE IF EXISTS USER_PICS;\r\nDROP TABLE IF EXISTS COURSE_ENROLLMENT;\r\nDROP TABLE IF EXISTS COURSES;\r\nDROP TABLE IF EXISTS TUTORS;\r\nDROP TABLE IF EXISTS STUDENTS;\r\nDROP TABLE IF EXISTS ADDRESSES;\r\n\r\n"
  },
  {
    "path": "chapter04/src/main/resources/sql/sample_data.sql",
    "content": "\n\n--Sample data for table ADDRESSES\n\nINSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES \n (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'),\n (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'),\n (3,'710 N Cable Rd','Lima','OH','45825','Allen'),\n (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche');\n\n-- Sample data for table STUDENTS\n\nINSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES \n (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25','MALE',NULL,NULL,3),\n (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15','MALE',NULL,NULL,4);\n\n-- Sample data for table TUTORS\n\nINSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES \n (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),\n (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),\n (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2),\n (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2);\n\n-- Sample data for table courses\n\nINSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES \n (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1),\n (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1),\n (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2);\n\n-- Sample data for table COURSE_ENROLLMENT\n\nINSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES \n (1,1),\n (1,2),\n (2,2);\n\n"
  },
  {
    "path": "chapter04/src/test/java/com/mybatis3/services/StudentServiceTest.java",
    "content": "package com.mybatis3.services;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport org.junit.AfterClass;\r\nimport org.junit.BeforeClass;\r\nimport org.junit.Test;\r\n\r\nimport com.mybatis3.domain.PhoneNumber;\r\nimport com.mybatis3.domain.Student;\r\n\r\npublic class StudentServiceTest \r\n{\r\n\r\n\tprivate static StudentService studentService;\r\n\t\r\n\t@BeforeClass\r\n\tpublic static void setup() {\r\n\t\tstudentService = new StudentService();\r\n\t\tTestDataPopulator.initDatabase();\r\n\t}\r\n\t\r\n\t@AfterClass\r\n\tpublic static void teardown() {\r\n\t\tstudentService = null;\r\n\t}\r\n\t\r\n\t@Test\r\n\tpublic void testFindAllStudents() {\r\n\t\tList<Student> students = studentService.findAllStudents();\r\n\t\tassertNotNull(students);\r\n\t\tfor (Student student : students)\r\n\t\t{\r\n\t\t\tSystem.err.println(student);\r\n\t\t}\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindStudentById() {\r\n\t\tStudent student = studentService.findStudentById(1);\r\n\t\tSystem.err.println(student);\r\n\t\tSystem.err.println(student.getAddress().getAddrId()+\":\"+student.getAddress().getCity());\r\n\t\t\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindStudentWithAddressById() {\r\n\t\tStudent student = studentService.findStudentWithAddressById(2);\r\n\t\tassertNotNull(student);\r\n\t\tSystem.out.println(student.getAddress().getAddrId()+\":\"+student.getAddress().getCity());\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testCreateStudent() {\r\n\t\tStudent stud = new Student();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstud.setName(\"stud_\"+ts);\r\n\t\tstud.setEmail(\"stud_\"+ts+\"@gmail.com\");\r\n\t\tstud.setPhone(new PhoneNumber(\"123-456-7890\"));\r\n\t\tStudent student = studentService.createStudent(stud);\r\n\t\tassertNotNull(student);\r\n\t\tassertEquals(\"stud_\"+ts, student.getName());\r\n\t\tassertEquals(\"stud_\"+ts+\"@gmail.com\", student.getEmail());\r\n\t\tSystem.err.println(\"CreatedStudent: \"+student);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testCreateStudentWithMap() {\r\n\t\tMap<String, Object> studMap = new HashMap<String, Object>();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstudMap.put(\"name\",\"stud_\"+ts);\r\n\t\tstudMap.put(\"email\",\"stud_\"+ts+\"@gmail.com\");\r\n\t\tstudMap.put(\"phone\",null);\r\n\t\tstudentService.createStudentWithMap(studMap);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testUpdateStudent() {\r\n\t\tStudent stud = new Student();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstud.setStudId(2);\r\n\t\tstud.setName(\"studddd_\"+ts);\r\n\t\tstud.setEmail(\"studddd_\"+ts+\"@gmail.com\");\r\n\t\tStudent student = studentService.updateStudent(stud);\r\n\t\tassertNotNull(student);\r\n\t\tassertEquals(\"studddd_\"+ts, student.getName());\r\n\t\tassertEquals(\"studddd_\"+ts+\"@gmail.com\", student.getEmail());\r\n\t\tassertEquals(new Integer(2), student.getStudId());\r\n\t\t\r\n\t\tSystem.out.println(\"UpdatedStudent: \"+student);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testDeleteStudent() {\r\n\t\tboolean deleted = studentService.deleteStudent(3);\r\n\t\tassertTrue(deleted);\r\n\t\tSystem.err.println(\"deleteStudent:\"+deleted);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindStudentMapById() {\r\n\t\tMap<String, Object> studentMap = studentService.findStudentMapById(1);\r\n\t\tSystem.err.println(studentMap);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindAllStudentsMap() {\r\n\t\tList<Map<String,Object>> studentMapList = studentService.findAllStudentsMap();\r\n    \tfor(Map<String,Object> studentMap : studentMapList)\r\n    \t{\r\n    \t\tSystem.out.println(\"id :\"+studentMap.get(\"id\"));\r\n    \t\tSystem.out.println(\"name :\"+studentMap.get(\"name\"));\r\n    \t\tSystem.out.println(\"email :\"+studentMap.get(\"email\"));\r\n    \t\tSystem.out.println(\"phone :\"+studentMap.get(\"phone\"));\r\n    \t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "chapter04/src/test/java/com/mybatis3/services/TestDataPopulator.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.io.Reader;\r\nimport java.sql.Connection;\r\n\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.jdbc.ScriptRunner;\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport com.mybatis3.util.MyBatisUtil;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TestDataPopulator \r\n{\r\n\tprivate static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class);\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tinitDatabase();\r\n\t}\r\n\t\r\n\tpublic static void initDatabase()\r\n\t{\r\n\t\tConnection connection = null;\r\n\t\tReader reader = null;\r\n\t\ttry {\r\n\t\t\tconnection = MyBatisUtil.getConnection();\r\n\t\t\tScriptRunner scriptRunner = new ScriptRunner(connection);\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/drop_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader);\r\n\t\t\tlogger.info(\"drop_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/create_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"create_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/sample_data.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"sample_data.sql executed successfully\");\r\n\t\t\tconnection.commit();\r\n\t\t\treader.close();\r\n\t\t\tscriptRunner.closeConnection();\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter04/src/test/java/com/mybatis3/services/TutorServiceTest.java",
    "content": "package com.mybatis3.services;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\nimport java.util.List;\r\n\r\nimport org.junit.AfterClass;\r\nimport org.junit.BeforeClass;\r\nimport org.junit.Test;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\n\r\npublic class TutorServiceTest \r\n{\r\n\r\n\tprivate static TutorService tutorService;\r\n\t\r\n\t@BeforeClass\r\n\tpublic static void setup() {\r\n\t\ttutorService = new TutorService();\r\n\t\tTestDataPopulator.initDatabase();\r\n\t}\r\n\t\r\n\t@AfterClass\r\n\tpublic static void teardown() {\r\n\t\ttutorService = null;\r\n\t}\r\n\t\r\n\t@Test\r\n\tpublic void testFindAllTutors() {\r\n\t\tList<Tutor> tutors = tutorService.findAllTutors();\r\n\t\tassertNotNull(tutors);\r\n\t\tfor (Tutor tutor : tutors)\r\n\t\t{\r\n\t\t\tSystem.err.println(tutor);\r\n\t\t}\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindTutorById() {\r\n\t\tTutor tutor = tutorService.findTutorById(1);\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindTutorByNameAndEmail() {\r\n\t\tTutor tutor = tutorService.findTutorByNameAndEmail(\"Paul\", \"paul@gmail.com\");\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testCreateTutor() {\r\n\t\tTutor tutor = new Tutor();\r\n\t\ttutor.setName(\"siva\");\r\n\t\ttutor.setEmail(\"siva@gmail.com\");\r\n\t\ttutor = tutorService.createTutor(tutor);\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor.getTutorId());\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testUpdateTutor() {\r\n\t\tTutor tutor = new Tutor();\r\n\t\ttutor.setTutorId(1);\r\n\t\ttutor.setName(\"sivaprasad\");\r\n\t\ttutor.setEmail(\"sivaprasad@gmail.com\");\r\n\t\ttutor = tutorService.updateTutor(tutor);\r\n\t\tTutor updTutor = tutorService.findTutorById(1);\r\n\t\tassertNotNull(updTutor);\r\n\t\tSystem.err.println(updTutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testDeleteTutor() {\r\n\t\tboolean deleted = tutorService.deleteTutor(4);\r\n   \t\tassertTrue(deleted);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testSelectTutorById() {\r\n\t\tTutor tutor = tutorService.selectTutorById(1);\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testSelectTutorWithCoursesById() {\r\n\t\tTutor tutor = tutorService.selectTutorWithCoursesById(1);\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "chapter05/README.txt",
    "content": "Chapter 5: Integration with Spring\r\nThis chapter explains how to integration MyBatis with Spring framework.\r\nTopics covered:\r\n\t. Configuring MyBatis in Spring ApplicationContext\r\n\t. Injecting SqlSession and SQL Mappers\r\n\t. Transaction Management using Spring\r\n\t\r\nHow to Run:\r\n\tUpdate the database properties in application.properties file.\r\n\tYou can run the JUnit tests in src/test/java folder.\r\n\tIn JUnit Tests we have Database Initialization logic to setup sample data.\r\n\t\r\n\tpublic class StudentServiceTest \r\n\t{\r\n\t\t@BeforeClass\r\n\t\tpublic static void setup() {\r\n\t\t\tstudentService = new StudentService();\r\n\t\t\tTestDataPopulator.initDatabase(); // this will drop and re-create database and populates sample data.\r\n\t\t}\r\n\t}\r\n"
  },
  {
    "path": "chapter05/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 \n\thttp://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.mybatis3</groupId>\n\t<artifactId>chapter05</artifactId>\n\t<version>0.0.1</version>\n\t<packaging>jar</packaging>\n\n\t<name>chapter04</name>\n\t<url>http://www.mybatis.org</url>\n\t<description>MyBatis Book Chapter 05</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.6</java.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<slf4j.version>1.7.5</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\t\t<mybatis.version>3.2.2</mybatis.version>\n\t\t<mybatis-spring.version>1.2.0</mybatis-spring.version>\n\t\t<mysql.version>5.1.21</mysql.version>\n\t\t\n\t\t<spring.version>3.1.3.RELEASE</spring.version>\n\t\t<aspectj.version>1.6.8</aspectj.version>\n    \t<cglib.version>2.2</cglib.version>\n    \t<commons.dbcp.version>1.4</commons.dbcp.version>\n    \t<commons.pool.version>1.6</commons.pool.version>\n    \t<commons.lang.version>2.5</commons.lang.version>\n    \t  \t\n\t\t<maven.compiler.plugin>2.3.2</maven.compiler.plugin>\n\t</properties>\n\n\t<build>\n\t\t<finalName>${project.artifactId}</finalName>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>${maven.compiler.plugin}</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${java.version}</source>\n\t\t\t\t\t<target>${java.version}</target>\n\t\t\t\t\t<encoding>${project.build.sourceEncoding}</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t</build>\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>commons-logging</groupId>\n\t\t\t\t\t<artifactId>commons-logging</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-jdbc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.aspectj</groupId>\n\t\t\t<artifactId>aspectjrt</artifactId>\n\t\t\t<version>${aspectj.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.aspectj</groupId>\n\t\t\t<artifactId>aspectjweaver</artifactId>\n\t\t\t<version>${aspectj.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>cglib</groupId>\n\t\t\t<artifactId>cglib-nodep</artifactId>\n\t\t\t<version>${cglib.version}</version>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis</artifactId>\n\t\t\t<version>${mybatis.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis-spring</artifactId>\n\t\t\t<version>${mybatis-spring.version}</version>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>org.slf4j</groupId>\n\t        <artifactId>jcl-over-slf4j</artifactId>\n\t        <version>${slf4j.version}</version>\n\t        <scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-dbcp</groupId>\n\t\t\t<artifactId>commons-dbcp</artifactId>\n\t\t\t<version>${commons.dbcp.version}</version>\n\t\t</dependency>\n\t</dependencies>\n\n</project>\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/config/AppConfig.java",
    "content": "package com.mybatis3.config;\r\n\r\nimport org.mybatis.spring.annotation.MapperScan;\r\nimport org.springframework.context.annotation.Configuration;\r\n/*\r\nimport javax.sql.DataSource;\r\nimport org.apache.ibatis.datasource.pooled.PooledDataSource;\r\nimport org.apache.ibatis.session.SqlSessionFactory;\r\nimport org.mybatis.spring.SqlSessionFactoryBean;\r\nimport org.springframework.context.annotation.Bean;\r\n*/\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n@Configuration\r\n@MapperScan(value=\"com.mybatis3.mappers\")\r\npublic class AppConfig\r\n{\r\n\t/*\r\n\t@Bean\r\n\tpublic DataSource dataSource() {\r\n\t\treturn new PooledDataSource(\"com.mysql.jdbc.Driver\", \r\n\t\t\t\t\t\t\t\t\t\"jdbc:mysql://localhost:3306/elearning\", \r\n\t\t\t\t\t\t\t\t\t\"root\", \"admin\");\r\n\t}\r\n\t\r\n\t@Bean\r\n\tpublic SqlSessionFactory sqlSessionFactory() throws Exception {\r\n\t    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();\r\n\t    sessionFactory.setDataSource(dataSource());\r\n\t    return sessionFactory.getObject();\r\n\t}\r\n\t*/\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/domain/Address.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Address implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer addrId;\r\n\tprivate String street;\r\n\tprivate String city;\r\n\tprivate String state;\r\n\tprivate String zip;\r\n\tprivate String country;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Address [addrId=\" + addrId + \", street=\" + street + \", city=\" + city\r\n\t\t\t\t+ \", state=\" + state + \", zip=\" + zip + \", country=\" + country\r\n\t\t\t\t+ \"]\";\r\n\t}\r\n\tpublic Address()\r\n\t{\r\n\t}\r\n\tpublic Address(Integer addrId)\r\n\t{\r\n\t\tthis.addrId = addrId;\r\n\t}\r\n\tpublic Address(Integer addrId, String street, String city, String state,\r\n\t\t\tString zip, String country)\r\n\t{\r\n\t\tthis.addrId = addrId;\r\n\t\tthis.street = street;\r\n\t\tthis.city = city;\r\n\t\tthis.state = state;\r\n\t\tthis.zip = zip;\r\n\t\tthis.country = country;\r\n\t}\r\n\tpublic Integer getAddrId() {\r\n\t\treturn addrId;\r\n\t}\r\n\tpublic void setAddrId(Integer addrId) {\r\n\t\tthis.addrId = addrId;\r\n\t}\r\n\tpublic String getStreet()\r\n\t{\r\n\t\treturn street;\r\n\t}\r\n\tpublic void setStreet(String street)\r\n\t{\r\n\t\tthis.street = street;\r\n\t}\r\n\tpublic String getCity()\r\n\t{\r\n\t\treturn city;\r\n\t}\r\n\tpublic void setCity(String city)\r\n\t{\r\n\t\tthis.city = city;\r\n\t}\r\n\tpublic String getState()\r\n\t{\r\n\t\treturn state;\r\n\t}\r\n\tpublic void setState(String state)\r\n\t{\r\n\t\tthis.state = state;\r\n\t}\r\n\tpublic String getZip()\r\n\t{\r\n\t\treturn zip;\r\n\t}\r\n\tpublic void setZip(String zip)\r\n\t{\r\n\t\tthis.zip = zip;\r\n\t}\r\n\tpublic String getCountry()\r\n\t{\r\n\t\treturn country;\r\n\t}\r\n\tpublic void setCountry(String country)\r\n\t{\r\n\t\tthis.country = country;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/domain/Course.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Course implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer courseId;\r\n\tprivate String name;\r\n\tprivate String description;\r\n\tprivate Date startDate;\r\n\tprivate Date endDate;\r\n\tprivate Tutor tutor;\r\n\tprivate List<Student> students;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Course [courseId=\" + courseId + \", name=\" + name + \", description=\"\r\n\t\t\t\t+ description + \", startDate=\" + startDate + \", endDate=\"\r\n\t\t\t\t+ endDate + \", tutor=\" + tutor + \", students=\" + students + \"]\";\r\n\t}\r\n\tpublic Integer getCourseId()\r\n\t{\r\n\t\treturn courseId;\r\n\t}\r\n\tpublic void setCourseId(Integer id)\r\n\t{\r\n\t\tthis.courseId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getDescription()\r\n\t{\r\n\t\treturn description;\r\n\t}\r\n\tpublic void setDescription(String description)\r\n\t{\r\n\t\tthis.description = description;\r\n\t}\r\n\tpublic Date getStartDate()\r\n\t{\r\n\t\treturn startDate;\r\n\t}\r\n\tpublic void setStartDate(Date startDate)\r\n\t{\r\n\t\tthis.startDate = startDate;\r\n\t}\r\n\tpublic Date getEndDate()\r\n\t{\r\n\t\treturn endDate;\r\n\t}\r\n\tpublic void setEndDate(Date endDate)\r\n\t{\r\n\t\tthis.endDate = endDate;\r\n\t}\r\n\tpublic List<Student> getStudents()\r\n\t{\r\n\t\tif(students == null){\r\n\t\t\tstudents = new ArrayList<Student>(0);\r\n\t\t}\r\n\t\treturn students;\r\n\t}\r\n\tpublic void setStudents(List<Student> students)\r\n\t{\r\n\t\tthis.students = students;\r\n\t}\r\n\tpublic Tutor getTutor() {\r\n\t\treturn tutor;\r\n\t}\r\n\tpublic void setTutor(Tutor tutor) {\r\n\t\tthis.tutor = tutor;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/domain/PhoneNumber.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneNumber  implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate String countryCode;\r\n\tprivate String stateCode;\r\n\tprivate String number;\r\n\t\r\n\tpublic PhoneNumber() {\r\n\t}\r\n\r\n\tpublic PhoneNumber(String countryCode, String stateCode, String number) {\r\n\t\tsuper();\r\n\t\tthis.countryCode = countryCode;\r\n\t\tthis.stateCode = stateCode;\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic PhoneNumber(String string) {\r\n\t\tif(string != null){\r\n\t\t\tString[] parts = string.split(\"-\");\r\n\t\t\tif(parts.length>0) this.countryCode=parts[0];\r\n\t\t\tif(parts.length>1) this.stateCode=parts[1];\r\n\t\t\tif(parts.length>2) this.number=parts[2];\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\t\r\n\t/*@Override\r\n\tpublic String toString() {\r\n\t\treturn this.getAsString();\r\n\t}*/\r\n\t\r\n\tpublic String getCountryCode() {\r\n\t\treturn countryCode;\r\n\t}\r\n\r\n\tpublic void setCountryCode(String countryCode) {\r\n\t\tthis.countryCode = countryCode;\r\n\t}\r\n\r\n\tpublic String getStateCode() {\r\n\t\treturn stateCode;\r\n\t}\r\n\r\n\tpublic void setStateCode(String stateCode) {\r\n\t\tthis.stateCode = stateCode;\r\n\t}\r\n\r\n\tpublic String getNumber() {\r\n\t\treturn number;\r\n\t}\r\n\r\n\tpublic void setNumber(String number) {\r\n\t\tthis.number = number;\r\n\t}\r\n\r\n\tpublic String getAsString() {\r\n\t\treturn countryCode+\"-\"+stateCode+\"-\"+number;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/domain/Student.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Student implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\tprivate Integer studId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate PhoneNumber phone;\r\n\tprivate Address address;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Student [studId=\" + studId + \", name=\" + name + \", email=\" + email\r\n\t\t\t\t+ \", phone=\" + (phone==null?null:phone.getAsString()) + \", address=\" + address + \"]\";\r\n\t}\r\n\tpublic Student()\r\n\t{\r\n\t}\r\n\tpublic Student(Integer id)\r\n\t{\r\n\t\tthis.studId = id;\r\n\t}\r\n\tpublic Integer getStudId()\r\n\t{\r\n\t\treturn studId;\r\n\t}\r\n\tpublic void setStudId(Integer id)\r\n\t{\r\n\t\tthis.studId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail()\r\n\t{\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email)\r\n\t{\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Address getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(Address address) {\r\n\t\tthis.address = address;\r\n\t}\r\n\tpublic PhoneNumber getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\tpublic void setPhone(PhoneNumber phone) {\r\n\t\tthis.phone = phone;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/domain/Tutor.java",
    "content": "package com.mybatis3.domain;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.List;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class Tutor implements Serializable\r\n{\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\tprivate Integer tutorId;\r\n\tprivate String name;\r\n\tprivate String email;\r\n\tprivate Address address;\r\n\tprivate List<Course> courses;\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Tutor [tutorId=\" + tutorId + \", name=\" + name + \", email=\" + email\r\n\t\t\t\t+ \", address=\" + address + \", courses=\" + courses + \"]\";\r\n\t}\r\n\tpublic Tutor()\r\n\t{\r\n\t}\r\n\tpublic Tutor(Integer id)\r\n\t{\r\n\t\tthis.tutorId = id;\r\n\t}\r\n\tpublic Integer getTutorId()\r\n\t{\r\n\t\treturn tutorId;\r\n\t}\r\n\tpublic void setTutorId(Integer id)\r\n\t{\r\n\t\tthis.tutorId = id;\r\n\t}\r\n\tpublic String getName()\r\n\t{\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name)\r\n\t{\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic String getEmail()\r\n\t{\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email)\r\n\t{\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic Address getAddress()\r\n\t{\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(Address address)\r\n\t{\r\n\t\tthis.address = address;\r\n\t}\r\n\tpublic List<Course> getCourses() {\r\n\t\treturn courses;\r\n\t}\r\n\tpublic void setCourses(List<Course> courses) {\r\n\t\tthis.courses = courses;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/mappers/AddressMapper.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.mappers;\r\n\r\nimport org.apache.ibatis.annotations.Insert;\r\nimport org.apache.ibatis.annotations.Select;\r\n\r\nimport com.mybatis3.domain.Address;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface AddressMapper \r\n{\r\n\t@Select(\"select addr_id as addrId, street, city, state, zip, country from addresses where addr_id=#{id}\")\r\n\tAddress selectAddressById(int id);\r\n\r\n\t@Insert(\"insert into addresses(street, city, state, zip, country) values(#{street},#{city},#{state},#{zip},#{country})\")\r\n\tint insertAddress(Address address);\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/mappers/StudentMapper.java",
    "content": "package com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport org.apache.ibatis.annotations.Delete;\r\nimport org.apache.ibatis.annotations.Insert;\r\nimport org.apache.ibatis.annotations.Options;\r\nimport org.apache.ibatis.annotations.Result;\r\nimport org.apache.ibatis.annotations.ResultMap;\r\nimport org.apache.ibatis.annotations.Results;\r\nimport org.apache.ibatis.annotations.Select;\r\nimport org.apache.ibatis.annotations.Update;\r\n\r\nimport com.mybatis3.domain.Student;\r\n\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic interface StudentMapper\r\n{\r\n\t\r\n\t@Select(\"select * from students\")\r\n\t@Results({\r\n\t\t\t@Result(id=true, column=\"stud_id\", property=\"studId\"),\r\n\t\t\t@Result(column=\"name\", property=\"name\"),\r\n\t\t\t@Result(column=\"email\", property=\"email\"),\r\n\t\t\t@Result(column=\"addr_id\", property=\"address.addrId\")\t\t\t\r\n\t})\r\n\tList<Student> findAllStudents();\r\n\r\n\t@Select(\"select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students\")\r\n\tList<Map<String,Object>> findAllStudentsMap();\r\n\t\r\n\t@Select(\"select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}\")\r\n\tStudent findStudentById(Integer id);\r\n\t\r\n\t@Select(\"select stud_id as studId, name, email, addr_id as 'address.addrId', phone from students where stud_id=#{id}\")\r\n\tMap<String,Object> findStudentMapById(Integer id);\r\n\r\n\t@Select(\"select stud_id, name, email, a.addr_id, street, city, state, zip, country\"+\r\n  \t\t\" FROM students s left outer join addresses a on s.addr_id=a.addr_id\"+\r\n\t\t\" where stud_id=#{studId} \")\r\n\t@ResultMap(\"com.mybatis3.mappers.StudentMapper.StudentWithAddressResult\")\r\n\tStudent selectStudentWithAddress(int studId);\r\n\t\r\n\t@Insert(\"insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})\")\r\n\t@Options(useGeneratedKeys=true, keyProperty=\"studId\")\r\n\tvoid insertStudent(Student student);\r\n\t\r\n\t@Insert(\"insert into students(name,email,addr_id, phone) values(#{name},#{email},#{address.addrId},#{phone})\")\r\n\t@Options(useGeneratedKeys=true, keyProperty=\"studId\")\r\n\tvoid insertStudentWithMap(Map<String, Object> map);\r\n\r\n\t@Update(\"update students set name=#{name}, email=#{email}, phone=#{phone} where stud_id=#{studId}\")\r\n\tvoid updateStudent(Student student);\r\n\t\r\n\t@Delete(\"delete from students where stud_id=#{studId}\")\r\n\tint deleteStudent(int studId);\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/mappers/TutorMapper.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.mappers;\r\n\r\nimport java.util.List;\r\n\r\nimport org.apache.ibatis.annotations.DeleteProvider;\r\nimport org.apache.ibatis.annotations.InsertProvider;\r\nimport org.apache.ibatis.annotations.Many;\r\nimport org.apache.ibatis.annotations.One;\r\nimport org.apache.ibatis.annotations.Options;\r\nimport org.apache.ibatis.annotations.Param;\r\nimport org.apache.ibatis.annotations.Result;\r\nimport org.apache.ibatis.annotations.ResultMap;\r\nimport org.apache.ibatis.annotations.Results;\r\nimport org.apache.ibatis.annotations.Select;\r\nimport org.apache.ibatis.annotations.SelectProvider;\r\nimport org.apache.ibatis.annotations.UpdateProvider;\r\n\r\nimport com.mybatis3.domain.Course;\r\nimport com.mybatis3.domain.Tutor;\r\nimport com.mybatis3.sqlproviders.TutorDynaSqlProvider;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n\r\npublic interface TutorMapper \r\n{\r\n\t\r\n\t@Select(\"select * from courses where tutor_id=#{tutorId}\")\r\n\t@ResultMap(\"com.mybatis3.mappers.TutorMapper.CourseResult\")\r\n\tList<Course> selectCoursesByTutorId(int tutorId);\r\n\t\r\n\t@Select(\"SELECT tutor_id, t.name as tutor_name, email, addr_id FROM tutors t where t.tutor_id=#{tutorId}\")\r\n\t@Results({\r\n\t\t@Result(id=true, column=\"tutor_id\", property=\"tutorId\"),\r\n\t\t@Result(column=\"tutor_name\", property=\"name\"),\r\n\t\t@Result(column=\"email\", property=\"email\"),\r\n\t\t@Result(property=\"address\", column=\"addr_id\",\r\n\t\t\t\tone=@One(select=\"com.mybatis3.mappers.AddressMapper.selectAddressById\")),\t\t\r\n\t\t@Result(property=\"courses\", column=\"tutor_id\",\r\n\t\t\t\tmany=@Many(select=\"com.mybatis3.mappers.TutorMapper.selectCoursesByTutorId\"))\t\t\r\n\t})\r\n\tTutor selectTutorWithCoursesById(int tutorId);\r\n\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"findAllTutorsSql\")\r\n\tList<Tutor> findAllTutors();\r\n\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"findTutorByIdSql\")\r\n\tTutor findTutorById(int tutorId);\r\n\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"findTutorByNameAndEmailSql\")\r\n\tTutor findTutorByNameAndEmail(@Param(\"name\")String name, @Param(\"email\")String email);\r\n\t\r\n\t@InsertProvider(type=TutorDynaSqlProvider.class, method=\"insertTutor\")\r\n\t@Options(useGeneratedKeys=true, keyProperty=\"tutorId\")\r\n\tint insertTutor(Tutor tutor);\r\n\t\r\n\t@UpdateProvider(type=TutorDynaSqlProvider.class, method=\"updateTutor\")\r\n\tint updateTutor(Tutor tutor);\r\n\t\r\n\t@DeleteProvider(type=TutorDynaSqlProvider.class, method=\"deleteTutor\")\r\n\tint deleteTutor(int tutorId);\r\n\t\t\r\n\t@SelectProvider(type=TutorDynaSqlProvider.class, method=\"selectTutorById\")\r\n\t@ResultMap(\"com.mybatis3.mappers.TutorMapper.TutorResult\")\r\n\tTutor selectTutorById(int tutorId);\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/services/StudentService.java",
    "content": "package com.mybatis3.services;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport com.mybatis3.domain.Address;\nimport com.mybatis3.domain.Student;\nimport com.mybatis3.mappers.AddressMapper;\nimport com.mybatis3.mappers.StudentMapper;\n\n\n@Service\n@Transactional\npublic class StudentService \n{\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\t@Autowired\n\tprivate StudentMapper studentMapper;\n\t\n\t@Autowired\n\tprivate AddressMapper addressMapper;\n\t\n\tpublic List<Student> findAllStudents() {\n\t\treturn studentMapper.findAllStudents();\t\t\n\t}\n\t\n\tpublic Student findStudentById(Integer id) {\n\t\tlogger.debug(\"findStudentById :\"+id);\n\t\treturn studentMapper.findStudentById(id);\t\t\n\t}\n\n\tpublic Student findStudentWithAddressById(int id) {\n\t\treturn studentMapper.selectStudentWithAddress(id);\t\t\n\t}\n\t\n\tpublic Student createStudent(Student student) {\n\t\tAddress address = student.getAddress();\n\t\tif(address != null){\n\t\t\taddressMapper.insertAddress(address);\n\t\t}\n\t\tif(student.getName()==null || student.getName().trim().length()==0){\n\t\t\tthrow new RuntimeException(\"Student Name should not be null\");\n\t\t}\n\t\tstudentMapper.insertStudent(student);\n\t\treturn student;\n\t}\n\t\n\tpublic void createStudentWithMap(Map<String, Object> studentDataMap) {\n\t\tstudentMapper.insertStudentWithMap(studentDataMap);\n\t}\n\n\tpublic Student updateStudent(Student student) {\n\t\tstudentMapper.updateStudent(student);\n\t\treturn student;\n\t}\n\t\n\tpublic boolean deleteStudent(int id) {\n\t\tint count = studentMapper.deleteStudent(id);\n\t\treturn count > 0;\n\t}\n\t\n\tpublic Map<String, Object> findStudentMapById(int id) {\n\t\treturn studentMapper.findStudentMapById(id);\n\t}\n\n\tpublic List<Map<String, Object>> findAllStudentsMap() {\n\t\treturn studentMapper.findAllStudentsMap();\n\t}\n}\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/services/TutorService.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.util.List;\r\n\r\nimport org.apache.ibatis.session.SqlSession;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\nimport com.mybatis3.mappers.TutorMapper;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\n@Service\r\n@Transactional\r\npublic class TutorService \r\n{\r\n\t@Autowired\r\n\tprivate SqlSession sqlSession;\r\n\t\r\n\tprivate TutorMapper getTutorMapper(){\r\n\t\treturn sqlSession.getMapper(TutorMapper.class);\r\n\t}\r\n\tpublic List<Tutor> findAllTutors() {\r\n\t\treturn getTutorMapper().findAllTutors();\r\n\t}\r\n\t\r\n\tpublic Tutor findTutorById(int tutorId) {\r\n\t\treturn getTutorMapper().findTutorById(tutorId);\r\n\t}\r\n\t\r\n\tpublic Tutor findTutorByNameAndEmail(String name, String email) {\r\n\t\treturn getTutorMapper().findTutorByNameAndEmail(name, email);\r\n\t}\r\n\t\r\n\tpublic Tutor createTutor(Tutor tutor) {\r\n\t\tgetTutorMapper().insertTutor(tutor);\r\n\t\treturn tutor;\r\n\t}\r\n\t\r\n\tpublic Tutor updateTutor(Tutor tutor) {\r\n\t\tgetTutorMapper().updateTutor(tutor);\r\n\t\treturn tutor;\r\n\t}\r\n\t\r\n\tpublic boolean deleteTutor(int tutorId) {\r\n\t\tboolean deleted = false;\r\n\t\tint nor = getTutorMapper().deleteTutor(tutorId);\r\n\t\tdeleted = (nor == 1);\r\n\t\treturn deleted;\r\n\t}\r\n\t\r\n\tpublic Tutor selectTutorById(int tutorId) {\r\n\t\treturn getTutorMapper().selectTutorById(tutorId);\r\n\t}\r\n\t\r\n\tpublic Tutor selectTutorWithCoursesById(int tutorId) {\r\n\t\treturn getTutorMapper().selectTutorWithCoursesById(tutorId);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/sqlproviders/TutorDynaSqlProvider.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.sqlproviders;\r\n\r\nimport java.util.Map;\r\n\r\nimport org.apache.ibatis.jdbc.SQL;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TutorDynaSqlProvider \r\n{\r\n\r\n\tpublic String findAllTutorsSql() \r\n\t{\r\n\t\treturn new SQL() {{\r\n\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t    FROM(\"tutors\");\r\n\t\t}}.toString();\r\n\t}\r\n\t\r\n\tpublic String findTutorByIdSql(final int tutorId) \r\n\t{\r\n\t\treturn new SQL() {{\r\n\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t    FROM(\"tutors\");\r\n\t    WHERE(\"tutor_id=\"+tutorId);\r\n\t    }}.toString();\r\n\t}\r\n\t\r\n\t\r\n\tpublic String findTutorByNameAndEmailSql(Map<String, Object> map) \r\n\t{\r\n\t\t//String name = (String) map.get(\"name\");\r\n\t\t//String email = (String) map.get(\"email\");\r\n\t\t//System.err.println(name+\":\"+email);\r\n\t\treturn new SQL() {{\r\n\t\tSELECT(\"tutor_id as tutorId, name, email\");\r\n\t    FROM(\"tutors\");\r\n\t    WHERE(\"name=#{name} AND email=#{email}\");\r\n\t    }}.toString();\r\n\t}\r\n\t\r\n\tpublic String insertTutor(final Tutor tutor) {\r\n\t\treturn new SQL() {{\r\n        INSERT_INTO(\"TUTORS\");\r\n        \r\n        if (tutor.getName() != null) {\r\n            VALUES(\"NAME\", \"#{name}\");\r\n        }\r\n        \r\n        if (tutor.getEmail() != null) {\r\n            VALUES(\"EMAIL\", \"#{email}\");\r\n        }\r\n        }}.toString();\r\n\t}\r\n\t\r\n\tpublic String updateTutor(final Tutor tutor) \r\n\t{\r\n\t\treturn new SQL() {{\r\n\t\tUPDATE(\"TUTORS\");\r\n        \r\n        if (tutor.getName() != null) {\r\n        \tSET(\"NAME = #{name}\");\r\n        }\r\n        \r\n        if (tutor.getEmail() != null) {\r\n        \tSET(\"EMAIL = #{email}\");\r\n        }\r\n        WHERE(\"TUTOR_ID = #{tutorId}\");\r\n        }}.toString();\r\n\t}\r\n\t\r\n\tpublic String deleteTutor(int tutorId) \r\n\t{\r\n\t\treturn new SQL() {{\r\n\t\tDELETE_FROM(\"TUTORS\");\r\n        WHERE(\"TUTOR_ID = #{tutorId}\");\r\n        }}.toString();\r\n\t}\r\n\t\r\n\tpublic String selectTutorById() \r\n\t{\t\t\r\n\t\treturn new SQL() {{\r\n\t\tSELECT(\"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\");\r\n\t\tFROM(\"TUTORS t\");\r\n\t\tLEFT_OUTER_JOIN(\"addresses a on t.addr_id=a.addr_id\");\r\n\t\tLEFT_OUTER_JOIN(\"courses c on t.tutor_id=c.tutor_id\");\r\n        WHERE(\"t.TUTOR_ID = #{tutorId}\");\r\n        }}.toString();\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/typehandlers/PhoneTypeHandler.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.typehandlers;\r\n\r\nimport java.sql.CallableStatement;\r\nimport java.sql.PreparedStatement;\r\nimport java.sql.ResultSet;\r\nimport java.sql.SQLException;\r\n\r\nimport org.apache.ibatis.type.BaseTypeHandler;\r\nimport org.apache.ibatis.type.JdbcType;\r\n\r\nimport com.mybatis3.domain.PhoneNumber;\r\n\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{\r\n\r\n\t@Override\r\n\tpublic void setNonNullParameter(PreparedStatement ps, int i,\r\n\t\t\tPhoneNumber parameter, JdbcType jdbcType) throws SQLException {\r\n\t\tps.setString(i, parameter.getAsString());\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, String columnName)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnName));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(ResultSet rs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(rs.getString(columnIndex));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)\r\n\t\t\tthrows SQLException {\r\n\t\treturn new PhoneNumber(cs.getString(columnIndex));\r\n\t}\r\n\r\n\t\r\n\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/java/com/mybatis3/util/MyBatisUtil.java",
    "content": "package com.mybatis3.util;\r\n\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.sql.Connection;\r\nimport java.sql.DriverManager;\r\nimport java.util.Properties;\r\n\r\nimport org.apache.ibatis.datasource.DataSourceFactory;\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.session.SqlSessionFactory;\r\nimport org.apache.ibatis.session.SqlSessionFactoryBuilder;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class MyBatisUtil\r\n{\r\n\tprivate static SqlSessionFactory sqlSessionFactory;\r\n\t\r\n\tprivate static final Properties PROPERTIES = new Properties();\r\n\t\r\n\tstatic\r\n\t{\r\n\t\ttry {\r\n\t\t\tInputStream is = DataSourceFactory.class.getResourceAsStream(\"/application.properties\");\r\n\t\t\tPROPERTIES.load(is);\r\n\t\t} catch (IOException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static Connection getConnection() \r\n\t{\r\n\t\tString driver = PROPERTIES.getProperty(\"jdbc.driverClassName\");\r\n\t\tString url = PROPERTIES.getProperty(\"jdbc.url\");\r\n\t\tString username = PROPERTIES.getProperty(\"jdbc.username\");\r\n\t\tString password = PROPERTIES.getProperty(\"jdbc.password\");\r\n\t\tConnection connection = null;\r\n\t\ttry {\r\n\t\t\tClass.forName(driver);\r\n\t\t\tconnection = DriverManager.getConnection(url, username, password);\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t} \r\n\t\treturn connection;\r\n\t}\r\n\t\r\n\tpublic static SqlSessionFactory getSqlSessionFactory()\r\n\t{\r\n\t\tif(sqlSessionFactory==null) \r\n\t\t{\r\n\t\t\tInputStream inputStream;\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tinputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");\r\n\t\t\t\tsqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);\r\n\t\t\t}catch (IOException e)\r\n\t\t\t{\r\n\t\t\t\tthrow new RuntimeException(e.getCause());\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sqlSessionFactory;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter05/src/main/resources/application.properties",
    "content": "\r\n\r\n################### DataSource Configuration ##########################\r\n\r\njdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/elearning\r\njdbc.username=root\r\njdbc.password=admin\r\n\r\n"
  },
  {
    "path": "chapter05/src/main/resources/applicationContext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txmlns:aop=\"http://www.springframework.org/schema/aop\"\r\n\txmlns:context=\"http://www.springframework.org/schema/context\"\r\n\txmlns:p=\"http://www.springframework.org/schema/p\"\r\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\r\n\txmlns:mybatis=\"http://mybatis.org/schema/mybatis-spring\"\r\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans \r\n\t\t\t\t\t\thttp://www.springframework.org/schema/beans/spring-beans.xsd\r\n\t\t\t\t\t\thttp://www.springframework.org/schema/aop \r\n\t\t\t\t\t\thttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd\r\n\t\t\t\t\t\thttp://www.springframework.org/schema/context \r\n\t\t\t\t\t\thttp://www.springframework.org/schema/context/spring-context.xsd\r\n\t\t\t\t\t\thttp://www.springframework.org/schema/tx \r\n\t\t\t\t\t\thttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd\r\n\t\t\t\t\t\thttp://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd\">\r\n\t\r\n\t<context:annotation-config />\r\n\r\n\t<context:component-scan base-package=\"com.mybatis3\" />\r\n\r\n\t<context:property-placeholder location=\"classpath:application.properties\" />\r\n\t\r\n     \r\n    <tx:annotation-driven transaction-manager=\"transactionManager\"/>\r\n\t\r\n\t<bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\r\n  \t\t<property name=\"dataSource\" ref=\"dataSource\" />\r\n\t</bean>\r\n\t\r\n\t<!-- <mybatis:scan base-package=\"com.mybatis3.mappers\"/> -->\r\n\t\r\n\t<!-- <bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\r\n\t  <property name=\"basePackage\" value=\"com.mybatis3.mappers\" />\r\n\t</bean> -->\r\n\r\n\t<bean id=\"sqlSession\" class=\"org.mybatis.spring.SqlSessionTemplate\">\r\n\t  <constructor-arg index=\"0\" ref=\"sqlSessionFactory\" />\r\n\t</bean>\r\n\t\r\n   \t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\r\n  \t\t<property name=\"dataSource\" ref=\"dataSource\" />\r\n  \t\t<property name=\"typeAliasesPackage\" value=\"com.mybatis3.domain\"/>\r\n  \t\t<property name=\"typeHandlersPackage\" value=\"com.mybatis3.typehandlers\"/>\r\n  \t\t<property name=\"mapperLocations\" value=\"classpath*:com/mybatis3/**/*.xml\" />\r\n\t</bean>\r\n\t\r\n     <bean id=\"dataSource\" class=\"org.springframework.jdbc.datasource.DriverManagerDataSource\">\r\n\t\t<property name=\"driverClassName\" value=\"${jdbc.driverClassName}\"/>\r\n\t\t<property name=\"url\" value=\"${jdbc.url}\"/>\r\n\t\t<property name=\"username\" value=\"${jdbc.username}\"/>\r\n\t\t<property name=\"password\" value=\"${jdbc.password}\"/>\r\n\t</bean>\r\n\t\r\n</beans>\r\n"
  },
  {
    "path": "chapter05/src/main/resources/com/mybatis3/mappers/StudentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.StudentMapper\">\r\n\t\r\n\t\r\n\t<resultMap type=\"Address\" id=\"AddressResult\">\r\n  \t\t<id property=\"addrId\" column=\"addr_id\"/>\r\n\t\t<result property=\"street\" column=\"street\"/>\r\n\t\t<result property=\"city\" column=\"city\"/>\r\n\t\t<result property=\"state\" column=\"state\"/>\r\n\t\t<result property=\"zip\" column=\"zip\"/>\r\n\t\t<result property=\"country\" column=\"country\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Student\" id=\"StudentWithAddressResult\">\r\n\t\t<id \tproperty=\"studId\" column=\"stud_id\"/>\r\n\t\t<result property=\"name\" column=\"name\"/>\r\n\t\t<result property=\"email\" column=\"email\"/>\r\n\t\t<association property=\"address\" resultMap=\"AddressResult\"/>\r\n\t</resultMap>\r\n\t\r\n\t\r\n</mapper>"
  },
  {
    "path": "chapter05/src/main/resources/com/mybatis3/mappers/TutorMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n<!DOCTYPE mapper\r\n  PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\r\n  \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\r\n  \r\n<mapper namespace=\"com.mybatis3.mappers.TutorMapper\">\r\n\t\t  \t\r\n  \t<resultMap type=\"Address\" id=\"AddressResult\">\r\n  \t\t<id property=\"addrId\" column=\"addr_id\"/>\r\n\t\t<result property=\"street\" column=\"street\"/>\r\n\t\t<result property=\"city\" column=\"city\"/>\r\n\t\t<result property=\"state\" column=\"state\"/>\r\n\t\t<result property=\"zip\" column=\"zip\"/>\r\n\t\t<result property=\"country\" column=\"country\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Course\" id=\"CourseResult\">\r\n  \t\t<id \tcolumn=\"course_id\" property=\"courseId\"/>\r\n  \t\t<result column=\"course_name\" property=\"name\"/>\r\n  \t\t<result column=\"description\" property=\"description\"/>\r\n  \t\t<result column=\"start_date\" property=\"startDate\"/>\r\n  \t\t<result column=\"end_date\" property=\"endDate\"/>\r\n  \t</resultMap>\r\n  \t\r\n  \t<resultMap type=\"Tutor\" id=\"TutorResult\">\r\n  \t\t<id \tcolumn=\"tutor_id\" property=\"tutorId\"/>\r\n  \t\t<result column=\"tutor_name\" property=\"name\"/>\r\n  \t\t<result column=\"email\" property=\"email\"/>\r\n  \t\t<association property=\"address\" resultMap=\"AddressResult\"/>\r\n  \t\t<collection property=\"courses\"  resultMap=\"CourseResult\"></collection>\r\n  \t</resultMap>\r\n  \t\r\n</mapper>"
  },
  {
    "path": "chapter05/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.com.mybatis3=DEBUG"
  },
  {
    "path": "chapter05/src/main/resources/sql/create_tables.sql",
    "content": "\r\nCREATE TABLE ADDRESSES \r\n(\r\n  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  STREET VARCHAR(50) NOT NULL,\r\n  CITY VARCHAR(50) NOT NULL,\r\n  STATE VARCHAR(50) NOT NULL,\r\n  ZIP VARCHAR(10) DEFAULT NULL,\r\n  COUNTRY VARCHAR(50) NOT NULL,\r\n  PRIMARY KEY (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE STUDENTS \r\n(\r\n  STUD_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  GENDER VARCHAR(6) DEFAULT NULL, \r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,  \r\n  PRIMARY KEY (STUD_ID),\r\n  UNIQUE KEY UK_EMAIL (EMAIL),\r\n  CONSTRAINT FK_STUDENTS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\nCREATE TABLE TUTORS \r\n(\r\n  TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(50) NOT NULL,\r\n  EMAIL VARCHAR(50) NOT NULL,\r\n  PHONE VARCHAR(15) DEFAULT NULL,  \r\n  DOB DATE DEFAULT NULL,\r\n  GENDER VARCHAR(6) DEFAULT NULL,\r\n  BIO LONGTEXT DEFAULT NULL,\r\n  PIC BLOB DEFAULT NULL,\r\n  ADDR_ID INT(11) DEFAULT NULL,\r\n  PRIMARY KEY (TUTOR_ID),\r\n  UNIQUE KEY UK_EMAIL (EMAIL),\r\n  CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)  \r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSES \r\n(\r\n  COURSE_ID INT(11) NOT NULL AUTO_INCREMENT,\r\n  NAME VARCHAR(100) NOT NULL,\r\n  DESCRIPTION VARCHAR(512) DEFAULT NULL,\r\n  START_DATE DATE DEFAULT NULL,\r\n  END_DATE DATE DEFAULT NULL,\r\n  TUTOR_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID),\r\n  CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID)\r\n) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=LATIN1;\r\n\r\n\r\nCREATE TABLE COURSE_ENROLLMENT\r\n(\r\n  COURSE_ID INT(11) NOT NULL,\r\n  STUD_ID INT(11) NOT NULL,\r\n  PRIMARY KEY (COURSE_ID,STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_STUD FOREIGN KEY (STUD_ID) REFERENCES STUDENTS (STUD_ID),\r\n  CONSTRAINT FK_ENROLLMENT_COURSE FOREIGN KEY (COURSE_ID) REFERENCES COURSES (COURSE_ID)\r\n) ENGINE=INNODB DEFAULT CHARSET=LATIN1;\r\n\r\n"
  },
  {
    "path": "chapter05/src/main/resources/sql/drop_tables.sql",
    "content": "\r\nDROP TABLE IF EXISTS USER_PICS;\r\nDROP TABLE IF EXISTS COURSE_ENROLLMENT;\r\nDROP TABLE IF EXISTS COURSES;\r\nDROP TABLE IF EXISTS TUTORS;\r\nDROP TABLE IF EXISTS STUDENTS;\r\nDROP TABLE IF EXISTS ADDRESSES;\r\n\r\n"
  },
  {
    "path": "chapter05/src/main/resources/sql/sample_data.sql",
    "content": "\n\n--Sample data for table ADDRESSES\n\nINSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES \n (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'),\n (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'),\n (3,'710 N Cable Rd','Lima','OH','45825','Allen'),\n (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche');\n\n-- Sample data for table STUDENTS\n\nINSERT INTO STUDENTS (STUD_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES \n (1,'Timothy','timothy@gmail.com','123-123-1234','1988-04-25','MALE',NULL,NULL,3),\n (2,'Douglas','douglas@gmail.com','789-456-1234','1990-08-15','MALE',NULL,NULL,4);\n\n-- Sample data for table TUTORS\n\nINSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES \n (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),\n (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),\n (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2),\n (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2);\n\n-- Sample data for table courses\n\nINSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES \n (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1),\n (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1),\n (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2);\n\n-- Sample data for table COURSE_ENROLLMENT\n\nINSERT INTO COURSE_ENROLLMENT (COURSE_ID,STUD_ID) VALUES \n (1,1),\n (1,2),\n (2,2);\n\n"
  },
  {
    "path": "chapter05/src/test/java/com/mybatis3/services/StudentServiceTest.java",
    "content": "package com.mybatis3.services;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport org.junit.BeforeClass;\r\nimport org.junit.Test;\r\nimport org.junit.runner.RunWith;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.dao.DataAccessException;\r\nimport org.springframework.test.context.ContextConfiguration;\r\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\r\n\r\nimport com.mybatis3.domain.Address;\r\nimport com.mybatis3.domain.PhoneNumber;\r\nimport com.mybatis3.domain.Student;\r\n\r\n@RunWith(SpringJUnit4ClassRunner.class)\r\n@ContextConfiguration(locations=\"classpath:applicationContext.xml\")\r\npublic class StudentServiceTest \r\n{\r\n\t@Autowired\r\n\tprivate StudentService studentService;\r\n\t\r\n\t@BeforeClass\r\n\tpublic static void setup() {\r\n\t\tTestDataPopulator.initDatabase();\r\n\t}\r\n\t\r\n\t@Test\r\n\tpublic void testFindAllStudents() {\r\n\t\tList<Student> students = studentService.findAllStudents();\r\n\t\tassertNotNull(students);\r\n\t\tfor (Student student : students)\r\n\t\t{\r\n\t\t\tSystem.err.println(student);\r\n\t\t}\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindStudentById() {\r\n\t\tStudent student = studentService.findStudentById(1);\r\n\t\tSystem.err.println(student);\r\n\t\tSystem.err.println(student.getAddress().getAddrId()+\":\"+student.getAddress().getCity());\r\n\t\t\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindStudentWithAddressById() {\r\n\t\tStudent student = studentService.findStudentWithAddressById(2);\r\n\t\tassertNotNull(student);\r\n\t\tSystem.out.println(student.getAddress().getAddrId()+\":\"+student.getAddress().getCity());\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testCreateStudent() {\r\n\t\t//Address address = new Address();\r\n\t\tAddress address = new Address(1,\"Quaker Ridge Rd.\",\"Bethel\",\"Brooklyn\",\"06801\",\"USA\");\r\n\t\t/*address.setStreet(\"Quaker Ridge Rd.\");\r\n\t\taddress.setCity(\"Bethel\");\r\n\t\taddress.setState(\"Brooklyn\");\r\n\t\taddress.setZip(\"06801\");\r\n\t\taddress.setCountry(\"USA\");*/\r\n\t\t\r\n\t\tStudent stud = new Student();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstud.setName(\"stud_\"+ts);\r\n\t\tstud.setEmail(\"stud_\"+ts+\"@gmail.com\");\r\n\t\tstud.setPhone(new PhoneNumber(\"123-456-7890\"));\r\n\t\tstud.setAddress(address);\r\n\t\tStudent student = studentService.createStudent(stud);\r\n\t\tassertNotNull(student);\r\n\t\tassertEquals(\"stud_\"+ts, student.getName());\r\n\t\tassertEquals(\"stud_\"+ts+\"@gmail.com\", student.getEmail());\r\n\t\tSystem.err.println(\"CreatedStudent: \"+student);\r\n\t}\r\n\r\n\t@Test(expected=DataAccessException.class)\r\n\tpublic void testCreateStudentForException() {\r\n\t\tAddress address = new Address();\r\n\t\taddress.setStreet(\"Quaker Ridge Rd.\");\r\n\t\taddress.setCity(\"Bethel\");\r\n\t\taddress.setState(\"Brooklyn\");\r\n\t\taddress.setZip(\"06801\");\r\n\t\taddress.setCountry(\"USA\");\r\n\t\t\r\n\t\tStudent stud = new Student();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstud.setName(\"stud_\"+ts);\r\n\t\tstud.setEmail(\"timothy@gmail.com\");\r\n\t\tstud.setPhone(new PhoneNumber(\"123-456-7890\"));\r\n\t\tstud.setAddress(address);\r\n\t\tstudentService.createStudent(stud);\r\n\t\tfail(\"You should not reach here\");\r\n\t}\r\n\t\r\n\t@Test\r\n\tpublic void testCreateStudentWithMap() {\r\n\t\tMap<String, Object> studMap = new HashMap<String, Object>();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstudMap.put(\"name\",\"stud_\"+ts);\r\n\t\tstudMap.put(\"email\",\"stud_\"+ts+\"@gmail.com\");\r\n\t\tstudMap.put(\"phone\",null);\r\n\t\tstudentService.createStudentWithMap(studMap);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testUpdateStudent() {\r\n\t\tStudent stud = new Student();\r\n\t\tlong ts = System.currentTimeMillis();\r\n\t\tstud.setStudId(2);\r\n\t\tstud.setName(\"studddd_\"+ts);\r\n\t\tstud.setEmail(\"studddd_\"+ts+\"@gmail.com\");\r\n\t\tStudent student = studentService.updateStudent(stud);\r\n\t\tassertNotNull(student);\r\n\t\tassertEquals(\"studddd_\"+ts, student.getName());\r\n\t\tassertEquals(\"studddd_\"+ts+\"@gmail.com\", student.getEmail());\r\n\t\tassertEquals(new Integer(2), student.getStudId());\r\n\t\t\r\n\t\tSystem.out.println(\"UpdatedStudent: \"+student);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testDeleteStudent() {\r\n\t\tboolean deleted = studentService.deleteStudent(3);\r\n\t\tassertTrue(deleted);\r\n\t\tSystem.err.println(\"deleteStudent:\"+deleted);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindStudentMapById() {\r\n\t\tMap<String, Object> studentMap = studentService.findStudentMapById(1);\r\n\t\tSystem.err.println(studentMap);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindAllStudentsMap() {\r\n\t\tList<Map<String,Object>> studentMapList = studentService.findAllStudentsMap();\r\n    \tfor(Map<String,Object> studentMap : studentMapList)\r\n    \t{\r\n    \t\tSystem.out.println(\"id :\"+studentMap.get(\"id\"));\r\n    \t\tSystem.out.println(\"name :\"+studentMap.get(\"name\"));\r\n    \t\tSystem.out.println(\"email :\"+studentMap.get(\"email\"));\r\n    \t\tSystem.out.println(\"phone :\"+studentMap.get(\"phone\"));\r\n    \t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "chapter05/src/test/java/com/mybatis3/services/TestDataPopulator.java",
    "content": "/**\r\n * \r\n */\r\npackage com.mybatis3.services;\r\n\r\nimport java.io.Reader;\r\nimport java.sql.Connection;\r\n\r\nimport org.apache.ibatis.io.Resources;\r\nimport org.apache.ibatis.jdbc.ScriptRunner;\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport com.mybatis3.util.MyBatisUtil;\r\n\r\n/**\r\n * @author Siva\r\n *\r\n */\r\npublic class TestDataPopulator \r\n{\r\n\tprivate static Logger logger = LoggerFactory.getLogger(TestDataPopulator.class);\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tinitDatabase();\r\n\t}\r\n\t\r\n\tpublic static void initDatabase()\r\n\t{\r\n\t\tConnection connection = null;\r\n\t\tReader reader = null;\r\n\t\ttry {\r\n\t\t\tconnection = MyBatisUtil.getConnection();\r\n\t\t\tScriptRunner scriptRunner = new ScriptRunner(connection);\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/drop_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader);\r\n\t\t\tlogger.info(\"drop_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/create_tables.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"create_tables.sql executed successfully\");\r\n\t\t\treader = Resources.getResourceAsReader(\"sql/sample_data.sql\");\r\n\t\t\tscriptRunner.runScript(reader );\r\n\t\t\tlogger.info(\"sample_data.sql executed successfully\");\r\n\t\t\tconnection.commit();\r\n\t\t\treader.close();\r\n\t\t\tscriptRunner.closeConnection();\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "chapter05/src/test/java/com/mybatis3/services/TutorServiceTest.java",
    "content": "package com.mybatis3.services;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\nimport java.util.List;\r\n\r\nimport org.junit.BeforeClass;\r\nimport org.junit.Test;\r\nimport org.junit.runner.RunWith;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.test.context.ContextConfiguration;\r\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\r\n\r\nimport com.mybatis3.domain.Tutor;\r\n\r\n@RunWith(SpringJUnit4ClassRunner.class)\r\n@ContextConfiguration(locations=\"classpath:applicationContext.xml\")\r\npublic class TutorServiceTest \r\n{\r\n\t@Autowired\r\n\tprivate TutorService tutorService;\r\n\t\r\n\t@BeforeClass\r\n\tpublic static void setup() {\r\n\t\tTestDataPopulator.initDatabase();\r\n\t}\r\n\r\n\t\r\n\t@Test\r\n\tpublic void testFindAllTutors() {\r\n\t\tList<Tutor> tutors = tutorService.findAllTutors();\r\n\t\tassertNotNull(tutors);\r\n\t\tfor (Tutor tutor : tutors)\r\n\t\t{\r\n\t\t\tSystem.err.println(tutor);\r\n\t\t}\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindTutorById() {\r\n\t\tTutor tutor = tutorService.findTutorById(1);\r\n\t\tassertNotNull(tutor);\r\n\t\t//System.err.println(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testFindTutorByNameAndEmail() {\r\n\t\tTutor tutor = tutorService.findTutorByNameAndEmail(\"Paul\", \"paul@gmail.com\");\r\n\t\tassertNotNull(tutor);\r\n\t\t//System.err.println(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testCreateTutor() {\r\n\t\tTutor tutor = new Tutor();\r\n\t\ttutor.setName(\"siva\");\r\n\t\ttutor.setEmail(\"siva@gmail.com\");\r\n\t\ttutor = tutorService.createTutor(tutor);\r\n\t\tassertNotNull(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testUpdateTutor() {\r\n\t\tTutor tutor = new Tutor();\r\n\t\ttutor.setTutorId(1);\r\n\t\ttutor.setName(\"sivaprasad\");\r\n\t\ttutor.setEmail(\"sivaprasad@gmail.com\");\r\n\t\ttutor = tutorService.updateTutor(tutor);\r\n\t\tTutor updTutor = tutorService.findTutorById(1);\r\n\t\tassertNotNull(updTutor);\r\n\t\tSystem.err.println(updTutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testDeleteTutor() {\r\n\t\tboolean deleted = tutorService.deleteTutor(4);\r\n   \t\tassertTrue(deleted);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testSelectTutorById() {\r\n\t\tTutor tutor = tutorService.selectTutorById(1);\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor);\r\n\t}\r\n\r\n\t@Test\r\n\tpublic void testSelectTutorWithCoursesById() {\r\n\t\tTutor tutor = tutorService.selectTutorWithCoursesById(1);\r\n\t\tassertNotNull(tutor);\r\n\t\tSystem.err.println(tutor);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "elearning/README.txt",
    "content": "This module demonstrate developing a simple web app using MyBatis persistence framework."
  },
  {
    "path": "elearning/pom.xml",
    "content": "<?xml version=\"1.0\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" \n\txmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  \n  <groupId>com.mybatis3</groupId>\n    <version>0.0.1</version>\n  \t<artifactId>elearning</artifactId>\n  <packaging>war</packaging>\n  <name>E-Learning Webapp</name>\n  <url>http://maven.apache.org</url>\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <java.version>1.6</java.version>\n    <junit.version>4.8.2</junit.version>\n    <slf4j.version>1.6.2</slf4j.version>\n    <logback.version>1.0.1</logback.version>\n    <log4j.version>1.2.16</log4j.version>\n    \n    <spring.version>3.1.0.RELEASE</spring.version>\n    <mybatis.version>3.2.2</mybatis.version>\n    <mybatis-spring.version>1.2.0</mybatis-spring.version>\n    <mybatis-ehcache.version>1.0.0</mybatis-ehcache.version>\n    \n    <aspectj.version>1.6.8</aspectj.version>\n    <cglib.version>2.2</cglib.version>\n    <mysql.version>5.1.18</mysql.version>\n        \n    <commons.dbcp.version>1.4</commons.dbcp.version>\n    <commons.pool.version>1.6</commons.pool.version>\n    <commons.lang.version>2.5</commons.lang.version>  \n    \n    <servlet.version>2.5</servlet.version>\n    <jsp.version>2.1</jsp.version>\n    <jstl.version>1.2</jstl.version>\n    <taglibs-standard.version>1.1.2</taglibs-standard.version>\n    \n    <maven.compiler.plugin>2.3.2</maven.compiler.plugin>\n    <maven.failsafe.plugin>2.4.3-alpha-1</maven.failsafe.plugin>\n        \n  </properties>\n\n\t<dependencies>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis-spring</artifactId>\n\t\t</dependency>\n\t\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t \n\t</dependencies>\n  \n  \t<build>\n\t\t<finalName>${project.artifactId}</finalName>\n\t\t<plugins>\n\t\t\t<plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>${maven.compiler.plugin}</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <encoding>${project.build.sourceEncoding}</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n\t\t        <groupId>org.codehaus.mojo</groupId>\n\t\t        <artifactId>failsafe-maven-plugin</artifactId>\n\t\t        <version>${maven.failsafe.plugin}</version>\n\t\t        <executions>\n\t\t          <execution>\n\t\t            <goals>\n\t\t              <goal>integration-test</goal>\n\t\t              <goal>verify</goal>\n\t\t            </goals>\n\t\t          </execution>\n\t\t        </executions>\n\t\t      </plugin>\n\t\t</plugins>\n\t</build>\n\t\n  <dependencyManagement>\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>jcl-over-slf4j</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<!-- Spring -->\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>commons-logging</groupId>\n\t\t\t\t\t<artifactId>commons-logging</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-orm</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-web</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-webmvc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.aspectj</groupId>\n\t\t\t<artifactId>aspectjrt</artifactId>\n\t\t\t<version>${aspectj.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.aspectj</groupId>\n\t\t\t<artifactId>aspectjweaver</artifactId>\n\t\t\t<version>${aspectj.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>cglib</groupId>\n\t\t\t<artifactId>cglib-nodep</artifactId>\n\t\t\t<version>${cglib.version}</version>\n\t\t</dependency>\n\n\t\t<!-- MyBatis -->\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis</artifactId>\n\t\t\t<version>${mybatis.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis-spring</artifactId>\n\t\t\t<version>${mybatis-spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis</groupId>\n\t\t\t<artifactId>mybatis-ehcache</artifactId>\n\t\t\t<version>1.0.0</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>commons-dbcp</groupId>\n\t\t\t<artifactId>commons-dbcp</artifactId>\n\t\t\t<version>${commons.dbcp.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>commons-lang</groupId>\n\t\t\t<artifactId>commons-lang</artifactId>\n\t\t\t<version>${commons.lang.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>commons-pool</groupId>\n\t\t\t<artifactId>commons-pool</artifactId>\n\t\t\t<version>${commons.pool.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>javax.servlet</groupId>\n\t\t\t<artifactId>servlet-api</artifactId>\n\t\t\t<version>${servlet.version}</version>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>javax.servlet.jsp</groupId>\n\t\t\t<artifactId>jsp-api</artifactId>\n\t\t\t<version>${jsp.version}</version>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>taglibs</groupId>\n\t\t\t<artifactId>standard</artifactId>\n\t\t\t<version>${taglibs-standard.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>javax.servlet</groupId>\n\t\t\t<artifactId>jstl</artifactId>\n\t\t\t<version>${jstl.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>opensymphony</groupId>\n\t\t\t<artifactId>sitemesh</artifactId>\n\t\t\t<version>2.4.2</version>\n\t\t</dependency>\n\n\t</dependencies>\n</dependencyManagement>\n \n</project>\n"
  },
  {
    "path": "elearning/src/main/resources/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.appender.file=org.apache.log4j.RollingFileAppender\r\nlog4j.appender.file.File=mybatisapp.log\r\nlog4j.appender.R.MaxFileSize=100KB\r\n# Keep one backup file\r\nlog4j.appender.R.MaxBackupIndex=10\r\nlog4j.appender.file.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.file.layout.ConversionPattern=%d [%-5p] %c - %m%n\r\n\r\nlog4j.logger.chapter02=DEBUG"
  },
  {
    "path": "elearning/src/main/webapp/WEB-INF/web.xml",
    "content": "<!DOCTYPE web-app PUBLIC\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" >\n\n<web-app>\n  <display-name>Archetype Created Web Application</display-name>\n</web-app>\n"
  },
  {
    "path": "elearning/src/main/webapp/index.jsp",
    "content": "<html>\n<body>\n<h2>Hello World!</h2>\n</body>\n</html>\n"
  }
]