Mybatis案例超详解(上)
Mybatis案例超详解
前言:
本来是想像之前一样继续跟新Mybatis,但由于种种原因,迟迟没有更新,快开学了,学了一个暑假,博客也更新了不少,我觉得我得缓缓,先整合一些案例练练,等我再成熟点理解再透彻点之后再详细更新,如果仅仅是为了更新博客而忽视质量的话,有违我的初心,所以我决定,暂时转移路线,整合一些案例,为了以后更新更好的博客而准备。
此篇我会由浅入深进行整理,适合新手练习,希望能对一些有需求的朋友有所帮助。
案例准备
开发工具:IDEA
前端页面:
在Bootstrap官网https://getbootstrap.com/下载 Bootstrap CSS、JavaScript 和字体的预编译的压缩版本
从 jquery.com 下载 jQuery 库
案例解析
创建Maven项目
创建数据库
CREATE DATABASE moocmybatis;
USE moocmybatis;
CREATE TABLE users(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
username VARCHAR(50) NOT NULL COMMENT '登录账号',
userpass VARCHAR(50) NOT NULL COMMENT '登录密码',
nickname VARCHAR(50) COMMENT '昵称',
age INT COMMENT '用户年龄',
gender VARCHAR(5) COMMENT '用户性别',
phone VARCHAR(13) COMMENT '联系方式',
email VARCHAR(20) COMMENT '用户邮箱',
createTime DATETIME COMMENT '账号创建时间',
updateTime DATETIME COMMENT '账号最后修改时间',
lastLogin DATETIME COMMENT '账号最后一次登录时间',
userStatus INT COMMENT '用户账号的状态 0 正常 1 锁定 2 删除',
remark TEXT COMMENT '备注'
);
pom.xml
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
mybatis-config.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>
<!--
properties配置,用于加载外部的properties配置文件
-->
<properties resource="db.properties"></properties>
<!--
environments 主要用于进行数据源的配置
可以配置多个数据源~ 通过default属性来指定当前项目运行过程中使用的是哪个数据源
-->
<environments default="development">
<!--
environment 用于配置一个具体的独立的数据源
id属性用于给当前数据源定义一个名称,方便我们的项目指定
-->
<environment id="development">
<!--
transactionManager用于配置事务管理,默认情况下使用的是JDBC事务管理
-->
<transactionManager type="JDBC"/>
<!--
dataSource具体数据源的链接信息;type属性用于指定是否使用连接池
-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mappers主要用于配置我们外部的映射配置文件
在主配置文件中需要引入加载映射配置文件
-->
<mappers>
<!-- mapper主要配置引入某一个具体的映射文件,resource进行路径方式的引入 -->
<mapper resource="mapper/usersMapper.xml"/>
</mappers>
</configuration>
usersMapper.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">
<!--
mapper 用于定义一个映射配置文件的根节点
namespace属性是用来配置命名空间,主要进行session级别的缓存管理
命名空间默认情况下,使用我们当前操作的实体类的全路径
-->
<mapper namespace="com.demo.entity.Users">
<select id="usersList" resultType="com.demo.entity.Users">
select * from users;
</select>
</mapper>
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/moocmybatis?useUnicode=true&characterEncoding=utf8
username=root
password=root
Users
package com.demo.entity;
import java.util.Date;
public class Users {
private Integer id; // 用户编号
private String username; // 登录账号
private String userpass; // 登录密码
private String nickname; // 用户昵称
@Override
public String toString() {
return "Users{" +
"id=" + id +
", username='" + username + '\'' +
", userpass='" + userpass + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
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 getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
TestDemo
import com.demo.entity.Users;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
@Test
public void test1() throws IOException {
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session= sqlSessionFactory.openSession();
List<Users> list = session.selectList("usersList");
for (Users user:list){
System.out.println(user);
}
session.close();
}
}
运行结果
测试成功,证明数据库连接没有任何问题。
Web
Tomcat的配置看我博客园的博客或自己百度搜索
在文章开头的网址中下载并添加整理到如图的文件夹下
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>mybatispro</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户管理中心</title>
<link rel="stylesheet" href="lib/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="lib/2.2.4/jquery-1.12.4.min.js"></script>
<script src="lib/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>泰斗贤若如后台管理系统 <small>用户数据管理中心</small></h1>
</div>
</div>
<div class="row">
<div class="jumbotron">
<h1>MyBatis基础入门!</h1>
<p>通过一个项目来完成基础部分的学习</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">请关注泰斗贤若如博客园</a></p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">新增用户</a></p>
</div>
</div>
<div class="row">
<table class="table table-hover table-striped">
<tr>
<th>用户编号</th>
<th>登录账号</th>
<th>用户昵称</th>
<th>邮箱</th>
<th>联系方式</th>
<th>账号创建时间</th>
<th>用户状态</th>
<th>操作</th>
</tr>
<tr>
<td>111</td>
<td>张三丰</td>
<td>拉拉</td>
<td>222@qq.com</td>
<td>244465656</td>
<td>2019</td>
<td>正常</td>
<td>
<a href="#">查看</a>
<a href="#">修改</a>
<a href="#">删除</a>
</td>
</tr>
<tr>
<td>111</td>
<td>张三丰</td>
<td>拉拉</td>
<td>222@qq.com</td>
<td>244465656</td>
<td>2019</td>
<td>正常</td>
<td>
<a href="#">查看</a>
<a href="#">修改</a>
<a href="#">删除</a>
</td>
</tr>
<tr>
<td>111</td>
<td>张三丰</td>
<td>拉拉</td>
<td>222@qq.com</td>
<td>244465656</td>
<td>2019</td>
<td>正常</td>
<td>
<a href="#">查看</a>
<a href="#">修改</a>
<a href="#">删除</a>
</td>
</tr>
</table>
</div>
</div>
</body>
</html>
启动服务器并展示页面
Bootstrap的学习可以到https://v3.bootcss.com/中学习,在这不多说。
继续深入
SqlSessionFactoryUtils
package com.demo.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtils {
private static String RESOURCE = "mybatis-config.xml";
private static SqlSessionFactory sqlSessionFactory;
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
/**
* 创建一个初始化SqlSessionFactory的方法
*/
public static void initSqlSessionFactory(){
try {
InputStream is = Resources.getResourceAsStream(RESOURCE);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取工厂的方法
* @return
*/
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
public static void close(){
SqlSession session = threadLocal.get();
if (session!=null){
session.close();
threadLocal.set(null);
}
}
}
UserDao
package com.demo.dao; import com.demo.entity.Users;
import com.demo.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession; import java.util.List; public class UsersDao {
private SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
private List<Users> list; public List<Users> findAll(){
try {
list = session.selectList("findAll");
}catch (Exception e){
e.printStackTrace();
}finally {
session.close();
} return list;
}
}
InitSqlSessionListener
package com.demo.listener;
import com.demo.utils.SqlSessionFactoryUtils;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class InitSqlSessionListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("容器加载中。。。。。");
//初始化SqlSessionFactory对象
SqlSessionFactoryUtils.initSqlSessionFactory();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("容器销毁中。。。。。");
//关闭SqlSession对象
SqlSessionFactoryUtils.close();
}
}
测试(启动服务器,关闭服务器)
测试成功。
UsersFindServlet
package com.demo.servlet;
import com.demo.dao.UsersDao;
import com.demo.entity.Users;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/index")
public class UsersFindServlet extends HttpServlet {
private UsersDao usersDao = new UsersDao();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Users> list = usersDao.findAll();
req.setAttribute("usersList",list);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
home.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2019/8/16
Time: 9:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>跳转</title>
</head>
<body>
<%
response.sendRedirect("/index");
%>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>mybatispro</display-name>
<welcome-file-list>
<welcome-file>home.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>用户管理中心</title>
<link rel="stylesheet" href="lib/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="lib/2.2.4/jquery-1.12.4.min.js"></script>
<script src="lib/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>泰斗贤若如后台管理系统 <small>用户数据管理中心</small></h1>
</div>
</div>
<div class="row">
<div class="jumbotron">
<h1>MyBatis基础入门!</h1>
<p>通过一个项目来完成基础部分的学习</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">请关注泰斗贤若如博客园</a></p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">新增用户</a></p>
</div>
</div>
<div class="row">
<table class="table table-hover table-striped">
<tr>
<th>用户编号</th>
<th>登录账号</th>
<th>用户密码</th>
<th>用户昵称</th>
</tr>
<c:forEach var="user" items="${usersList}">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.userpass}</td>
<td>${user.nickname}</td>
<td>
<a href="#">查看</a>
<a href="#">修改</a>
<a href="#">删除</a>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</body>
</html>
开启服务器测试
测试成功
好,到这的话Mybatis基础操作入门应该差不多了,此篇到此结束,下一篇会继续更新增删改查功能。
*****************************************************************************************************
我的博客园地址:https://www.cnblogs.com/zyx110/
Mybatis案例超详解(上)的更多相关文章
- Mysql超详解
Mysql超详解 一.命令框基本操作及连接Mysql 找到Mysql安装路径,查看版本 同时按快捷键win+R会弹出一个框,在框中输入cmd 点击确定后会出现一个黑框,这是命令框,我们的操作要在这命令 ...
- mybatis代码生成器配置文件详解
mybatis代码生成器配置文件详解 更多详见 http://generator.sturgeon.mopaas.com/index.html http://generator.sturgeon.mo ...
- [Spark内核] 第36课:TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等
本課主題 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...
- 《FPGA设计技巧与案例开发详解-第二版》全套资料包
本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...
- 《深入理解mybatis原理2》 Mybatis初始化机制详解
<深入理解mybatis原理> Mybatis初始化机制详解 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程 ...
- html5的float属性超详解(display,position, float)(文本流)
html5的float属性超详解(display,position, float)(文本流) 一.总结 1.文本流: 2.float和绝对定位都不占文本流的位置 3.普通流是默认定位方式,就是依次按照 ...
- MyBatis Mapper XML 详解
MyBatis Mapper XML 详解 MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JD ...
- Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节
简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...
- Python3调用C程序(超详解)
Python3调用C程序(超详解) Python为什么要调用C? 1.要提高代码的运算速度,C比Python快50倍以上 2.对于C语言里很多传统类库,不想用Python重写,想对从内存到文件接口这样 ...
随机推荐
- GitHub使用整理——从开始到上传项目
前期准备 首先是github官网: https://github.com/ 下载github工具: https://git-for-windows.github.io/ 进入github创建一个新的项 ...
- Centos6.5安装Redis3.2.8
1 - Redis安装 redis安装 在网上一搜一大把,但是还是在这里想要能够统一吧,所以这个安装步骤是在Centos6.5 Minimal 上安装redis3.4.8,本次安装是在root 用户下 ...
- 解决springboot项目请求出现非法字符问题 java.lang.IllegalArgumentException:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
springboot版本: 2.1.5 最近使用springboot搭建了一个App后台服务的项目,开发接口的时候在本机使用postman工具做请求测试,请求返回一直很正常,但是在前端开发使用h5请求 ...
- 浅谈ActiveMQ与使用
一.什么是消息中间件 消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传送 二.什么是ActiveMQ ActiveMQ是一种开源的基于JMS(Java Message Servie)规 ...
- 高性能javascript-总结(一)
性能优化 第一章:加载和执行 总结: 将所有<script>标签放到页面底部.这能确保在脚本执行前页面已经渲染了. 合并脚本.<script>标签越少,加载越快,响应速度也更迅 ...
- linux 反弹shell
Linux下反弹shell笔记 0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或 ...
- DataNode的工作机制
DataNode的工作机制 一个数据块在DataNode以文件的形式在磁盘上保存,分为两个文件,一个是数据本身, 一个是元数据信息(包括数据的长度,校验和,时间戳) 1.DataNode启动后,向Na ...
- [PTA] L3-015 球队“食物链”
原题链接 思路: 如果有环,则起点一定为"1".如果没有可以胜过"1"的,则无环. 根据W,L来建立图,用dfs从1节点遍历+回溯. 剪枝:dfs到某个子序列时 ...
- IP地址/掩码/网关/DNS的设置与工作原理(转)
现在互联网飞速发展,工作中生活中上不了网的计算机是不可想象的,而电脑系统网络设置中的IP地址.子网掩码.默认网关及DNS服务器,怎么理解,它们是如何工作的,下面做个简单介绍. 通常的上网方式,是打开I ...
- Linux文件系统损坏导致无法正常启动与fsck修复工具
今天在打开自己的虚拟机学习的时候,发现在文件系统检查过程中出现以下的报错: /dev/mapper/VolGroup-lv_root:UNEXPECTED INCONSISTENCY;RUN fsck ...