毕设-使用持久层框架Mybatis

来源:互联网 发布:java 启动事务 编辑:程序博客网 时间:2024/05/17 07:17

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis配置

pom.xml添加依赖

 <!-- 配置持久层框架 -->     <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version>     </dependency>     <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency>


application.properties添加

#Mybatismybatis.mapper-locations=classpath:mybatis/mapper/*.xmlmybatis.type-aliases-package=com.yongqi.model#打印Mybatis语句logging.level.org.springframework=WARNlogging.level.com.damionew.website.dao=DEBUG#log存放地址#logging.file=D:\websitelog
根据mybatis.mapper-locations,在resources下新建mybatis文件夹,在其中存放mapper.xml文件

为了测试,先尝试添加一条记录

之前在数据库中新建了一个表,建表SQL

Create TableCREATE TABLE `family` (  `familyaccount` varchar(50) NOT NULL COMMENT '家庭账号',  `familypassword` varchar(50) DEFAULT NULL COMMENT '家庭密码',  `familyname` varchar(50) DEFAULT NULL COMMENT '家庭名称',  `states` varchar(10) DEFAULT NULL COMMENT '状态',  `created_time` varchar(50) DEFAULT NULL COMMENT '创建时间',  PRIMARY KEY (`familyaccount`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
实现添加一条记录到family,先创建一个Family.class的实体类(业务的基础,数据传递的载体)

/** * @Author yinyunqi * @date 2017年12月22日 * @Content Family实体类 */package com.yongqi.model;public class Family {    String familyaccount;    String familypassword;    String familyname;    String states;    String created_time;    public String getFamilyaccount() {        return familyaccount;    }    public void setFamilyaccount(String familyaccount) {        this.familyaccount = familyaccount;    }    public String getFamilypassword() {        return familypassword;    }    public void setFamilypassword(String familypassword) {        this.familypassword = familypassword;    }    public String getFamilyname() {        return familyname;    }    public void setFamilyname(String familyname) {        this.familyname = familyname;    }    public String getStates() {        return states;    }    public void setStates(String states) {        this.states = states;    }    public String getCreated_time() {        return created_time;    }    public void setCreated_time(String created_time) {        this.created_time = created_time;    }    }

想对Family表进行操作,从用户角度来讲,应该是先发出请求,比如  /family/insert

那么需要先找到Controller对应的方法,使用新建一个FamilyController.class

首先这是一个Controller,所以头上要加上@Controller注解

然后要接受/family的请求,所以也要加上@RequestMapping("/family")

下方方法,需要接收的二级请求是 /insert,所以方法前加上@RequestMapping("/insert")
这样处理了请求,知道需要做个插入,就该调用Service服务,所以要自动装配一个FamilyService

FamilyController

/** * @Author yinyunqi * @date 2017年12月22日 * @Content 处理家庭信息 */package com.yongqi.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.yongqi.service.FamilyService;@RequestMapping("/family")   //处理 /family 请求@Controller   //声明控制器public class FamilyController {    @Autowired    FamilyService familyService;        @ResponseBody   //返回JSON字符串,不需要找页面    @RequestMapping("/insert")   //处理 /family/insert 请求    public String insertTest() {familyService.insertFamily();return "insert success";    }}

这里调用了FamilyService,需要在这个类中添加insetFamily的方法

为了声明这是个Service,需要在类头加上注解@Service

FamilyService.class进行操作

/** * @Author yinyunqi * @date 2017年12月22日 * @Content 家庭信息处理服务 */package com.yongqi.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.yongqi.mapper.FamilyMapper;import com.yongqi.model.Family;@Servicepublic class FamilyService {    @Autowired    FamilyMapper familyMapper;          public void insertFamily() {//新建一个家庭对象,给该对象赋值Family family = new Family();family.setFamilyname("name");family.setFamilyaccount("account");family.setFamilypassword("password");family.setStates("states");family.setCreated_time("time");familyMapper.insertFamily(family);  //将已赋值的家庭对象传递mapper给接口    }}
其中调用了familyMapper这个接口,映射到Mapper.xml里

FamilyMapper.interface

/** * @Author yinyunqi * @date 2017年12月22日 * @Content 家庭信息处理持久层接口 */package com.yongqi.mapper;import com.yongqi.model.Family;public interface FamilyMapper {    public Family insertFamily(Family family);}

然后就要在项目里面找对应的Mapper了,在application.properties中已经配置了路径

<?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.yongqi.mapper.FamilyMapper"><select id="insertFamily"  parameterType="string" resultType="Family">insert into family (familyaccount,familypassword,familyname,states,created_time) values(#{familyaccount},#{familypassword},#{familyname},#{states},#{created_time})</select></mapper>

或者

<?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.yongqi.mapper.FamilyMapper"><insert id="insertFamily"  parameterType="string" >insert into family (familyaccount,familypassword,familyname,states,created_time) values(#{familyaccount},#{familypassword},#{familyname},#{states},#{created_time})</insert></mapper>
详情参考文档  http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

遇到问题:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'familyService': Unsatisfied dependency expressed through field 'familyMapper';

这个时候就应该检查一下配置了,有几个注意点

1、Application.class启动类上应该加上注解@MapperScan("com.yongqi.mapper"),这样才会动态扫描该文件夹下的Mapper

2、application.properties中有一个坑一个注意点

注意点:
mybatis.type-aliases-package=com.yongqi.model别名自动配置吧

坑:

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml这里配置的路径如果是多个,应该需要是平级下,不能有父子关系

比如

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml,classpath:mybatis/*.xml这样就是错误的,会报错Error parsing Mapper XML之类

启动一直报错,一般不是程序问题,大多是配置问题,SpringBoot又是自动配置,除非代码本身有严重的语法错误。

此时Application.class

/** * @Author yinyunqi * @date 2017年12月20日 * @Content 项目的启动引导类,Spring的主要配置类 */package com.yongqi;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.ServletComponentScan;import org.springframework.web.servlet.config.annotation.EnableWebMvc;//开启组件扫描和自动配置,包括://@Configuration标明该类使用Spring基于Java的配置//@ComponentScan启动组件扫描,这样写的web控制器类和其他组件才能被自动发现并注册为Spring应用程序的上下文Bean,比如@Controller,@Service//@EnableAutoConfiguration开启了SpringBoot自动配置//@EnableWebMvc@ServletComponentScan   //开启自动扫描servlet和filter,此时可以自定义servlet和filter@SpringBootApplication @MapperScan("com.yongqi.mapper")  //开启自动扫描Mapperpublic class Application {    public static void main(String[] args) {SpringApplication.run(Application.class, args);  //引导启动应用程序    }}
此时项目结构


然后浏览器  http://localhost:8080/family/insert 稳稳的成功

数据库中


成功。又到周末了,躺在被窝给考研的老铁们加油。。