SpringBoot中利用MyBatis進行資料操作
阿新 • • 發佈:2018-12-11
本例所用環境:
- SpringBoot
- MySQL
- MyBatis
- jdk1.8
- Maven
首先我們先建立一個SpringBoot 專案。
資料庫連線配置
##資料庫連線配置(部署到哪臺,對應的ip需修改) spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis?connectTimeout=1000&useSSL=false&useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver=com.mysql.jdbc.Driver
資料庫中的資料
環境配好之後,下面分別介紹一下通過註解或者通過xml對映的形式這兩種方法來使用MyBatis。
通過xml對映的形式
測試Bean
package com.example.demo.model; public class User { private int id; private String name; private String sex; private int age; public User() { } public User(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public User(int id, String name, String sex, int age) { this.id = id; this.name = name; this.sex = sex; this.age = 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
XML形式的具體操作將mapper定義為介面,只定義方法。具體的實現在同名的xml檔案中。
package com.example.demo.mapper; import com.example.demo.model.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @Mapper public interface UserMapper { User getByName(@Param("name") String name); boolean insert(User user); boolean update(@Param("name") String name, @Param("sex") String sex, @Param("age") int age); void delete(@Param("name") String name); }
<?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.example.demo.mapper.UserMapper">
<select id="getByName" resultType="com.example.demo.model.User" parameterType="java.lang.String">
SELECT * FROM tb_user WHERE name = #{name}
</select>
<insert id="insert" parameterType="com.example.demo.model.User" useGeneratedKeys="true">
INSERT INTO tb_user(name, sex, age) VALUES(#{name}, #{sex}, #{age})
</insert>
<update id="update" parameterType="com.example.demo.model.User">
UPDATE tb_user SET sex=#{sex}, age=#{age} WHERE name=#{name}
</update>
<delete id="delete" parameterType="java.lang.String">
DELETE FROM tb_user WHERE name = #{name}
</delete>
</mapper>
兩個檔案通過mapper.xml檔案中的 namespace 形成對映。
一般情況下,我們用到的資原始檔(各種xml,properites,xsd檔案等)都放在src/main/resources下面(springboot回到對應的位置載入檔案),利用maven打包時,maven能把這些資原始檔打包到相應的jar或者war裡。但是,有的時候我們習慣把它和Mapper.java放一起,都在src/main/java下面,這樣利用maven打包時,就需要修改pom.xml檔案,來把mapper.xml檔案一起打包進jar或者war裡了,否則,這些檔案不會被打包的。(maven認為src/main/java只是java的原始碼路徑)。
所以說,如果要將mapper.java和mapper.xml檔案放在同一個位置,就需要在pom檔案中指定xml檔案的載入位置。
<build>
<resources>
<!-- maven專案中src原始碼下的xml等資原始檔編譯進classes資料夾,
注意:如果沒有這個,它會自動搜尋resources下是否有mapper.xml檔案,
如果沒有就會報org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): ... -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<!--將resources目錄下的配置檔案編譯進classes檔案 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
如果mapper.java和mapper.xml檔案是分開放置的,則不需要以上配置。
Service服務
package com.example.demo.service;
import com.example.demo.model.User;
public interface UserService {
User getUserByName(String name);
boolean addUser(User user);
boolean updateUser(String name, String sex, int age);
void deleteUser(String name);
}
Service服務的實現類
package com.example.demo.service.impl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
public User getUserByName(String name) {
User user = userMapper.getByName(name);
if (null != user){
return user;
}
return null;
}
@Override
public boolean addUser(User user) {
return userMapper.insert(user);
}
@Override
public boolean updateUser(String name, String sex, int age) {
return userMapper.update(name, sex, age);
}
@Override
public void deleteUser(String name) {
userMapper.delete(name);
}
}
測試介面
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index(){
User user = userService.getUserByName("gyl");
return user.getName()+"--"+user.getSex()+"--"+user.getAge();
}
}
如果一切順利,即將輸入localhost:8080/index 你將看到如下內容
通過註解的方式
package com.example.demo.mapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;
@Mapper
public interface UserMapper {
@Select("select * from TB_USER where NAME = #{name}")
User getByName(@Param("name") String name);
@Insert("insert into TB_USER(NAME, SEX, AGE) values(#{name}, #{sex}, #{age})")
boolean insert(User user);
@Update("update TB_USER set SEX=#{sex}, AGE=#{age} where NAME=#{name}")
boolean update(@Param("name") String name, @Param("sex") String sex, @Param("age") int age);
@Delete("delete from TB_USER where NAME = #{name}")
void delete(@Param("name") String name);
}
如果一切順利,即將輸入localhost:8080/index 你將看到如下內容