Sqring boot + Mavn + mybatis + sqlite(XML配置的方式)
網上看了很多Sqring boot + Mavn + mybatis + sqlite的配置,發現了很多坑,尤其是涉及到有增刪改查的問題時候,這裏整理了一下,希望對大家有幫助,這裏用的是Spring boot 2.2.1 release,Intellij Idea的mavn工程,有問題也可以提出,我會補充。
一、 pom.xml配置
<properties>
<java.version>1.8</java.version>
<mybatis.spring.boot.version>2.1.1</mybatis.spring.boot.version>
<sqlite.jdbc.version>3.27.2.1</sqlite.jdbc.version>
</properties>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>${sqlite.jdbc.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
properties裏面是java sdk的版本,mybatis的版本和sqlite的版本
dependency是相關添加的依賴
二、 application.properties的配置
yml和這個兩個格式不一樣,要注意
server.port=8090
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.datasource.username=
spring.datasource.password=
spring.datasource.url=jdbc:sqlite:data.db
# Mybatis配置
mybatis.mapper-locations= classpath:mybatis/mapper/*.xml
mybatis.config-location= classpath:mybatis/mybatis-config.xml
mybatis.typeAliasesPackage= com.taiyuan.railway.entity
# sql打印
logging.level.com.taiyuan.railway.mapper= debug
-
spring.datasource.url=jdbc:sqlite:data.db這句是把數據庫放到了項目根目錄下,上圖可看到.
**注意:**resources目錄下千萬不要方,放了會導致增刪改操作成功了,但是數據庫沒有看到變動
-
mybatis-config.xml是mybatis的全局配置文件
-
mybatis.mapper-locations= classpath:mybatis/mapper/*.xml指明瞭要配置的SQL映射文件的目錄如上圖所示。
-
mybatis.typeAliasesPackage= com.xx.xx.entity爲實體所在的包路徑(具體根據自己創建的項目包路徑填寫)
三、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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${datasource.driver}}" />
<property name="url" value="${datasource.url}"/>
<property name="username" value="${datasource.username}" />
<property name="password" value="${datasource.password}" />
</dataSource>
</environment>
</environments>
</configuration>
**注意:**datasource.driver等屬性與第二步中的application.properties中sql的配置屬性對應的
四、正式開始創建sqlite、 entity、mapper、service、controller
1、Sqlite創建
自己創建一個sqlite數據庫(新鍵文本文檔,將後綴名改爲db即可,我這裏創建的爲data.db)
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS "user";
CREATE TABLE "user" (
"user_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"user_name" varchar(15) NOT NULL,
"password" varchar(30) NOT NULL,
"age" int(2) DEFAULT NULL
);
-- ----------------------------
-- Auto increment value for user
-- ----------------------------
UPDATE "sqlite_sequence" SET seq = 14 WHERE name = 'user';
PRAGMA foreign_keys = true;
2、entity
在自己工程包路徑下的entity創建一個User實體:
package com.taiyuan.railway.entity;
public class User {
private Integer userId;
private String userName;
private String password;
private Integer age;
public User() {
}
public User(Integer userId, String userName, String password, Integer age) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.age = age;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3、UserMapper
UserMapper的接口定義
package com.taiyuan.railway.mapper;
import com.taiyuan.railway.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Component
public interface UserMapper {
/**
* 查詢所有
*/
List<User> getAllUsers();
/**
* 根據主鍵查詢
*/
User getUserById(@Param("id") Integer id);
/**
* 添加
*/
int addUser(User user);
/**
* 刪除
*/
int deleteUser(@Param("id") Integer id);
/**
* 修改
*/
int updateUser(User user);
}
注意:
@Mapper表示此接口會進行Mapper映射
@Component表示框架可以註冊的組件
UserMapper的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.taiyuan.railway.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="com.taiyuan.railway.entity.User" >
<id column="user_id" property="userId" jdbcType="INTEGER" />
<result column="user_name" property="userName" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
</resultMap>
<!-- 查詢所有 -->
<select id="getAllUsers" resultMap="BaseResultMap" >
select * from user
</select>
<!-- 根據主鍵查詢 -->
<select id="getUserById" parameterType="java.lang.Integer" resultMap="BaseResultMap" >
select * from user where user_id = #{id}
</select>
<!-- 添加 -->
<insert id="addUser" parameterType="com.taiyuan.railway.entity.User" >
insert into user values(#{userId},#{userName},#{password},#{age})
</insert>
<!-- 刪除 -->
<delete id="deleteUser" parameterType="java.lang.Integer" >
delete from user where user_id = #{id}
</delete>
<!-- 修改 -->
<update id="updateUser" parameterType="com.taiyuan.railway.entity.User" >
update user set user_name=#{userName},password=#{password},age=#{age} where user_id = #{userId}
</update>
</mapper>
注意:
- namespace中的包路徑要與具體映射的接口對應
- resultMap 中type屬性要對應具體的entity,其下的子節點是entity屬性的描述
- select insert delete update中的id要與映射的接口函數名對應
4、service
package com.taiyuan.railway.service;
import com.taiyuan.railway.entity.User;
import com.taiyuan.railway.mapper.UserMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.PushbackReader;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers(){
return userMapper.getAllUsers();
}
public User getUserById(@Param("id") Integer id){
return userMapper.getUserById(id);
}
// @Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = {RuntimeException.class,Exception.class})
public int addUser(User user) throws Exception
{
return userMapper.addUser(user);
}
public int deleteUser(@Param("id") Integer id)
{
return userMapper.deleteUser(id);
}
public int updateUser(User user)
{
return userMapper.updateUser(user);
}
}
注意:
@Transactional爲要進行事務的函數標註(這點在這個demo中沒有仔細研究,增刪改,不加這個標註也能成功)框架事務默認是關閉的,要在程序入口開啓@EnableTransactionManagement
我這代碼示例如下:
package com.taiyuan.railway;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableTransactionManagement
public class RailwayApplication {
public static void main(String[] args) {
SpringApplication.run(RailwayApplication.class, args);
}
}
5、controller
package com.taiyuan.railway.controller;
import com.taiyuan.railway.entity.User;
import com.taiyuan.railway.service.UserService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("User")
@Api(tags = "SqlLiteMybatisTest")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getAllUsers")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/getUser/{id}")
public User getUserById(Integer id) {
return userService.getUserById(id);
}
/**
*
* 請使用接口測試工具進行測試
*/
@PostMapping("/addUser")
@ResponseStatus(HttpStatus.CREATED)
public Boolean addUser(@RequestBody User user) {
int temp = 0;
try{
temp = userService.addUser(user);
}catch (Exception e)
{
e.printStackTrace();
}
return temp > 0;
}
@DeleteMapping("/deleteUser")
public String deleteUser(@RequestParam Integer id){
int i = userService.deleteUser(id);
if (i>0){
return "刪除成功";
}else {
return "刪除失敗";
}
}
@PutMapping("/updateUser")
public String updateUser(){
User user = userService.getUserById(1);
user.setUserName("zxp");
user.setPassword("999");
user.setAge(24);
int i = userService.updateUser(user);
if (i>0){
return "修改成功";
}else {
return "修改失敗";
}
}
}
select和增加的log結果
2019-11-25 16:49:23.796 INFO 8036 --- [nio-8090-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting...
2019-11-25 16:49:23.797 INFO 8036 --- [nio-8090-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
2019-11-25 16:49:23.797 DEBUG 8036 --- [nio-8090-exec-1] c.t.r.mapper.UserMapper.getAllUsers : ==> Preparing: select * from user
2019-11-25 16:49:23.797 DEBUG 8036 --- [nio-8090-exec-1] c.t.r.mapper.UserMapper.getAllUsers : ==> Parameters:
2019-11-25 16:49:23.798 DEBUG 8036 --- [nio-8090-exec-1] c.t.r.mapper.UserMapper.getAllUsers : <== Total: 6
2019-11-25 18:03:33.114 DEBUG 8036 --- [nio-8090-exec-1] c.t.railway.mapper.UserMapper.addUser : ==> Preparing: insert into user values(?,?,?,?)
2019-11-25 18:03:33.115 DEBUG 8036 --- [nio-8090-exec-1] c.t.railway.mapper.UserMapper.addUser : ==> Parameters: 41(Integer), string(String), string(String), 0(Integer)
2019-11-25 18:03:33.115 DEBUG 8036 --- [nio-8090-exec-1] c.t.railway.mapper.UserMapper.addUser : <== Updates: 1