1. 创建一个Web项目。
2. 导入mybatis和jdbc所需的jar包。
3. 在数据库创建一张表students:
DROP TABLE IF EXISTS students;
CREATE TABLE students
(
stud_no INTEGER NOT NULL,
stud_name VARCHAR(50) NOT NULL,
birthday DATE NOT NULL,
email VARCHAR(128),
PRIMARY KEY (stud_no)
);
4. log4j.properties配置:
log4j.rootLogger=debug, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.org.apache=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
5. 实体类Student:
package com.huey.mybatis.entity;
import java.util.Date;
/**
* 学生实体
* @author huey2672
* @version 1.0
* @created 2014-7-25
*/
public class Student {
private Integer no;
private String name;
private Date birthday;
private String email;
public Integer getNo() {
return no;
}
public void setNo(Integer no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Student() {
super();
}
public Student(Integer no, String name, Date birthday, String email) {
super();
this.no = no;
this.name = name;
this.birthday = birthday;
this.email = email;
}
@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + ", birthday="
+ birthday + ", email=" + email + "]";
}
}
6. 映射器StudentMapper:
package com.huey.mybatis.mapper;
import java.util.List;
import com.huey.mybatis.entity.Student;
/**
* 映射器StudentMapper
* 定义了对学生实体的一些基本操作
* @author huey2672
* @version 1.0
* @created 2014-7-25
*/
public interface StudentMapper {
/**
* 添加学生记录
* @param student
*/
public void addStudent(Student student);
/**
* 删除学生记录
* @param studNo
*/
public void deleteStudent(Integer studNo);
/**
* 更新学生记录
* @param student
*/
public void updateStudent(Student student);
/**
* 根据学生学号查询学生记录
* @param studNo
* @return
*/
public Student getStudent(Integer studNo);
/**
* 查询所有学生记录
* @return
*/
public List<Student> getAllStudents();
}
7. 配置映射文件StudentMapper.xml(与StudentMapper.java同一目录):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--注意:此处的命名空间是StudentMapper的全限定类名-->
<mapper namespace="com.huey.mybatis.mapper.StudentMapper">
<!-- ResultMaps被用来将 SQL SELECT语句的结果集映射到JavaBeans的属性中 -->
<resultMap type="Student" id="studentMap">
<!-- 映射主键 -->
<id property="no" column="stud_no" />
<!-- 映射普通字段 -->
<result property="name" column="stud_name"/>
<result property="birthday" column="birthday"/>
<result property="email" column="email"/>
</resultMap>
<!-- 添加学生记录 -->
<!-- id名称需要与StudentMapper中的方法签名一致 -->
<!-- Student这一别名在mybatis-config.xml中配置 -->
<insert id="addStudent" parameterType="Student">
insert into students(stud_no, stud_name, birthday, email)
values(#{no}, #{name}, #{birthday}, #{email})
</insert>
<!-- 删除学生记录 -->
<delete id="deleteStudent" parameterType="int">
delete from students where stud_no=#{studNo}
</delete>
<!-- 更新学生记录 -->
<update id="updateStudent" parameterType="Student">
update students
set stud_name=#{name}, birthday=#{birthday}, email=#{email}
where stud_no=#{no}
</update>
<!-- 根据学生学号查询学生记录 -->
<select id="getStudent" parameterType="int" resultMap="studentMap">
select * from students where stud_no=#{studNo}
</select>
<!-- 查询所有学生记录 -->
<select id="getAllStudents" resultMap="studentMap">
select * from students
</select>
</mapper>
8. 配置文件mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 设置别名 -->
<typeAliases>
<typeAlias type="com.huey.mybatis.entity.Student" alias="Student" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- mapper对应的xml配置文件 -->
<mappers>
<mapper resource="com/huey/mybatis/mapper/StudentMapper.xml" />
</mappers>
</configuration>
9. 工具类MyBatisUtil:
package com.huey.mybatis.utils;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* Mybatis工具类,主要负责创建、获取SqlSessionFactory实例
* @author huey2672
* @version 1.0
* @created 2014-7-25
*/
public class MybatisUtil {
private static SqlSessionFactory sessionFactory;
private static InputStream inputStream;
/**
* 加载mybatis-config.xml,创建SqlSessionFactory实例
*/
static {
try {
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 每个数据库环境应该就只有一个SqlSessionFactory对象实例
* 所以使用单例模式只创建一个SqlSessionFactory实例
* @return
*/
public static SqlSessionFactory getSqlSessionFactory() {
return sessionFactory;
}
}
10. 业务逻辑层接口StudentServ:
package com.huey.mybatis.serv;
import java.util.List;
import com.huey.mybatis.entity.Student;
/**
* 业务逻辑层接口StudentServ
* @author huey2672
* @version 1.0
* @created 2014-7-25
*/
public interface StudentServ {
/**
* 添加学生记录
* @param student
*/
public void addStudent(Student student);
/**
* 删除学生记录
* @param studNo
*/
public void deleteStudent(Integer studNo);
/**
* 更新学生记录
* @param student
*/
public void updateStudent(Student student);
/**
* 根据学生学号查询学生记录
* @param studNo
* @return
*/
public Student getStudent(Integer studNo);
/**
* 查询所有学生记录
* @return
*/
public List<Student> getAllStudents();
}
11. 业务逻辑层实现StudentServImpl:
package com.huey.mybatis.serv.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.huey.mybatis.entity.Student;
import com.huey.mybatis.mapper.StudentMapper;
import com.huey.mybatis.serv.StudentServ;
import com.huey.mybatis.utils.MybatisUtil;
/**
* 业务逻辑层实现StudentServImpl
* @author huey2672
* @version 1.0
* @created 2014-7-25
*/
public class StudentServImpl implements StudentServ {
private SqlSessionFactory sessionFactory = MybatisUtil.getSqlSessionFactory();
@Override
public void addStudent(Student student) {
/**
* 每一个线程应该有它自己的SqlSession实例。
* SqlSession对象实例不是线程安全的,并且不被共享。
* 所以SqlSession的作用域最好就是其所在方法的作用域。
* 从Web应用程序角度上看,SqlSession应该存在于request级别作用域上。
*/
SqlSession session = sessionFactory.openSession();
try {
// 获取mapper
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
//
studentMapper.addStudent(student);
// 提交事务
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
session.close();
}
}
@Override
public void deleteStudent(Integer studNo) {
SqlSession session = sessionFactory.openSession();
try {
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.deleteStudent(studNo);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
@Override
public void updateStudent(Student student) {
SqlSession session = sessionFactory.openSession();
try {
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.updateStudent(student);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
@Override
public Student getStudent(Integer studNo) {
SqlSession session = sessionFactory.openSession();
Student student = null;
try {
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
student = studentMapper.getStudent(studNo);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return student;
}
@Override
public List<Student> getAllStudents() {
SqlSession session = sessionFactory.openSession();
List<Student> students = new ArrayList<Student>();
try {
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
students = studentMapper.getAllStudents();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return students;
}
}
package com.huey.mybatis.serv.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import com.huey.mybatis.entity.Student;
import com.huey.mybatis.serv.StudentServ;
import com.huey.mybatis.serv.impl.StudentServImpl;
/**
* 单元测试类StudentServTest
* 用于测试StudentServImpl中的方法
* @author huey2672
* @version 1.0
* @created 2014-7-25
*/
public class StudentServImplTest {
StudentServ studentServ = new StudentServImpl();
/**
* 测试addStudent方法
* @throws Exception
*/
@Test
public void testAddStudent() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = sdf.parse("2008-08-08");
Student student = new Student(10001, "张三", birthday, "zs@gamil.com");
studentServ.addStudent(student);
}
/**
* 测试deleteStudent方法
* @throws Exception
*/
@Test
public void testDeleteStudent() throws Exception {
int studNo = 10001;
studentServ.deleteStudent(studNo);
}
/**
* 测试updateStudent方法
* @throws Exception
*/
@Test
public void testUpdateStudent() throws Exception {
int studNo = 10001;
Student student = studentServ.getStudent(studNo);
student.setEmail("zhangsan@gmail.com");
studentServ.updateStudent(student);
}
/**
* 测试getStudent方法
* @throws Exception
*/
@Test
public void testGetStudent() throws Exception {
int studNo = 10001;
Student student = studentServ.getStudent(studNo);
System.out.println(student);
}
/**
* 测试getAllStudents方法
* @throws Exception
*/
@Test
public void testGetAllStudents() throws Exception {
List<Student> students = studentServ.getAllStudents();
for (Student student : students) {
System.out.println(student);
}
}
}