源码地址下载:https://github.com/dxy3377/SSMDemo
一、SSMDemo
mybatis初期使用时通常需要dao层映射关联和一大堆配置文件,所以让很多开发人员觉得太过于麻烦,不利于开发。mybatis其实也发现了这个问题,所以后期进行了大量的优化,可以使用注解,自动管理dao层和配置文件。这两种方式我们在本章节中都会讲到。
1、pom.xml
本次demo使用mysql数据库,所以需要在pom文件里引入mybatis和mysql的依赖
如果看了上一章的童鞋们,要记得去掉mysql依赖的test那一行,替换成如下的版本号噢,因为test表示在运行时才会生效,所以在引入mysql包的时候会报错噢~
<!-- mybatis start -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!-- mybatis end -->
<!-- mysql start -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- mysql end -->
<!-- thymeleaf模板 start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- thymeleaf模板 end -->
<!-- web start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- web end -->
2、application.yml
因为本次需要讲到两种mybatis的使用方法,所以我会另外再写两个配置文件专门分开来,这个application.yml为共有配置,同时也相当于一个总的控制工具,区分使用哪种mybatis的用法。
其实在公司开发中,是用来区分开发、测试、正式三个环境的~
所以大家正常开发的时候,千万不要像我这样写jpa或xml
server:
port: 8080
spring:
profiles:
active: jpa或xml
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssmDemo?useUnicode=true&characterEncoding=utf-8
username: root
password: 123
mvc:
static-path-pattern: /static/**
view:
suffix: .html
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
3、启动类
启动类添加@MapperScan来对mapper包进行扫描
@SpringBootApplication
@MapperScan("com.alpaca.mapper")
public class SsmDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SsmDemoApplication.class, args);
}
}
4、UserEntity.java
public class UserEntity {
//编号
private Integer id;
//姓名
private String userName;
//优点
private String advantage;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAdvantage() {
return advantage;
}
public void setAdvantage(String advantage) {
this.advantage = advantage;
}
@Override
public String toString() {
return "UserEntity{" +
"id='" + id + '\'' +
", userName='" + userName + '\'' +
", advantage='" + advantage + '\'' +
'}';
}
}
5、application-jpa.yml(只想看xml格式的童鞋请直接翻到10、application-xml.yml,都想看的接着往下看~)
特点:耦合高。一切由注解搞定。
#mybatis配置(注解)
mybatis:
type-aliases-package: com.aplaca.entity
6、UserMapperForJPA.java
这是是指用注解编写的噢,xml的往下翻会有的~
因为启动类有扫描这个类所在的包,所以不用再在类上加@Mapper这个注解
package com.alpaca.SSMDemo.mapper;
import com.alpaca.SSMDemo.entity.UserEntity;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @Author: daixueyun
* @Description:
* @Date: Create in 22:08 2019/7/17
*/
public interface UserMapperForJPA {
@Select("select * from users")
@Results({
@Result(property = "userName", column = "user_name"),
@Result(property = "advantage", column = "advantage")
})
List<UserEntity> findAll();
@Select("select * from users where id = #{id}")
@Results({
@Result(property = "userName", column = "user_name"),
@Result(property = "advantage", column = "advantage")
})
UserEntity findOneById(Integer id);
@Update("update users set user_name = #{userName},advantage = #{advantage} where id = #{id}")
int updateUser(UserEntity userEntity);
@Insert("insert into users(user_name, advantage) values(#{userName}, #{advantage})")
int insertUser(UserEntity userEntity);
@Delete("delete from users where id = #{id}")
int deleteUser(Integer id);
}
7、ManagerController.java
由于只是demo,所以没有多少业务,就没有写sevice包,大家自己开发时还是要规范噢
package com.alpaca.SSMDemo.controller;
import com.alpaca.SSMDemo.entity.UserEntity;
import com.alpaca.SSMDemo.mapper.UserMapperForJPA;
import com.alpaca.SSMDemo.mapper.UserMapperForXML;
import com.alpaca.SSMDemo.utils.AjaxJson;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @Author: daixueyun
* @Description:
* @Date: Create in 22:42 2019/7/17
*/
@Controller
@RequestMapping(value = "/managerController")
public class ManagerController {
@Resource
private UserMapperForJPA userMapperForJPA;
@RequestMapping(value = "showUsers")
public String showUsers(HttpServletRequest request){
String page = "manager/showUsers";
List<UserEntity> userEntityList = userMapperForJPA.findAll();
request.setAttribute("users",userEntityList);
return page;
}
@RequestMapping(value = "findOneById")
@ResponseBody
public AjaxJson findOneById(HttpServletRequest request){
AjaxJson j = new AjaxJson();
String id = request.getParameter("id");
UserEntity user = userMapperForJPA.findOneById(Integer.parseInt(id));
if(null != user){
j.setSuccess(true);
j.setObj(user);
}else{
j.setSuccess(false);
j.setMsg("无数据");
}
return j;
}
@RequestMapping(value = "editUser")
@ResponseBody
public AjaxJson editUser(HttpServletRequest request){
AjaxJson j = new AjaxJson();
String flag = request.getParameter("flag");
String userName = request.getParameter("userName");
String advantage = request.getParameter("advantage");
if("edit".equals(flag)){
String id = request.getParameter("id");
UserEntity user = userMapperForJPA.findOneById(Integer.parseInt(id));
user.setUserName(userName);
user.setAdvantage(advantage);
int result = userMapperForJPA.updateUser(user);
}else if("add".equals(flag)){
UserEntity user = new UserEntity();
user.setUserName(userName);
user.setAdvantage(advantage);
int result = userMapperForJPA.insertUser(user);
}
return j;
}
@RequestMapping(value = "deleteUser")
@ResponseBody
public AjaxJson deleteUser(HttpServletRequest request){
AjaxJson j = new AjaxJson();
String id = request.getParameter("id");
int result = userMapperForJPA.deleteUser(Integer.parseInt(id));
j.setSuccess(true);
return j;
}
}
8、AjaxJson.java
前端页面使用ajax时,写了一个返回的对象,用于存放返回给前端页面的数据
package com.alpaca.SSMDemo.utils;
import java.util.Map;
/**
* Created by daixueyun on 2019/7/18 0018.
*/
public class AjaxJson {
private boolean success = true;
private String msg = "";
private Object obj = null;
private Map<String, Object> attributes;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Map<String, Object> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, Object> attributes) {
this.attributes = attributes;
}
}
到这里后台代码就写完咯,下面开始前端页面啦!!
9、showUsers.html
由于我比较懒,所以只写了一个页面,包含了增删改查。。大家见谅!!对不起!!
你以为这就完了咩??我还有更对不起你们的,因为驼也没啥美感,,所以我也没写css,也懒得找模板,这个丑丑的页面大家就将就着看看吧~
Thymeleaf是SpringBoot官方所推荐使用的模板语言,所以我们听大佬的话,页面上就用这个吧~~
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>用户信息展示</title>
<script th:src="@{/static/js/jquery/jquery-1.11.3.min.js}"></script>
<script th:src="@{/static/js/manager/users.js}"></script>
</head>
<body>
<table border="2px" align="center">
<tr>
<td colspan="3" align="center"><input type="button" onclick="add()" value="新增"></td>
</tr>
<tr>
<td>姓名</td>
<td>优点</td>
<td>操作</td>
</tr>
<tr class="trUser" th:each="u : ${users}">
<td th:text="${u.userName}"></td>
<td th:text="${u.advantage}"></td>
<td><input type="button" onclick="edit(this)" value="编辑"><input type="button" onclick="del(this)" value="删除"></td>
<td class="id" th:text="${u.id}" hidden></td>
</tr>
</table>
<div class="editBg" style="display:none">
<div>
<span>编辑场次</span>
<img class="addEditClose" th:src="@{/static/img/manager/close.png}">
</div>
<div>
<form id="editForm">
<input type="hidden" id="flag" name="flag">
<input type="hidden" id="id" name="id">
<div>
<div>姓名</div>
<input name="userName" id="userName">
</div>
<div>
<div>优点</div>
<input name="advantage" id="advantage">
</div>
<div>
<div onclick="editSubmit()">提交</div>
<div onclick="resetUser()">重置</div>
</div>
<input type="reset" name="reset" style="display: none;"/>
</form>
</div>
</div>
</body>
</html>
这个时候就能启动啦~记得要把application.yml里的修改一下
spring:
profiles:
active: jpa
然后启动!!!
页面运行后的页面就是酱的,很好看的表格呃。。
增删改查我就不操作展示了,大家可以自己写的时候试一下,源码是开头的github地址~大家可以自行下载运行噢
接下来是xml格式的mybatis了?
10、application-xml.yml(黑魔法⭐⭐自动拼接到4、UserEntity.java后面)
特点:松耦合。极简xml版本保持映射文件的老传统,优化主要体现在不需要实现dao的实现层【只需要定义接口类和方法】,系统会自动根据方法名在映射文件中找对应的sql【由namespace和名称坐标确定】。
#mybatis配置(xml)
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
11、UserMapperForXML.java
package com.alpaca.SSMDemo.mapper;
import com.alpaca.SSMDemo.entity.UserEntity;
import org.omg.CORBA.INTERNAL;
import java.util.List;
/**
* Created by daixueyun on 2019/7/18 0018.
*/
public interface UserMapperForXML {
List<UserEntity> findAll();
UserEntity findOneById(Integer id);
int updateUser(UserEntity userEntity);
int insertUser(UserEntity userEntity);
int deleteUser(Integer id);
}
12、userMapperForXML.xml
对应的映射文件
这时候听我一句劝,不要在sql语句后加分号!!!千万不要!!
我之前开发公司项目时,因为这个小小的分号,找问题找过1个小时!!
<?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.alpaca.SSMDemo.mapper.UserMapperForXML">
<resultMap id="resultMap" type="com.alpaca.SSMDemo.entity.UserEntity">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="userName" property="userName" jdbcType="VARCHAR" />
<result column="advantage" property="advantage" jdbcType="VARCHAR" />
</resultMap>
<select id="findAll" resultMap="resultMap">
select id,user_name as userName,advantage from users
</select>
<select id="findOneById" parameterType="java.lang.Integer" resultMap="resultMap">
select id,user_name as userName,advantage from users where id = #{id}
</select>
<update id="updateUser" parameterType="com.alpaca.SSMDemo.entity.UserEntity">
update users
<set>
user_name = #{userName},advantage = #{advantage}
</set>
<where>
id = #{id}
</where>
</update>
<insert id="insertUser" parameterType="com.alpaca.SSMDemo.entity.UserEntity" flushCache="true">
insert into users(user_name, advantage) values(#{userName}, #{advantage})
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from users where id = #{id}
</delete>
</mapper>
这个时候就能启动啦~记得要把application.yml里的修改一下
spring:
profiles:
active: xml
ManagerController.java里的
@Resource
private UserMapperForJPA userMapperForJPA;
替换为
@Resource
private UserMapperForXML userMapperForXML;(使用这个!!)
然后启动!!!
当然,页面并没有什么不同,依然是那么好看的表格~~哈哈哈哈哈哈哈哈哈
整个教程到这里就结束啦~大家有遇到任何问题请在评论区留言噢