Sqring boot + Mavn + mybatis + sqlite(XML配置的方式)

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

在這裏插入圖片描述

  1. spring.datasource.url=jdbc:sqlite:data.db這句是把數據庫放到了項目根目錄下,上圖可看到.

    **注意:**resources目錄下千萬不要方,放了會導致增刪改操作成功了,但是數據庫沒有看到變動

  2. mybatis-config.xml是mybatis的全局配置文件

  3. mybatis.mapper-locations= classpath:mybatis/mapper/*.xml指明瞭要配置的SQL映射文件的目錄如上圖所示。

  4. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章