spring boot(二):Mybatis操作数据库

(1)mysql数据表准备

首先,准备一张news的表,表的结构为:


image

数据中的表的内容为:


image

2.相关配置

2.1配置pom文件

由于在spring boot 中整合mybatis,需要修改pom.xml(maven 项目),添加mybatis 跟mysql 的设置:

在vscode 中,选择pom.xml 文件,右键选择Edit starters

image

输入同时勾选mysql、mybatis选项,如图:


image

更新后,pom.xml 中多了这两项的依赖选项:

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.0.1</version>
      <scope>compile</scope>
    </dependency>

2.2配置 application.properties选项

在application.properties配置文件中填写数据库账号,密码,连接字符串等配置:

#application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/zlfj?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=${你的数据库密码}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2.3 创建entity类

项目文件目录为图所示:


image

创建newsentity类,用来java文件与sql 表的映射;

//NewsEntity.java
public class NewsEntity implements Serializable{
    private static final long serialVersionUID = 1L;

    private Long id;
    
    private String title;
    
    private String content;
    
    private Date gmttime;
    /*
    **省略getset 方法,记得写
    */
}

2.4创建Dao层定义具体数据操作

(1)利用注解的方式

在dao层中定义了NewsDao.java 然后将注解写在方法中来实现数据库操作:

@Mapper
public interface NewsDao{

    /**
    * 查询单个
    * @return
    */
    @Select("SELECT * from news WHERE id=#{id}")
    NewsEntity queryObject(@Param("id") Long id);
}

如果是传入的是entity 类,则需要对查询结果进行注解映射:

 /**
    * 保存
    * @return
    */
    @Results(
        {
        @Result(property = "id", column = "id", id = true), 
        @Result(property = "title", column = "title"),
        @Result(property = "content", column = "content"), 
        @Result(property = "gmttime", column = "gmtTime") 
        }
        )
    @Insert("insert into news (title,content,gmtTime) values(#{title},#{content},#{gmttime})")
    void save(NewsEntity news);
    
    
    /**
    * 修改
    * @return
    */
    @Results(
        {
        @Result(property = "id", column = "id", id = true), 
        @Result(property = "title", column = "title"),
        @Result(property = "content", column = "content"), 
        @Result(property = "gmttime", column = "gmtTime") 
        }
        )
    @Update("update news set `title`=#{title},`content`=#{content},`gmtTime`=#{gmttime} where id=#{id}")
    void update(NewsEntity news);

(2)利用xml的方式

首先定义dao层的各个操作,同时将dao添加mapper注解:

package com.zhb.nongboot.dao;


import java.util.List;
import java.util.Map;

import com.zhb.nongboot.entity.NewsEntity;

import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface NewsDao{
    

     /**
    * 查询
    * @return
    */
    NewsEntity queryObject(Long id);

    /**
    * 查询列表
    * @return
    */
    List<NewsEntity> queryList(Map<String, Object> map);

    /**
    * 查询总数
    * @return
    */
    int queryTotal(Map<String, Object> map);

    /**
    * 保存
    * @return
    */
    void save(NewsEntity news);

    /**
    * 修改
    * @return
    */
    void update(NewsEntity news);

    /**
    * 删除
    * @return
    */
    void delete(Long id);  
}

在NewsDao.java 的同级目录下,新增NewsDao.xml文件,定义其数据库具体sql操作:

<?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.zhb.nongboot.dao.NewsDao">

    <resultMap id="newsMap" type="com.zhb.nongboot.entity.NewsEntity">
        <result property="id" column="id"/>
        <result property="title" column="title"/>
        <result property="content" column="content"/>
        <result property="gmttime" column="gmtTime"/>
    </resultMap>
    <select id="queryObject" resultType="com.zhb.nongboot.entity.NewsEntity">
        select * from news where id = #{value}
    </select>

    <select id="queryList" resultType="com.zhb.nongboot.entity.NewsEntity">
        select * from news where 1=1

        <choose>
            <when test="sidx != null and sidx.trim() != ''">
                order by ${sidx} ${order}
            </when>
            <otherwise>
                order by id desc
            </otherwise>
        </choose>
        <if test="offset != null and limit != null">
            limit #{offset}, #{limit}
        </if>
    </select>

    <select id="queryTotal" resultType="int">
        select count(*) from news where 1=1

    </select>

    <insert id="save" parameterType="com.zhb.nongboot.entity.NewsEntity" useGeneratedKeys="true" keyProperty="id">
        insert into news
        (
        `title`,
        `content`,
        `gmtTime`
        )
        values
        (
        #{title},
        #{content},
        #{gmttime}
        )
    </insert>

    <update id="update" parameterType="com.zhb.nongboot.entity.NewsEntity">
        update news
        <set>
            <if test="title != null">`title` = #{title},</if>
            <if test="content != null">`content` = #{content},</if>
            <if test="gmttime != null">`gmtTime` = #{gmttime}</if>
        </set>
        where id = #{id}
    </update>

    <delete id="delete">
        delete from news where id = #{value}
    </delete>

    <delete id="deleteBatch">
        delete from news where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

</mapper>

2.5定义service层接口方法与实现(具体业务层逻辑)

这里我们对news 这个表进行增删改操作,所以定义其接口:

NewsService.java
import java.util.List;
import java.util.Map;

import com.zhb.nongboot.entity.NewsEntity;

import org.springframework.stereotype.Service;


public interface NewsService{
    

     /**
    * 查询
    * @return
    */
    NewsEntity queryObject(Long id);

    /**
    * 查询列表
    * @return
    */
    List<NewsEntity> queryList(Map<String, Object> map);

    /**
    * 查询总数
    * @return
    */
    int queryTotal(Map<String, Object> map);

    /**
    * 保存
    * @return
    */
    void save(NewsEntity news);

    /**
    * 修改
    * @return
    */
    void update(NewsEntity news);

    /**
    * 删除
    * @return
    */
    void delete(Long id);

   
}

service 的具体实现:

//NewsServiceImpl.java

package com.zhb.nongboot.service.impl;

import java.util.List;
import java.util.Map;

import com.zhb.nongboot.dao.NewsDao;
import com.zhb.nongboot.entity.NewsEntity;
import com.zhb.nongboot.service.NewsService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class NewsServiceImpl implements NewsService{

    @Autowired
    private NewsDao newsDao;

        
    @Override
    public NewsEntity queryObject(Long id){
            NewsEntity entity = newsDao.queryObject(id);

                                                    
        return entity;
    }
    
    @Override
    public List<NewsEntity> queryList(Map<String, Object> map){
        List<NewsEntity> list = newsDao.queryList(map);
        return list;
    }
        

    
    
    @Override
    public int queryTotal(Map<String, Object> map){
        return newsDao.queryTotal(map);
    }
    
    @Override
    public void save(NewsEntity news){
        newsDao.save(news);
    }
    
    @Override
    public void update(NewsEntity news){
        newsDao.update(news);
    }
    
    @Override
    public void delete(Long id){
        newsDao.delete(id);
    }
    
}

注意:因为在这里我们定义了一个service,在spring 中,这个NewsService要注册到spring,交由spring统一管理其容器(IOC控制反转)

所以在public class NewsServiceImpl implements NewsService定义中,记得加上@Service 注解

@Service
public class NewsServiceImpl implements NewsService{

不然spring会报错无法找到其服务.

2.6controller层:注册路由与接收参数

在这里我们简单测试一下查询方法跟保存方法是否正常:

import java.util.Date;
import java.util.HashMap;

import com.zhb.nongboot.entity.NewsEntity;
import com.zhb.nongboot.service.NewsService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("news")
public class NewsController {

    @Autowired
    private NewsService newsService;
    
    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public NewsEntity info(@PathVariable("id") Long id){
        NewsEntity news = newsService.queryObject(id);
       return news;
    }

    @RequestMapping("save/{name}")
    public HashMap<String,String> save(@PathVariable("name") String name){
        NewsEntity news = new NewsEntity();
        news.setTitle(name);
        news.setContent("新增通知成功");
        news.setGmttime(new Date());
        newsService.save(news);
        return (HashMap<String, String>) new HashMap<>().put("message", "ok");
    }
    

当访问/news/info/2的时候,返回的是id为2的news表的行记录.

当访问/news/save/titlename的时候,新增一条title 为titlename的记录.

测试:

查询单行记录:


image

保存


image

image

测试成功;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容