更新:
Mybatis允许增删改查直接定义以下类型的返回值:Integer、Long、Boolean、void。(这些类型的包装类或基本类型都可以)
比如:用boolean,如果影响行数超过0行以上,就可以返回true;0行就返回false。
只要在接口返回方法上定义就行,无需在sql映射文件中写返回值类型,而且也写不了。
在springboot中实现,先介绍一下实现该项目的需要的几个文件:
1、Java文件夹:
bean层:entity包下的 Student.java 文件(存放具体的java对象,用来映射数据库的字段的,是简单的pojo)
service层:service包下的 StudentService.java 接口文件(业务逻辑接口,写业务逻辑用的)
service.imp包下的 StudentServiceImpl.java 接口实现类文件(实现业务接口,一般事务控制写在这里)
dao层:dao包下的 StudentDao.java 接口文件(数据访问层接口,与数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,也有人称数据持久层)
controller层:controller包下的 StudentController.java 文件(控制层,也叫web控制器,springmvc在这里发挥作用)
2、resources文件夹:
dao层:mapper包下的 StudentMapper.xml 文件(存放每个dao中方法对应的sql,在这个文件中配置,不需要写daoImpl文件)
3、注意:此处不标注spring、springmvc等配置文件了,一般网上搜会都有的。新手小白使用springboot,不需要对框架细则有过多关注。
各个文件的代码:
至于文件目录怎么安排,有需要的可以参考package路径
(1) Student.java
package com.entity;
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(2)StudentService.java
package com.service;
//会用到Student对象,所以需要导入相应import
import com.entity.Student;
public interface StudentService {
/**
*插入学生信息
* @param student
* @return
*/
int insertStu(Student student);
void deleteStu(int id);
void updateStu(Student student);
Student selectStu(int id);
int selectNum(int age);
}
至于方法上的注释信息,最好养成习惯,对自己写的代码负责。
(3)StudentServiceImpl.java
package com.service.impl;
import com.dao.StudentDao;
import com.entity.Student;
import com.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//这个注释一定要加上,不然在Controller层中对私有变量studentService的@Autowired注释会报错
@Service("StudentService")
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
public int insertStu(Student student){
return studentDao.insertInfo(student);
}
@Override
public Student selectStu(int id) {
return studentDao.selectInfo(id);
}
public void deleteStu(int id){
studentDao.deleteInfo(id);
}
public void updateStu(Student student){
studentDao.updateInfo(student);
}
@Override
public int selectNum(int age) {
return studentDao.selectInfoTest(age);
}
}
(4)StudentDao.java
package com.dao;
import com.entity.Student;
import org.apache.ibatis.annotations.Param;
public interface StudentDao {
/**
*插入学生信息
* @param
* @return int
*/
int insertInfo(@Param("student") Student student);
/**
* 根据学生id删除信息
* @param id
* @return
*/
int deleteInfo(int id);
/**
* 更新学生信息
* @param student
* @return
*/
// Student对象是要输入三个参数值的,所以添加上@Param来进行绑定
int updateInfo(@Param("student") Student student);
/**
* 根据学生id查询学生信息
* @param id
* @return
*/
Student selectInfo (int id);
int selectInfoTest(int age);
}
@Param用来绑定参数,如果传入的参数值多于1个,需要添加上这个注解。
StudentDao.java 文件中定义的各种方法,必需和StudentMapper.xml文件中各种sql语句中的id对应 。
(5)StudentController.java
package com.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.entity.Student;
import com.service.StudentService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("getInfo")
@ResponseBody
public int getInfo(Student student){
return studentService.insertStu(student);
}
@RequestMapping("findInfo")
@ResponseBody
public Student findInfo(int id){
return studentService.selectStu(id);
}
@RequestMapping("deleteInfo")
public void deleteInfo(int id){
studentService.deleteStu(id);
}
@RequestMapping("updateInfo")
public void updateInfo(Student Student){
studentService.updateStu(Student);
}
@RequestMapping("test")
@ResponseBody
public int selectNum(int age){
return studentService.selectNum(age);
}
}
@RequestMapping(“url”)是用来写请求路径的
@ResponseBody 则是用来将Controller中方法返回的对象,通过适当的HttpMessageConverter转换为指定格式的数据,如:json、xml等,然后通过Response响应给客户端的。
(6)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="com.dao.StudentDao">
<resultMap id="ResultMap" type="com.entity.Student">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="age" jdbcType="INTEGER" property="age"/>
</resultMap>
<insert id="insertInfo" >
INSERT INTO test_student (id,name,age) VALUES (#{student.id},#{student.name},#{student.age})
</insert>
<delete id="deleteInfo">
DELETE FROM test_student WHERE id=#{id}
</delete>
<update id="updateInfo">
UPDATE test_student SET name=#{student.name},age=#{student.age} WHERE id=#{student.id}
</update>
<select id="selectInfo" resultMap="ResultMap">
SELECT * FROM test_student WHERE id=#{id}
</select>
<select id="selectInfoTest" resultType="INTEGER">
SELECT count(*) FROM test_student WHERE age=#{age}
</select>
</mapper>
resultMap是返回集,当返回参数是一个以上的时候,则需要加上返回集合;反之,仅对单个返回变量的类型控制由resultType设置就可以了。
在StudentDao.java 中添加@Param注解的,在StudentMapper.xml 文件中设置参数名的时候,需要添加 student. 前缀来具体的标识到是Student对象中的哪个参数值。
(7)数据库的创建信息
CREATE TABLE `test_student` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`age` int(25) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
测试各个方法效果
(1)插入信息
(2)删除信息
(3)修改信息
(4)根据id查询信息
(5)根据age查询影响的行数