因为最近在做的这件事是以结果为导向的,所以用到的很多知识点都是知其然而不知其所以然,只是拿来用,不出错并且达到目的。毕竟真的是没有什么Java基础,所以细节处就不太追究了,打算先把东西做出来,再回头学习。
需要一个数据库的可视化工具,这里推荐 Navicat Premium ,同样需要破解,请自行百度。 然后根据自己的需求创建数据库,创建表。
我这里的需求是去请求一个三方的Open API ,请求拿到的都是封装好的数据,再加上本身数据库相关知识不是很扎实,所以我就先根据实际的业务数据的字段去建表了,通俗的说就是返回的数据有哪些字段,表里就添加哪些字段
数据库的命名规则,大概是小写加下划线吧(我猜的~),反正起啥名都行,主要是密码整对了就行
双击打开连接
新建数据库
新建表
因为都是比较简单的操作就不贴图了,需要注意字段类型和长度,string类型,数据库里对应选一个varchar吧;然后还有一个我遇到的问题 Incorrect column name ,就是字段名里后面可能手误加了个空格导致的,把空格删掉再保存就OK了
MyBatis是个啥呢,准确来说我也不知道是个啥,还是那句话我们是以结果为导向的,这个东西呢 或者说是个框架,是可以帮助我们连接本地数据库,然后插入数据的,下面的操作我们就要用他了。
下面我以本地建的一个简单的表为例,记录一下插入数据库的操作:
在pom.xml文件中加入spring和MyBatis的依赖,pom.xml中已经有一些依赖了,只要把下面这段代码加入dependencies中就可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--mysql驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> 复制代码
添加完之后是下面这样的:
根据我们数据库中的表,创建出对应的实体类
package com.ucarinc.umeng.entity; public class DateCountInfo { private String date; private Integer count; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } } 复制代码
这个在上一篇文章里面我们已经创建过了controller并注入了service,这里我们就对应上面的实体类,创建相应的service,里面方法就根据具体需求来写,无非就是数据库的增删改查的操作
public interface DateCountInfoService { Boolean insertDateCountInfo(@Param("dateCountInfos") List<DateCountInfo> dateCountInfos); List<DateCountInfo> selectDateCountInfo(@Param("date") String date); } 复制代码
@Param这个注解,先这么写吧,后面要用的,或者先不用这个也可,就是起个名字
这里要注意命名,都是根据实体类来的,后面跟上Mapper
@Mapper public interface DateCountInfoMapper { int insertDateCountInfo(@Param("dateCountInfo") List<DateCountInfo> dateCountInfo); List<DateCountInfo> selectDateCountInfo(@Param("date") String date); } 复制代码
ServiceImpl看名字也可以知道就是service类的具体实现,还是需要注意一系列的注解
@Service public class DateCountInfoServeImpl implements DateCountInfoService{ @Autowired DateCountInfoMapper dateCountInfoMapper; @Override public Boolean insertDateCountInfo(List<DateCountInfo> dateCountInfos) { try{ if(dateCountInfoMapper.insertDateCountInfo(dateCountInfos) > 0){ return true; }else{ return false; } }catch (Exception e){ e.printStackTrace(); System.out.println("数据入库异常"); return false; } } @Override public List<DateCountInfo> selectDateCountInfo(String date) { try{ List<DateCountInfo> dateCountInfos = dateCountInfoMapper.selectDateCountInfo(date); if(dateCountInfos.size() > 0){ return dateCountInfos; }else{ return null; } }catch (Exception e){ e.printStackTrace(); System.out.println("数据查找异常"); return null; } } } 复制代码
<?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.dao.DateCountInfoMapper"> <!-- 可根据自己的需求,是否要使用 --> <resultMap type="com.example.dao.entity.DateCountInfo" id="BaseResultMap"> <!-- <id column="id" property="id" jdbcType="VARCHAR"/>--> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="count" property="count" jdbcType="INTEGER"/> <result column="date" property="date" jdbcType="VARCHAR"/> </resultMap> <!-- resultMap都是查询结果使用 --> <!-- 判断日期不用 is 用 = --> <select id="selectDateCountInfo" resultMap="BaseResultMap" parameterType="java.lang.String"> select * from DateCountInfo where date = #{date} </select> <!-- 由外边进来的参数,只能自定义类型 --> <insert id="insertDateCountInfo" parameterType="java.util.List"> insert into DateCountInfo (date, count ,name) values <foreach collection="dateCountInfo" item="event" separator=","> (#{event.date,jdbcType=VARCHAR}, #{event.count,jdbcType=INTEGER}, #{event.name,jdbcType=VARCHAR} ) </foreach> </insert> </mapper> 复制代码
namespace很重要,它是指定这个xml所对应的是哪个dao(mapper)接口
还是使用注解
@SpringBootApplication @ComponentScan({"com.*"}) @MapperScan({"com.example.dao"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } 复制代码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/my_test_sql_db?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=round&nullCatalogMeansCurrent=true&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=root mybatis.type-aliases-package=com.example.entity mybatis.mapperLocations=classpath:mapper/*.xml logging.level.root=info logging.level.com.example.*=debug 复制代码
controller中添加相关的测试代码,还是注入上面写好的service,然后路径,参数,直接调用service中的方法
数据库有时候会有点儿“卡”,可以刷新一下或者关闭再重新打开就会看到更新
最后再记录一下,自己犯的一个小错误,给数据库加主键或者是联合主键,因为测试了很多次插入数据库,所以重复数据很多,想到要去重,就想到了添加主键和联合主键。千万注意清空表中已有数据再去设置,否则表中已有重复数据,主键是设置不成功的~