本项目是一个入门的纯mybatis项目,仅仅完成了对单表的增删改查,适合刚入门的菜鸟做训练,大牛跳过,菜鸟看不懂请留言,欢迎指点。
准备工具:
jdk 1.7
tomcant 7
myclipse 10.7
一、创建一个Web项目,项目名称自己定义,我的项目名称是:MybatisWholeProject
二、项目骨架
三、开发步骤
3.1导入jar包,将开发项目所需要的jar包复制到项目根目录下的lib文件夹下
junit-4.7.jar 用于单元测试
log4j-1.2.15.jar 打印日子
mybatis-3.3.0.jar 用于mybatis
mysql-connector-java-5.1.25-bin.jar 与mysql数据连接
3.2创建两个属性文件,分别为jdbc.properties和log4j.properties
3.2.1 jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=root
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
3.2.2 log4j.properties
#定义LOG输出级别
log4j.rootLogger=DEBUG,INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
3.3配置核心文件mybatis-config.xml
3.3.1 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>
<!--引入外部properties文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 设置配置,在控制台打印sql语句 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件的位置 -->
<mappers>
<mapper resource="com/llf/mappers/StudentMapper.xml" />
</mappers>
</configuration>
3.4代码开发
3.4.1 类所在的包,这里分为7个包,不要觉得繁琐,耐心,继续往下
com.llf.dao 数据访问层的接口,定义与数据库交互的方法
com.llf.dao.impl 数据访问层的实现,实现与数据库交互的具体操作
com.llf.entity 实体层,类对象对应数据库中的表
com.llf.service 业务层的接口,定义业务逻辑的的方法
com.llf.service.impl 业务层的是想,实现业务逻辑的具体操作
com.llf.mappers 映射器类,类与表的映射以及执行sql语句都放在里面
com.llf.test 测试类,进行单元测试
com.llf.util 辅助类,解析配置文件,获取session
3.4.2.创建实体类Student
截图
代码
package com.llf.entity;
public class Student {
private int studentId;
private String studentName;
private String studentAge;
private String studentSex;
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentAge() {
return studentAge;
}
public void setStudentAge(String studentAge) {
this.studentAge = studentAge;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
@Override
public String toString() {
return "hi,大家好!"+"我是"+this.studentName;
}
}
3.4.3 在mysql数据库创建一个名为mybatis数据库以及创建一个名为t_student表并插入两条数据
sql语句
drop table if exists t_student;
create table t_student(
sid int(20) primary key auto_increment,
sname varchar(20) not null,
sage varchar(5) not null,
ssex varchar(5) not null
);
insert into t_student(sname,sage,ssex)values('张三','20','男');
insert into t_student(sname,sage,ssex)values('李四','20','女');
运行查询之后的结果
3.3.4创建辅助类
截图
代码
package com.llf.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.llf.entity.Student;
public class MybatisUtil {
private final static SqlSessionFactory sqlSessionFactory;
static {
// mybatis的配置文件位置
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
// 将xml的配置信息注入
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
// 建一个session的工厂类
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSession getSession() {
// 获得一个session
return sqlSessionFactory.openSession();
}
}
3.4.5数据访问层
截图
代码1:StudentDao.java
package com.llf.dao;
import java.util.List;
import com.llf.entity.Student;
public interface StudentDao {
public abstract void addStudent(Student student);
void updateStudent(Student student);
void deleteStudent(int id);
List<Student> queryStudentList();
Student queryStudent(int id);
}
代码2:StudentDaoImpl
package com.llf.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.llf.dao.StudentDao;
import com.llf.entity.Student;
import com.llf.util.MybatisUtil;
public class StudentDaoImpl implements StudentDao{
private SqlSession sqlSession = MybatisUtil.getSession();
//这里几个方法的第一个参数是StudentMapper.xml中的"命名空.id的属性值"
@Override
public void addStudent(Student student) {
sqlSession.insert("sutdentMapper.addStudent", student);
sqlSession.commit();
}
@Override
public void updateStudent(Student student) {
sqlSession.update("sutdentMapper.updateStudent", student);
sqlSession.commit();
}
@Override
public void deleteStudent(int id) {
sqlSession.delete("sutdentMapper.deleteStudent", id);
sqlSession.commit();
}
@Override
public List<Student> queryStudentList() {
return sqlSession.selectList("sutdentMapper.queryStudentList");
}
@Override
public Student queryStudent(int id) {
return (Student)sqlSession.selectOne("sutdentMapper.queryStudent",id);
}
}
3.4.6业务逻辑层
截图
代码1:StudentService.java
在这里插入package com.llf.service;
import java.util.List;
import com.llf.entity.Student;
public interface StudentService {
public abstract void addStudent(Student student);
void updateStudent(Student student);
void deleteStudent(int id);
List<Student> queryStudentList();
Student queryStudent(int id);
}
代码片
代码2:StudentServiceImpl.java
package com.llf.service.impl;
import java.util.List;
import com.llf.dao.StudentDao;
import com.llf.dao.impl.StudentDaoImpl;
import com.llf.entity.Student;
import com.llf.service.StudentService;
public class StudentServiceImpl implements StudentService{
private StudentDao student = new StudentDaoImpl();
@Override
public void addStudent(Student student) {
this.student.addStudent(student);
}
@Override
public void updateStudent(Student student) {
this.student.updateStudent(student);
}
@Override
public void deleteStudent(int id) {
this.student.deleteStudent(id);
}
@Override
public List<Student> queryStudentList() {
return this.student.queryStudentList();
}
@Override
public Student queryStudent(int id) {
return this.student.queryStudent(id);
}
}
3.4.7 映射器
截图
代码:StudentMapper.xml
<?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">
<mapper namespace="sutdentMapper">
<resultMap type="com.llf.entity.Student" id="studentResultMap">
<id property="studentId" column="sid" />
<result property="studentName" column="sname"/>
<result property="studentAge" column="sage"/>
<result property="studentSex" column="ssex"/>
</resultMap>
<insert id="addStudent" parameterType="com.llf.entity.Student" useGeneratedKeys="true" keyProperty="sid">
insert into t_student(sname,sage,ssex)values(#{studentName},#{studentAge},#{studentSex})
</insert>
<update id="updateStudent" parameterType="com.llf.entity.Student">
update t_student set sname=#{studentName} , sage=#{studentAge}, ssex=#{studentSex}
where sid=#{studentId}
</update>
<delete id="deleteStudent" parameterType="int">
delete from t_student where sid = #{studentId}
</delete>
<select id="queryStudentList" resultMap="studentResultMap">
select * from t_student
</select>
<select id="queryStudent" parameterType="int" resultMap="studentResultMap">
select * from t_student where sid =13
</select>
</mapper>
3.4.8测试类
截图
代码:
package com.llf.test;
import java.util.List;
import org.junit.Test;
import com.llf.entity.Student;
import com.llf.service.StudentService;
import com.llf.service.impl.StudentServiceImpl;
public class TestStudent {
private StudentService studentService = new StudentServiceImpl();
@Test
public void addStudent(){
Student student = new Student();
String studentName = "蒙文峰";
String studentAge = "30";
String studentSex = "男";
student.setStudentName(studentName);
student.setStudentAge(studentAge);
student.setStudentSex(studentSex);
this.studentService.addStudent(student);
}
@Test
public void updateStudent(){
Student student = new Student();
int studentId = 3;
String studentName = "何义";
String studentAge = "30";
String studentSex = "男";
student.setStudentId(studentId);
student.setStudentName(studentName);
student.setStudentAge(studentAge);
student.setStudentSex(studentSex);
this.studentService.updateStudent(student);
}
@Test
public void deleteStudent(){
int studentId = 3;
this.studentService.deleteStudent(studentId);
}
@Test
public void queryStudentList(){
List<Student> studentList = this.studentService.queryStudentList();
for(Student s:studentList){
System.out.println(s);
}
}
@Test
public void queryStudent(){
System.out.println(this.studentService.queryStudent(3));
}
}
四、测试结果
切换到测试类,然后一一执行单元测试中的方法
4.1在数据库插入一条记录
选中如下方法,然后右键–》Run As --> Junit Test
执行前表中的数据是:
执行后:
4.2在表中更改一条记录
选中如下方法,然后右键–》Run As --> Junit Test
执行前表中的数据是:
执行后:
4.3删除表中的一条记录
选中如下方法,然后右键–》Run As --> Junit Test
执行前:
执行后:
4.4查询出表中的所有记录,并打印出姓名
选中如下方法,然后右键–》Run As --> Junit Test
五、总结
mybatis是一个orm框架,也是一个持久层框架,核心思想就是:通过管理对象来操作数据库。
谢谢观看。