- eclipse+maven+springBoot(一)[搭建简单的web项目,整合jsp,用控制器访问页面]
- eclipse+maven+springBoot(二)[加入版本控制,整合Git,用码云管理代码]
- eclipse+maven+springBoot(三)[连接数据库,整合Mybatis,实现数据存储读取]
一、前言
这是基于第一部分的demo接着写的,即bootWeb项目,请知悉。
第一部分已经实现了简单的springBoot项目,访问jsp页面。
现准备整合mybatis,以实现与数据库的交互。
这里选用的数据库是mySql。
二、准备工作
1、mySql数据库
请自行下载好mySql数据库,并创建记录下用户名密码。
或者已知其他机器有可连接的mysql数据库。
2、确认mySql服务是否启动
右键“我的电脑/计算机”,选择 管理
找到服务下的MySQL服务,确保是已经启动着的。
如果没有启动,需要右键-启动。
3、连接数据库新建表与数据
我这里是用SQLyog连接的MySql数据库,当然也可以用别的。
如果连接不上,可能是MySql服务没启动成功。
新建表user,字段userId,userName,userPassword。
然后随便插入几条数据。
三、配置mybatis
- 我这里是配置mybatis连接mySql数据库,用的也是spring的数据库连接池(你也可以用c3p0或者其他的)。
在第一部分的pom.xml基础上,新增mybatis和mySql的依赖。然后等待maven自动更新。
我本地是8.0版本的mySql,所以引入了8的jar。
<!-- mySql 支持 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
- 在src/main/resources资源目录下新建文件夹mybatis,新建文件mybatis.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>
<!-- 开启二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
-
我选择的是application.yml作为配置文件,在application.yml中简单进行数据库连接配置和mybatis映射配置。
配置的是自己或者已知的mySql数据库的地址,用户名和密码。8.0版本的mySql要加后面的这些东西。(
?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true)
server:
port: 8080
mybatis:
config-location: "classpath:mybatis/mybatis.cfg.xml" # mybatis配置文件所在路径
mapper-locations: "classpath:mybatis/mapper/**/*.xml" # mapper映射文件
type-aliases-package: com.jzj.controller.entity # 别名类所在包
spring:
application:
name: bootWeb #微服务的名字
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/home?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true # 数据库名称
username: root # 数据库用户名
password: 123456 # 密码
mvc:
view:
prefix: /WEB-INF/jsp/ # 视图解析前缀
suffix: .jsp # 视图解析后缀
这里先启动下项目,保证不报错。
四、代码编写
我们先把每种类型的文件分类建包,除了第一部分的controller,增加entity,service,impl,dao,mapper文件夹。我的目录结构如下:
自己的目录结构和配置里的目录、代码里的目录一定要保持一致。
1、在entity文件夹下新建User.java
右键entity文件夹,new-Class,填入User,然后Finish。
package com.jzj.entity;
public class User {
private int userId;
private String userName;
private String userPassword;
public User() {
super();
}
public User(int userId, String userName, String userPassword) {
super();
this.userId = userId;
this.userName = userName;
this.userPassword = userPassword;
}
public int getuserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userPassword=" + userPassword + "]";
}
}
2、在dao文件夹下UserDao.java
右键dao文件夹,new-Interface,填入UserDao,然后Finish。不要漏了@Mapper注解
package com.jzj.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.jzj.entity.User;
@Mapper
public interface UserDao {
/**
* 新增用户
* @param user
* @return
*/
public boolean addUser(User user);
/**
* 单个查询
* @param id
* @return
*/
public User getUser(int id);
/**
* 查询全部
* @return
*/
public List<User> getUsers();
}
3、在mapper文件夹下新建UserMapper.xml
右键mapper文件夹,new-Other,选择File,填入UserMapper.xml,然后Finish。
<?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.jzj.dao.UserDao">
<select id="getUser" resultType="com.jzj.entity.User" parameterType="int">
select * from user where userId=#{id}
</select>
<select id="getUsers" resultType="com.jzj.entity.User">
select * from user
</select>
<insert id="addUser" parameterType="com.jzj.entity.User">
insert into user(userId, userName, userPassword) values(#{userId}, #{userName}, #{userPassword})
</insert>
</mapper>
4、在service文件夹下新建UserService.java
右键service文件夹,new-Interface,填入UserService,然后Finish。
package com.jzj.service;
import java.util.List;
import com.jzj.entity.User;
public interface UserService {
public boolean addUser(User user);
public User getUser(int id);
public List<User> getUsers();
}
5、在service文件夹下的impl文件夹下新建UserServiceImpl.java,用以继承UserService,并重写方法
不要漏了@Service注解
通过@Autowired注解注入刚才写的UserDao,以便调用SQL方法。
package com.jzj.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jzj.dao.UserDao;
import com.jzj.entity.User;
import com.jzj.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public boolean addUser(User user) {
boolean flag;
flag = userDao.addUser(user);
return flag;
}
@Override
public User getUser(int id) {
User user = userDao.getUser(id);
return user;
}
@Override
public List<User> getUsers() {
List<User> users = userDao.getUsers();
return users;
}
}
6、在controller文件夹下新建UserController.java。
这里用rest风格的controller,可以看做@Controller注解和@ResponseBody注解的合并,即返回具体数据。
通过@Autowired注解注入UserService,并调用其中的方法。
package com.jzj.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.jzj.entity.User;
import com.jzj.service.UserService;
@RestController
public class UserController {
@Autowired
private UserService service;
/**
* 新增用户
* @param user
* @return
*/
@RequestMapping(value="/add", method=RequestMethod.POST)
public boolean addUser(@RequestBody User user){
boolean flag = service.addUser(user);
return flag;
}
/**
* 单个查询
* @param id
* @return
*/
@RequestMapping(value="/get/{id}", method=RequestMethod.GET)
public User getUser(@PathVariable("id") int id){
User user = service.getUser(id);
return user;
}
/**
* 查询全部
* @return
*/
@RequestMapping(value="/getUser/list", method=RequestMethod.GET)
public List<User> getUsers(){
List<User> users = service.getUsers();
return users;
}
}
7、将App.java这个启动类上的@ComponentScan配置扫描的报文改为上一级,以便扫描所有注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration
@ComponentScan(value = { "com.jzj" })
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
或者使用@SpringBootApplication注解来启动
package com.jzj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
右键App.java,Run As - Java Application,访问http://localhost:8080/getUser/list,成功获得数据库中的数据。
好了。完!
最后文件目录是这样的
四、代码提交
没配置git或者svn的,就不用做了。
右键项目,Team - Commit
填写提交信息,然后Commit。注意选择全部文件。
右键项目,Team - Remote - Push,推送到远程。
推送远程成功。
——————————————————分割线————————————————————
-
Invalid bound statement (not found)错误的可能原因
- 检查xml文件所在package名称是否和Mapper interface所在的包名
- mapper的namespace写的不对!!!注意修改。
- UserDao的方法在UserDao.xml中没有,然后执行UserDao的方法会报此
- UserDao的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType!
- 如果你确认没有以上问题,请任意修改下对应的xml文件,并重新保存.问题解决
- 看下mapper的XML配置路径是否正确
-
Could not create connection to database server.
- 检查jar包版本与安装的mySql版本是否一致。比如我安装的是8.0.12的mySql。
——————————————————分割线————————————————————