spring boot初体验(四)集成MyBatis

一.简介

1.关于ORM

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1]  。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

(梭自百度百科https://baike.baidu.com/item/ORM/3583252?fr=aladdin

2.MyBatis介绍

MyBatis是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

http://blog.csdn.net/jiuqiyuliang/article/details/45286191

二.准备工作

1.mysql下载地址(msi版):

http://sw.bos.baidu.com/sw-search-sp/software/dbe4e07f278c8/mysql-installer-community-5.7.20.msi

2.mysql数据库安装(和上边下载地址匹配的安装教程)

https://jingyan.baidu.com/article/363872ec2e27076e4ba16fc3.html

3.数据库准备工作

mysql数据库,创建"mydb"数据库,创建user表。添加字段id,name,age,并随便模拟几条数据

数据库可视化工具这里用的 navicat,可以网上自己搜索和下载。

三.实现步骤

默认装好了mysql数据库,并且有一个简单的返回api的spring boot demo。如果没有了解简单的spring boot结构,可以参考之前几篇文章构建一个demo

spring boot构建一个api返回helloworld: https://my.oschina.net/CrazyBoy1024/blog/1610025

spring boot中的aop/ioc :

https://my.oschina.net/CrazyBoy1024/blog/1610746  https://my.oschina.net/CrazyBoy1024/blog/1610048

1.添加依赖

在pom.xml中添加mysql和mybatis的依赖

        <!-- 添加 MySQL -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.41</version>
		</dependency>
		<!-- 添加 MyBatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.2.0</version>
		</dependency>

2.创建分层结构和必要的类。

java的分层结构一般为Action(Controller)+Services+Dao ;

关于java里的三层结构介绍:http://blog.csdn.net/inter_peng/article/details/41021727

(1)创建需要用到的分层结构和文件

· 在resources静态资源里创建【mapper】文件夹,用于存放写sql的xml文件,创建user.xml文件。

· 创建一个【model】文件夹,用于存放mybatis返回的数据实体, 创建User.java文件 。

· 创建一个【dao】文件夹,用于编写数据操作,这里是预留mybatis调用的数据操作(个人理解),创建·     UserDao.java文件。

·创建一个【services】文件夹,用于编写业务操作和dao层调用取数据等(个人理解), 创建             IUserService.java接口,创建【impl】文件夹用于放对接口的具体实现,并创建UserServiceImpl.java

完成后如图所示

 

(2)编写User实体  

这里的User实体依然用上篇文章的User类,改造一下把id改为int和数据库对应,添加age属性

package com.example.demo.model;

import org.springframework.stereotype.Component;

/**
 * @author liucx
 */
@Component
public class User {
    private  int id;
    private  String name;
    private  int age;
    public long getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

(3)编写UserDao文件

package com.example.demo.dao;

import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserDao {
    //这里的get对应的是user.xml里<select id="get">
    public User get(@Param("id")int id);
}

(4)编写IUserService接口和实现

IUserServiece接口:

package com.example.demo.services;

import com.example.demo.model.User;
public interface IUserServiece {
    public User get(int id);
}

UserServiceImpl实现:

package com.example.demo.services.impl;

import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import com.example.demo.services.IUserServiece;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements IUserServiece {

    @Autowired
    //idea会报语法错误,编译没问题Could not autowire. No beans of 'UserDao' type found
    // 降低警告级别可解决
    private UserDao dao;

    @Override
    public User get(int id) {
        User user = dao.get(id);
        return  user;
    }
}

(5)编写user.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" >
<!--namespace指向UserDao路径-->
<mapper namespace="com.example.demo.dao.UserDao">
    <!--resultMap是定义返回数据实体的节点。
        type指返回实体的类型,这里指向model下的User.java实体。
        id是resltMap的唯一标识,只要不重复就ok,命名最好符合当前意义。
        节点内的column与数据库的字段name对应。property与User.java属性对应。这样完成实体属性和数据库字段的映射-->
    <resultMap type="com.example.demo.model.User" id="user">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>

    <!--select是mybatis的查询操作,类似的还有update,delete等
        id是唯一标识,要与dao的接口定义的方法名一致。
        resultMap是对应上边返回数据实体的节点id
        内部嵌套sql语句,#{ param }是接收的参数-->
    <select id="get" resultMap="user">
        select user.id, user.name, user.age
        from user
        where id = #{id}
    </select>

</mapper>

3.配置数据库连接和mybatis

在application.properties配置mysql数据库连接和mybatis

#mysql配置

# 数据库地址= jdbc:mysql://本地host:端口号/库名
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# mybatis配置

#指向数据实体存放的路径,这里是com.example.demo.model  
mybatis.typeAliasesPackage=com.example.demo.model  
#指向mybatis xml文件存放路径,这里是mapper下所有的xml文件,*代表所有.xml后缀
mybatis.mapperLocations=classpath:/mapper/*.xml

4.修改controller,调用services层取数据

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.services.IUserServiece;
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.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


/**
 * @author liucx
 */
@RestController
public class TestController {
    @Autowired
    User user;
    @Autowired
    IUserServiece userServiece;

    @RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
    public  User getUser(@PathVariable int id){
        user=userServiece.get(id);
        return user;
    }
}

5.浏览器运行

浏览器输入http://localhost:8080/get/1

对比数据库

完成spring boot中集成mybatis从数据库取值操作。

 

 

四.可能遇到的报错

1.控制台警告  SSL

这个是新版本的mysql会要求显式配置ssl,不影响执行结果。

想去掉这个问题的话,只需要在配置文件mysql连接字符串里修改后缀加上userSSL=false即可。

2.未找到Dao , MyBatis绑定错误

这里要检查xml里节点id和Dao里定义的接口方法是否对应(我第一次就是错在这里),比如UserDao里定义get,则对应xml中<select id="get"></select>。

xml内中文注释也可能导致该报错,也可尝试删除注释。

可以按以下步骤一一执行:

· 检查xml文件所在的package名称是否和interface对应的package名称一一对应

· 检查xml文件的namespace是否和xml文件的package名称一一对应

· 检查函数名称能否对应上

· 去掉xml文件中的中文注释

· 随意在xml文件中加一个空格或者空行然后保存

3.跳转页面的url无对应的值

异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.

出现这个异常说明了跳转页面的url无对应的值. 也就是404. 

在第一篇文章中提到过这个。需要把 带有@SpringBootApplication注解的入口类放在根目录,否则找不到其他的类。

 

最后放上spring boot 1-4的整个demo地址,可以参考,有错误希望可以帮助指正。

https://github.com/tennyxx/cx.springboot.demo

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