Mybatis实现简单的CRUD(增删改查)

用到的数据库:

CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'靠谱杨','123456'),(2,'张三','abcdef'),(3,'李四','987654');

使用之前要在Maven中导入Mybatis依赖包

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>

官方的MyBatis核心配置文件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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?
useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="000429"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kuang/dao/userMapper.xml"/>
</mappers>
</configuration>

注意

****

这里很有可能会报错,需要解决Maven静态资源过滤问题,Maven有习惯大于配置原则

在pom.xml文件中加入以下代码:

    <build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>

注意配置完之后刷新maven!


简单数据类型User.java:

package com.kuang.pojo;
public class User {
private int id; //id
private String name; //姓名
private String pwd; //密码
//构造,有参,无参
//set/get
//toString() @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
} public User(){}
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public User(int id, String name, String pwd) { this.id = id;
this.name = name;
this.pwd = pwd;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
}
}

数据接口层UserMapper.java:

public interface UserMapper {
//查询全部用户
List<User> getUserList();
//根据ID查询用户
User getUserByID(int id);
//insert一个用户
int addUser(User user);
//update一个用户
int updateUser(User user);
//delete一个用户
int deleteUser(User user);
}

用户定义userMapper.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="com.kuang.dao.UserMapper"> <select id="getUserList" resultType="com.kuang.pojo.User">
select * from user
</select> <select id="getUserByID" resultType="com.kuang.pojo.User" parameterType="int">
select * from user WHERE id = #{id}
</select> <!--对象中的属性可以直接取出来 -->
<insert id="addUser" parameterType="com.kuang.pojo.User">
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
</insert> <update id="updateUser" parameterType="com.kuang.pojo.User">
update mybatis.user set name = #{name} , pwd=#{pwd} where id = #{id} ;
</update> <delete id="deleteUser" parameterType="com.kuang.pojo.User" >
delete from mybatis.user where id = #{id}
</delete>
</mapper>

这里我们可以发现:数据接口是和xml对应的,xml文件实例了这个接口和里面的方法,namespace就是这个接口的名字,里面的select标签对应这个接口里的一个方法,id就是方法名,resultType对应这个方法的返回值类型。

xml文件namespace的包名要和Dao/Mapper接口类名保持一致!

  • id(getUserList):就是对应的namespace中的方法名( List getUserList(); )
  • resultType:是SQL语句执行后的返回值!(Class、基本数据类型)
  • parameterType:参数类型!
  • delete from mybatis.user where id = #{id} 分析这个sql语句,赋值方式和JDBC有所不同,使用这样的格式#{ } 里面的参数是这个方法参数User对象里的成员属性 id 可以直接放到这里用!

配置工具类(MybatisUtils.java)获取连接对象:

package com.kuang.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 MybatisUtils {
//从SqlSessionFactory中获得SqlSession的实例,SqlSession完全包含了SQL命令的执行方法
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//读取配置文件获取连接
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//返回获取的SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}

分析一下这个工具类:

首先这个SqlSessionFactory类是一个工厂类,这个工厂可以产生传统JDBC方法中获得的PreparedStatement对象。也就是这个工具类要完成和JDBCutils同样的任务,首先获取和数据库的连接,那么第一步也就是读取用户配置的mybatis-config.xml文件,可以得到一个数据库连接对象,之后用这个对象去获得一个类似于PreparedStatement对象的SqlSession类的对象。


下面给出具体的调用方法(UserDaoTest.java):

import com.kuang.dao.UserMapper;
import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
//sqlSession对象相当于是一个JDBC的PreparedStatement对象,这个对象可以执行sql语句
//我们现在做的事情就是:获取数据库连接,得到sqlSession对象,通过这个对象去实现我们定义的数据操作接口
//UserMapper,这个接口再通过解析我们定义的userMapper.xml文件去执行带有SQL语句的特定方法。
SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// List<User> userList = mapper.getUserList();
// for (User user : userList)
// {
// System.out.println(user);
// }
//根据ID取
/*User user=mapper.getUserByID(1);
System.out.println(user);
sqlSession.close();*/
//更新一条数据 id为1
// updateUser();
//删除一个用户
deleteUser();
}
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//插入一条数据
User user = new User(4, "名字", "密码");
int res = mapper.addUser(user);
if (res>0){
System.out.println("插入成功!");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
public void updateUser(){
//获得连接coon和执行sql语句的对象 类似JDBC的PreparedStatement
SqlSession sqlSession = MybatisUtils.getSession();
//实现UserMapper接口 通过反射机制
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User(1, "修改后的名字", "resetpass01");
userMapper.updateUser(user);
sqlSession.commit();
sqlSession.close();
} public void deleteUser(){
//获取连接
SqlSession sqlSession = MybatisUtils.getSession();
//实现接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//实现接口后的mapper调用自己的方法执行sql语句
userMapper.deleteUser(new User(1,"sss","123"));
sqlSession.commit();
sqlSession.close();
}
}

分析一下这两行代码:

	SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  • 第一行代码,通过MybatisUtils类的getSession方法获得一个sqlSession对象,这个对象是一个已经连接了数据库的可以执行sql语句的对象(类似JDBC的PreparedStatement对象)
  • 这样还不够,这只是停留在工具类层面,下面要做的一件事情就是让这个工具类去实现用户自定义的数据层接口,从而可以根据用户定义的数据操作方法去执行相应的sql语句,进而得到相应的结果集。

Mybatis实现简单的CRUD(增删改查)原理及实例分析的更多相关文章

  1. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  2. SpringBoot+Mybatis+Maven+MySQL逆向工程实现增删改查

    SpringBoot+Mybatis+MySQL+MAVEN逆向工程实现增删改查 这两天简单学习了下SpringBoot,发现这玩意配置起来是真的方便,相比于SpringMVC+Spring的配置简直 ...

  3. salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的标签相对简单,如果需要深入了解VF相关知识以及标签, 可以通过以下链接查看或下载 ...

  4. 前端的CRUD增删改查的小例子

    前端的CRUD增删改查的小例子 1.效果演示 2.相关代码: <!DOCTYPE html> <html lang="en"> <head> & ...

  5. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  6. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-2.使用Mybatis注解开发视频列表增删改查

    笔记 2.使用Mybatis注解开发视频列表增删改查     讲解:使用Mybatis3.x注解方式 增删改查实操, 控制台打印sql语句              1.控制台打印sql语句      ...

  7. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  8. 创建支持CRUD(增删改查)操作的Web API(二)

    一:准备工作 你可以直接下载源码查看 Download the completed project.     下载完整的项目 CRUD是指“创建(C).读取(R).更新(U)和删除(D)”,它们是四个 ...

  9. Mybatis之基于XML的增删改查

    这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck. 前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,O ...

  10. 【EF6学习笔记】(二)操练 CRUD 增删改查

    本篇原文链接: Implementing Basic CRUD Functionality 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整:并且根 ...

随机推荐

  1. Python树莓派 爬虫心得

    平台: 树莓派 linux 语言:python 搞一个爬虫都清楚是怎么回事,我这里玩过之后有下面的心得: 为什么要用树莓派呢,省电啊,没乱七八糟的桌面问题,可以一直开着. 1.树莓派上的磁盘写入对于不 ...

  2. PHP中的PDO操作学习(二)预处理语句及事务

    今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现.只不过大部分情况下,大家都在使用框架,手写的机会非 ...

  3. CentOS Linux 简单安装 clickhouse

    本文只是仅仅的介绍安装 至于更多介绍请自信百度 1.本人 linux版本 [root@localhost /]# cat /etc/redhat-releaseCentOS Linux release ...

  4. Jmeter系列(8)- 参数化:JSON提取器、全局参数化、CSV文件导入

    JSON提取器 同一个响应结果需要提取多个参数进行参数化,下方输入项用分号(;)进行间隔.请求引用时${变量名} 全局参数化 此处全局参数化用的是用户自定义的变量 CSV文件导入

  5. 看完小白也会使用,Android投屏神器scrcpy详细教程

    楔子 做为一个软件测试工程师,在使用手机测试的时候,缺陷附件想附上截图.视频,需要从手机把图片.视频发送到拷贝或发送到电脑,非常麻烦. 所以想到使用投屏软件,把手机的屏幕投屏到电脑,便可以直接在电脑上 ...

  6. WPF进阶技巧和实战02-布局

    窗体 无边框 窗体无边框(最大化及标题位置)WindowStyle="None" 窗体透明 AllowsTransparency="True",必须设置窗体无边 ...

  7. 智汀家庭云-开发指南Golang: 插件模块

    插件模块 当前所说的插件仅指设备类插件,插件为SA提供额外的设备发现和控制功能: 插件通过实现定义的grpc接口,以grpc服务的形式运行,提供接口给SA调用 插件同时需要http服务提供h5页面及静 ...

  8. 如何使用云效Flow做质量检测,保障高质量的交付速度

    使用云效Flow做质量检测,保障高质量的交付速度,云效「Flow」 提供代码扫描. 安全扫描和各种自动化测试能力,支持人工测试卡点.自动化验证卡点等多种质量红线,确保业务质量.云效流水线 Flow 流 ...

  9. docker 安装 wordpress,通过nginx反向代理,绑定域名,配置https

    假设docker已经安装好了,如果没有安装,可以照着 5分钟安装docker教程. 一. 下载镜像 默认下载最新版本,如果想指定对应版本,可以用冒号后加版本,像这样mysql:5.7: docker ...

  10. win32 TreeCtrl控件通知消息, LVN_SELCHANGED和LVN_ITEMCHANGED用法

    今天出了个奇怪的问题,当我在主窗口上创建一个用模板对话框的子窗口时, 在子窗口上放的TreeCtrl控件不响应LVN_SELCHANGED消息,也是晕死了, 我以为是消息捕获的问题,我在主窗口上也捕获 ...