1、JUnit单元测试
可以同时存在多个测试方法,每一个测试方法都可以单独运行,不受其他测试方法的影响。
@Test的设置:
方法名可以任意取,但必须是public void,需要在方法头上加注解@Test表明此方法可进行单元测试,第一次使用时需要导入JUnit。
@Test的使用:
需要测试哪一个方法时,就把鼠标光标放在此方法名上,然后在运行。不能放在其他位置。
@Before的使用:
使用@Before的方法会在需要测试的方法执行之前执行,此方法一般用于搭建测试方法的执行环境。
@After的使用:
使用@Before的方法会在需要测试的方法执行之前执行,此方法一般用于资源的释放。
之前的测试类:
public class MyView {
public static void main(String[] args) {
IStudentService service = new StudentServiceImpl();
Student student = new Student("口口", 23);
service.addStudent(student);
}
}
这样的弊端就是要测试某一项功能,就需要注释其他的代码,否则代码会全部执行。
使用JUnit单元测试之后:
public class MyView {
IStudentService service;
//此方法一般用于搭建测试方法的执行环境
@Before
public void Before() {
System.out.println("=========before=========");
service = new StudentServiceImpl();
}
//此方法一般用于资源的释放
@After
public void After() {
System.out.println("--------after-----------");
}
@Test
public void test01() {
Student student = new Student("张三", 23);
service.addStudent(student);
}
}
当增删改查的语句多的之后,好处就体现出来了。
2、单表的CURD
现在的结构如图所示:
实体类Student.java:
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Student {//使用了lombok.jar包
private Integer id;
private String name;
private Integer age;
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
}
dao层IStudentDao.java接口:
public interface IStudentDao {
void insertStudent(Student student);//插入
void deleteById(int id);//删除
void updateStudent(Student student);//修改
Student selectById(int id);//根据id查询
}
dao层StudentDaoImpl.java实现类:
public class StudentDaoImpl implements IStudentDao {
private SqlSession session;
@Override
public void insertStudent(Student student) {
try {
SqlSession session = MyBatisUtil.getSqlSession();
//4、操作
session.insert("insertStu",student);
//5、提交
session.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (session != null) {
//6、关闭
session.close();
}
}
}
@Override
public void deleteById(int id) {
try {
SqlSession session = MyBatisUtil.getSqlSession();
//4、操作
session.delete("deleteById",id);
//5、提交
session.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (session != null) {
//6、关闭
session.close();
}
}
}
@Override
public void updateStudent(Student student) {
try {
SqlSession session = MyBatisUtil.getSqlSession();
//4、操作
session.update("updateStudent",student);
//5、提交
session.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (session != null) {
//6、关闭
session.close();
}
}
}
@Override
public Student selectById(int id) {
Student student = null;
try {
SqlSession session = MyBatisUtil.getSqlSession();
//4、操作
student = session.selectOne("selectById",id);
//5、提交
session.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (session != null) {
//6、关闭
session.close();
}
}
return student;
}
}
目前还有很多重复的代码,不过之后使用mapper的动态代理就可以解决这个问题
mapper.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="test">
<!-- 增删改的parameterType属性可以省略 -->
<insert id="insertStu">
insert into student(name,age) value (#{name}, #{age})
</insert>
<delete id="deleteById" parameterType="Student">
delete from student where id=#{id}
</delete>
<update id="updateStudent">
update student set name=#{name},age=#{age} where id=#{id}
</update>
<!-- resultType指定的是需要将结果集封装成指定的对象 -->
<select id="selectById" resultType="Student">
select * from student where id=#{id}
</select>
</mapper>
service层的IStudentService.java接口:
public interface IStudentService {
void addStudent(Student student);//添加
void removeById(int id);//删除
void modifyStudent(Student student);//修改
Student findById(int id);//根据id查询
}
service层的StudentServiceImpl.java实现类:
public class StudentServiceImpl implements IStudentService {
IStudentDao dao = new StudentDaoImpl();
@Override
public void addStudent(Student student) {
dao.insertStudent(student);
}
@Override
public void removeById(int id) {
dao.deleteById(id);
}
@Override
public void modifyStudent(Student student) {
dao.updateStudent(student);
}
@Override
public Student findById(int id) {
return dao.selectById(id);
}
}
view层的MyView.java(作为测试类):
public class MyView {
IStudentService service;
//此方法一般用于搭建测试方法的执行环境
@Before
public void Before() {
System.out.println("=========before=========");
service = new StudentServiceImpl();
}
//此方法一般用于资源的释放
@After
public void After() {
System.out.println("--------after-----------");
}
@Test
public void test01() {
Student student = new Student("张三", 23);
service.addStudent(student);
}
@Test
public void test02() {
service.removeById(50);
}
@Test
public void test03() {
Student student = new Student("王五",22);
student.setId(49);
service.modifyStudent(student);
}
@Test
public void test04() {
Student stu = service.findById(53);
System.out.println(stu);
}
}
工具类MyBatisUtil.java:
public class MyBatisUtil {
private static SqlSessionFactory factory;
public static SqlSession getSqlSession() throws IOException {
if (factory == null) {
//将主配置文件加载到内存
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
SqlSession session = factory.openSession();
return session;
}
}
属性文件jdbc.properties:
jdbc.src=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///exam
jdbc.user=root
jdbc.password=991018
日志文件log4j.properties:
##define an appender named console
log4j.appender.console=org.apache.log4j.ConsoleAppender
#The Target value is System.out or System.err
log4j.appender.console.Target=System.out
#set the layout type of the apperder
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#set the layout format pattern
#log level: fatal error warn info debug trace
log4j.appender.console.layout.ConversionPattern=[%-5p] %m%n
##define a logger
#fatal error warn info debug trace
#log4j.rootLogger=debug,console
log4j.logger.test=trace,console
主配置文件mybatis.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 resource="jdbc.properties"/>
<!-- 为实体类取别名 -->
<typeAliases>
<package name="com.beans"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.src}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/dao/mapper.xml" />
</mappers>
</configuration>
lib文件夹下的jar包有
log4j-1.2.17.jar
lombok-1.16.18.jar
mybatis-3.4.5.jar
mysql-connector-java-5.1.7-bin.jar