最近学习Spring Boot,刚好复习下Mybatis,因为现在用的是Hibernate,Mybatis已经有两年没用过了。
首先我用的数据库是Oracle.
1、New Project
2、创建完成后的目录结构如下:(如果有的同学的数据库使用的是mysql的话,可以勾选上面的mysql,Spring Boot会自动添加我们spring和mysql的依赖,当时我们自己手动添加也可以。)
3、打开我们的pom.xml文件,添加我们所用的依赖jar包
我们此项目只需要添加两个依赖jar包
一个是Oracle驱动包(此处的Oracle驱动包是我本地的jar包,因为Oracle授权问题,mavem不提供oracleq驱动包了)
一个是C3P0连接池jar包
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
4、数据库DDL语句:
CREATE TABLE STUDENT
(
SID NUMBER(10) NOT NULL PRIMARY KEY,
SNAME VARCHAR2(255 CHAR),
SEX VARCHAR2(255 CHAR)
)
create sequence STUDENT_SEQUENCE
minvalue 1
maxvalue 999999999999999999999999999
start with 21
increment by 1
cache 20;
一个是创建student表语句,一个是为该表创建一个序列语句,序列为了让表的自增主键使用。如果使用的是mysql数据库的话,可以设置主键自增,则不需要创建序列。
5、在application.properties中配置我们的项目信息
jdbc.driver = oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.username = mw_app
jdbc.password = app
server.port = 8083
server.servlet.context-path=/spring-mybatis
6、在resource目录下创建我们的mybatis配置文件,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>
<settings>
<!-- 是否允许主键生成策略 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 是否使用驼峰转换 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- 是否允许使用列标签替换列名 -->
<setting name="useColumnLabel" value="true" />
</settings>
</configuration>
7、创建我们的spring配置文件,applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- spring扫描注解的包路径 -->
<context:component-scan base-package="com.spring.springmybatis" />
<!-- spring加载properties文件的路径 -->
<context:property-placeholder location="classpath:config/application.properties"/>
<!-- C3P0连接池配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="true" />
<property name="acquireRetryAttempts" value="3" />
<property name="initialPoolSize" value="10" />
<property name="checkoutTimeout" value="2000" />
<property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
</bean>
<!-- sessionFactory配置 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载数据源Bean -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的配置文件的路径 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- mapper文件所在的路径 -->
<property name="mapperLocations" value="classpath:mapper/mapper-*.xml" />
<!-- mybatis使用使用类别名的类所在的包路径 -->
<property name="typeAliasesPackage" value="com.spring.springmybatis.entity" />
</bean>
<!-- 配置Spring扫描mybatis的信息 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sessionFactory" />
<!-- 需要扫描的Dao包路径 -->
<property name="basePackage" value="com.spring.springmybatis.dao" />
</bean>
</beans>
项目的配置文件我们已经配置的差不多了,对配置不明白的同学可以查看mybatis的中文官方网站 http://www.mybatis.org/mybatis-3/zh/index.html 或者在下面留言。
下面我们开始编码阶段:
8、根据数据库表名创建我们的实体类Student.java,代码如下:
package com.spring.springmybatis.entity;
public class Student {
private Integer sid;
private String sname;
private String sex;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
}
public Student(String sname, String sex) {
this.sname = sname;
this.sex = sex;
}
}
9、我们创建我们的Dao接口,并创建增删改查方法;代码如下:
package com.spring.springmybatis.dao;
import com.spring.springmybatis.entity.Student;
import java.util.List;
public interface StudentDao {
/**
* 根据ID查询学生信息
* @param id
* @return Student对象
*/
public Student queryStudent(int id);
/**
* 查询学生列表
* @return
*/
public List<Student> queryStudentList();
/**
* 新增学生信息
* @param student
* @return
*/
public int addStudent(Student student);
/**
* 修改学生信息
* @param student
* @return
*/
public int modifyStudent(Student student);
/**
* 根据ID删除学生信息
* @param id
* @return
*/
public int deleteStudent(int id);
}
10、因为spring会为mybatis声明的dao接口生成的实现类,所以我们不需要手动为我们定义的Dao接口编写实现类,我们只需要编写对应的mapper配置文件,我们创建的mapper配置文件如下(这里的路径需要和spring配置文件中mapperLocation指定的路径一致):
mapper-student.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="com.spring.springmybatis.dao.StudentDao">
<select id="queryStudent" resultType="Student" >
SELECT SID,SNAME,SEX,GID
FROM STUDENT
WHERE SID = #{id}
</select>
<select id="queryStudentList" resultType="Student">
SELECT *
FROM STUDENT
</select>
<insert id="addStudent" parameterType="com.spring.springmybatis.entity.Student">
<selectKey keyProperty="sid" resultType="int" order="BEFORE">
select STUDENT_SEQUENCE.NEXTVAL
FROM DUAL
</selectKey>
INSERT INTO STUDENT (sid,sname,sex)
values (#{sid},#{sname},#{sex})
</insert>
<update id="modifyStudent" parameterType="Student" >
UPDATE STUDENT
<set>
<if test="sname != null">sname = #{sname}</if>
<if test="sex != null">sname = #{sex}</if>
</set>
WHERE SID = #{sid}
</update>
<delete id="deleteStudent" parameterType="int">
DELETE FROM STUDENT
WHERE SID = #{sid}
</delete>
</mapper>
11、此时我们的Dao层已经编写完成了,为了和真实项目保持一直,我们这里编写一下service层的代码,让service层调用我们的dao层接口去操作数据库,StudentService.java代码如下:
package com.spring.springmybatis.service;
import com.spring.springmybatis.entity.Student;
import java.util.List;
public interface StudentService {
/**
* 根据ID查询学生信息
* @param id
* @return Student对象
*/
public Student queryStudent(int id);
/**
* 查询学生列表
* @return
*/
public List<Student> queryStudentList();
/**
* 新增学生信息
* @param student
* @return
*/
public int addStudent(Student student);
/**
* 修改学生信息
* @param student
* @return
*/
public int modifyStudent(Student student);
/**
* 根据ID删除学生信息
* @param id
* @return
*/
public int deleteStudent(int id);
}
其实现类StudentServiceImpl.java代码如下:
package com.spring.springmybatis.service.impl;
import com.spring.springmybatis.dao.StudentDao;
import com.spring.springmybatis.entity.Student;
import com.spring.springmybatis.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public Student queryStudent(int id) {
System.out.println("执行查询学生信息方法");
return studentDao.queryStudent(id);
}
@Override
public List<Student> queryStudentList() {
System.out.println("执行查询学生列表信息的方法");
return studentDao.queryStudentList();
}
@Override
public int addStudent(Student student) {
System.out.println("执行新增学生信息的方法");
return studentDao.addStudent(student);
}
@Override
public int modifyStudent(Student student) {
System.out.println("执行修改学生信息的方法");
return studentDao.modifyStudent(student);
}
@Override
public int deleteStudent(int id) {
System.out.println("执行删除学生信息的方法");
return studentDao.deleteStudent(id);
}
}
12、下面我们为service层代码创建Junit测试方法,我们的Junit测试类代码如下:
package com.spring.springmybatis.service;
import com.spring.springmybatis.entity.Student;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml"})
public class StudentServiceTest {
@Autowired
private StudentService studentService;
@Test
@Ignore
public void addStudent() {
Student student = new Student("小红","女");
assertEquals(1,studentService.addStudent(student));
}
@Test
@Ignore
public void queryStudent() {
Student student = studentService.queryStudent(1);
System.out.println(student.getSname());
}
@Test
public void queryStudentList() {
List<Student> studentList = studentService.queryStudentList();
studentList.forEach(e -> System.out.println(e.getSname()));
}
@Test
@Ignore
public void modifyStudent() {
Student student = new Student();
student.setSname("眉庄");
student.setSid(1);
assertEquals(1,studentService.modifyStudent(student));
}
@Test
@Ignore
public void deleteStudent() {
assertEquals(1,studentService.deleteStudent(1));
}
}
我们可以把@Ignore注解去掉,挨个进行测试
13、因为我们是Web项目,所以我把对应的Controller代码也加上了,StudentController.java代码如下:
package com.spring.springmybatis.controller;
import com.spring.springmybatis.entity.Student;
import com.spring.springmybatis.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("/queryStudent")
public Student queryStudent(int id) {
return studentService.queryStudent(id);
}
@RequestMapping("/queryStudentList")
public List<Student> queryStudentList() {
return studentService.queryStudentList();
}
@RequestMapping("/addStudent")
public int addStudent(Student student) {
return studentService.addStudent(student);
}
@RequestMapping("/modifyStudent")
public int modifyStudent(Student student) {
return studentService.modifyStudent(student);
}
@RequestMapping("/deleteStudent")
public int deleteStudent(int id) {
return studentService.deleteStudent(id);
}
}
14、我们Spring Boot启动文件代码如下:
package com.spring.springmybatis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportResource;
import java.util.Arrays;
@ImportResource(value = {"classpath:applicationContext.xml"})
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringMybatisApplication.class, args);
}
}
15、我们通过执行Main方法启动我们的项目,在浏览器输入地址进行访问,可以看到正常返回数据
因为Spring Boot是刚接触的,听说可以不用配置创建项目,很多地方都不知道怎么用,所以可能用到的技术比较老,后面接触多了再重新写一遍少用配置的吧!
我把做完的项目结构发一下: