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