mybatis 介绍

  • mybatis 本是apache的一个开源项目iBatis,

    2010年这个项目由apache迁移到了googlecode,并且改名为MyBatis,2013年11月迁移到Github。
  • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(普通的 Java对象)映射成数据库中的记录

Mybatis官方文档 :

http://www.mybatis.org/mybatis-3/zh/index.html

GitHub :https://github.com/mybatis/mybatis-3

代码演示

  1. 所需环境
  • jdk1.8.0_91
  • mysql-5.7.29
  • apache-maven-3.6.3
  1. 创建数据库
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');
  1. 使用idea创建项目并导入导入mybatis所需jar包
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--mybatis包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--junit 测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> </dependencies>
  1. 编写mybatis核心配置文件

该配置文件主要是配置连接mysql的基本信息及注册mapper(具体配置参考官方文档)

<?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?useUnicode=true&amp;characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="com/xiezhr/Dao/UserMapper.xml"></mapper>
</mappers>
</configuration>
  1. 编写mybatis工具类

查看官方文档,我们这里要封装一个工具类生成SqlSession对象,SqlSession用于后面的执行sql

package com.xiezhr.util;

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 MysqlUtil { private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
} }
  1. 创建对应数据库表的实体类

各个属性得命名必须与数据库字段一一对应,具体如下所示,数据库对应字段为id,name,pwd

package com.xiezhr.pojo;

public class User {
private int id;
private String name;
private String pwd; public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public User() {
} public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
  1. 编写Mapper接口

该接口对应原来的dao,具体代码如下

package com.xiezhr.dao;

import com.xiezhr.pojo.User;

import java.util.List;

public interface UserMapper {
List<User> getUserList();
}
  1. 编写Mapper.xml 文件

由于我们使用了mybatis,所以这的xml文件相当于我们原来dao得实现类daoimpl。namespace属性对应着接口,不能写错,标签表示是个查询语句。id 属性对应着接口的方法,result Type代表返回得类型,即对应这pojo实体。具体代码如下

<?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.xiezhr.dao.UserMapper">
<select id="getUserList" resultType="com.xiezhr.pojo.User">
select * from mybatis.user;
</select>
</mapper>
  1. 到这一步我们第一个mybatis实现查询就基本大功告成了,接下来就要编写测试类测试我们写得代码
package com.xiezhr.dao;

import com.xiezhr.pojo.User;
import com.xiezhr.util.MysqlUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import java.util.List; public class TestUserDao {
@Test
public void selectUser(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList(); for (User user : userList) {
System.out.println(user);
} }
}

经过测试后输出测试结果

D:\Java\jdk1.8.0_91\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54576:D:\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JetBrains\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JetBrains\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\Java\jdk1.8.0_91\jre\lib\charsets.jar;D:\Java\jdk1.8.0_91\jre\lib\deploy.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_91\jre\lib\javaws.jar;D:\Java\jdk1.8.0_91\jre\lib\jce.jar;D:\Java\jdk1.8.0_91\jre\lib\jfr.jar;D:\Java\jdk1.8.0_91\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_91\jre\lib\jsse.jar;D:\Java\jdk1.8.0_91\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_91\jre\lib\plugin.jar;D:\Java\jdk1.8.0_91\jre\lib\resources.jar;D:\Java\jdk1.8.0_91\jre\lib\rt.jar;F:\workspace_idea\Mybatis-test\mybatis-01\target\test-classes;F:\workspace_idea\Mybatis-test\mybatis-01\target\classes;D:\maven\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;D:\maven\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\maven\repository\junit\junit\4.12\junit-4.12.jar;D:\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.xiezhr.dao.TestUserDao,selectUser
Tue Apr 14 22:54:48 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
User{id=1, name='张三', pwd='322334'}
User{id=2, name='李四', pwd='123456'}
User{id=3, name='王五', pwd='123456'}

扩展

  • 根据id查询用户
  • 1.在UserMapper接口中添加相应的方法selectUserById(id)
public interface UserMapper {
//根据ID查询用户
User selectUserById(int id);
}
  • 2.在UserMapper.xml 中添加相应select 语句
<mapper namespace="com.xiezhr.dao.UserMapper">

    <select id="selectUserById" parameterType="int" resultType="com.xiezhr.pojo.User">
select * from mybatis.user where id = #{id}
</select>
</mapper>
  • 3.添加测试类
@Test
public void selectUserByid(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
}

测试通过

Wed Apr 15 23:08:00 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
User{id=1, name='张三', pwd='322334'}
  • 根据用户姓名密码查询用户信息
  • 1.在UserMapper接口中添加方法
public interface UserMapper {
//根据用户名密码查询用户信息
User selectUserByNP(@Param("name") String name,@Param("pwd") String pwd);
}
  • 2.在UserMapper.xml 中添加select语句
<mapper namespace="com.xiezhr.dao.UserMapper">
<select id="selectUserByNP" resultType="com.xiezhr.pojo.User">
select * from mybatis.user where name=#{name} and pwd=#{pwd}
</select>
</mapper>
  • 3.添加测试类
    @Test
public void selectUserByNP(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserByNP("张三","322334");
System.out.println(user); }

测试成功

Wed Apr 15 23:24:02 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
User{id=1, name='张三', pwd='322334'}

以上通过用户名和密码查询用户,传参还可以通过万能的map实现,具体代码如下

  • 1.向UserMapper接口中添加方法
public interface UserMapper {
//根据用户名和密码查询用户信息
User queryUserByNP(Map<String,Object> map);
}
  • 2.向UserMapper.xml 中添加select语句,其中参数类型为map
<mapper namespace="com.xiezhr.dao.UserMapper">

    <select id="queryUserByNP" parameterType="map" resultType="com.xiezhr.pojo.User">
select * from mybatis.user where name=#{name} and pwd=#{pwd}
</select>
</mapper>
  • 添加测试,在使用过程中,map的key对应着UserMapper.xml中取值,map在put值时候没有先后顺序
 @Test
public void queryUserByNp(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","张三");
map.put("pwd","322334");
User user = mapper.queryUserByNP(map);
System.out.println(user);
}
  • 模糊查询实现
  • 1.在Java代码中添加sql通配符
string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”>
select * from foo where bar like #{value}
</select>
  • 2.在sql语句中拼接通配符,会引起sql注入
string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>

华丽的分割线

接下来我们分别来实现insert、update、delete

insert

  1. 在之前编写的UserMapper 接口中添加增加方法
public interface UserMapper {
//添加一条用户信息
int addUser(User user);
}

2.在UserMapper.xml 中写insert 语句

<insert id="addUser" parameterType="com.xiezhr.pojo.User">
insert into mybatis.user values(#{id},#{name},#{pwd})
</insert>
  1. 添加测试类

    insert、update、delete 一定要提交事务,千万千万不能忘记了
@Test
public void addUser(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(4, "大头儿子", "123456");
mapper.addUser(user);
sqlSession.commit(); //增删改一定要提交事务
sqlSession.close();
}

update

  1. 在之前编写的UserMapper 接口中添加update方法
public interface UserMapper {
//修改一条记录
int updateUserById(int id);
}

2.在UserMapper.xml 中写insert 语句

<update id="updateUserById" parameterType="int">
update mybatis.user set name='小头爸爸' where id=#{id}
</update>
  1. 添加测试类

    insert、update、delete 一定要提交事务,千万千万不能忘记了
    @Test
public void updateUserById(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUserById(4);
sqlSession.commit(); //增删改一定要提交事务
sqlSession.close();
}

delete

  1. 在之前编写的UserMapper 接口中添加delete方法
public interface UserMapper {
//根据ID删除一条记录
int deleteUserById(int id);
}
}

2.在UserMapper.xml 中写insert 语句

<delete id="deleteUserById" parameterType="int">
delete from mybatis.user where id=#{id}
</delete>
  1. 添加测试类

    insert、update、delete 一定要提交事务,千万千万不能忘记了
    @Test
public void deletUserById(){
SqlSession sqlSession = MysqlUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUserById(4);
sqlSession.commit(); //增删改一定要提交事务
sqlSession.close();
}

注意

  • 所有的insert、update、delete 必须要提交事务
  • 接口中所有的普通参数尽量写上@Param 参数,尤其是多个参数的时候一定要写上
  • 有些时候由于业务需要需要可通过map传值
  • 为了规范在sql配置文件中即本例的UserMapper.xml 中select inset delete update 尽量写上Parameter参数和resultType

可能出现问题说明:Maven静态资源过滤问题

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

在静态资源的过滤中,基本的元素有三种:

  • directory:指定资源所在的目录,这个目录的路径是相对于pom.xml文件;
  • includes:指定要包含哪些文件,其中包括inlcude子节点来指定匹配的模式;
  • excludes:指定要排除哪些文件,其中包括exclude子节点来指定匹配的模式;
  • filtering:指定哪些文件需要过滤,这个过滤的目的是为了替换其中的占位符${},其中的占位符属性在pom.xml文件中的中指定;

第一个mybatis程序,实现增删改查CRUD的更多相关文章

  1. 基于SSM之Mybatis接口实现增删改查(CRUD)功能

    国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...

  2. Mybatis学习——基本增删改查(CRUD)

    Eclipse+Mybatis+MySql 1.所需jar 2.项目目录 3.源代码 package com.zhengbin.entity; public class Student { priva ...

  3. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  4. 一个使用MVC3+NHibernate “增删改查” 的项目

    一个使用MVC3+NHibernate “增删改查” 的项目  前言: 谈到NHibernate大伙并不陌生,搞Java的更是清楚,Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框 ...

  5. Mybatis入门之增删改查

    Mybatis入门之增删改查 Mybatis如果操作成功,但是数据库没有更新那就是得添加事务了.(增删改都要添加)----- 浪费了我40多分钟怀疑人生后来去百度... 导入包: 引入配置文件: sq ...

  6. MyBatis -- 对表进行增删改查(基于注解的实现)

    1.MyBatis对数据库表进行增/删/改/查 前一篇使用基于XML的方式实现对数据库的增/删/改/查 以下我们来看怎么使用注解的方式实现对数据库表的增/删/改/查 1.1  首先须要定义映射sql的 ...

  7. Mybatis实现简单增删改查

    Mybatis的简单应用 学习内容: 需求 环境准备 代码 总结: 学习内容: 需求 使用Mybatis实现简单增删改查(以下是在IDEA中实现的,其他开发工具中,代码一样) jar 包下载:http ...

  8. 【讲义提纲】以一个实战新闻cms增删改查demo为例,给学院国创队伍培训php

    PHP实战基础——以一个新闻cms的增删改查为例 一.        环境配置 二.        数据库创建 三.        增删改查demo 连接数据库 <?php $link=mysq ...

  9. Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)

    JEECG 智能开发平台. 开发模式由代码生成器转变为Online Coding模式                      (通过在线配置实现一个表模型的增删改查功能,无需一行代码,支持用户自定义 ...

  10. Spring Boot 使用Mybatis注解开发增删改查

    使用逆向工程是遇到的错误 错误描述 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): c ...

随机推荐

  1. java中String为什么设计成不可变对象

    设计成不可变对象为了安全和高效 1.安全方面:举例说明:在文件操作或反射操作的时候需要传递字符串,如果是设计成可变的那么就会造成安全问题 2.高效:举例说明 字符串源码中会将hashcode缓冲下来, ...

  2. 全新TI AM62xx系列核心板上市,小小身板蕴藏巨大势能!

    2011年TI推出AM335x,成为了此后市场上最受欢迎的通用工业级ARM处理器,并广泛应用于工业HMI, 医疗电子,机器人,能源,汽车等领域.随着工业4.0的发展,HMI人机交互.工业工控.医疗等领 ...

  3. Ubuntu NVIDIA显卡驱动+CUDA安装(多版本共存)

    NVIDIA显卡驱动 1.禁止集成的nouveau驱动 solution 1 (recommand) # 直接移除这个驱动(备份出来) mv /lib/modules/3.0.0-12-generic ...

  4. Pandas嵌套词典解析或取值

    # tribe列只保留name 值 df['tribe']=df['tribe'].apply(lambda x:eval(x)['name']) # tribe 列全部项目展开 df=df['con ...

  5. 一个struts1框架的小案例

    具体如下: <span style="font-size:18px;"><?xml version="1.0" encoding=" ...

  6. 【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现

    [桥接设计模式详解]Java/JS/Go/Python/TS不同语言实现 简介 桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的 ...

  7. 为什么 C# 可能是最好的第一编程语言

    纵观神州大地,漫游中华互联网,我看到很多人关注为什么你应该开始学习JavaScript做前端,而对blazor这样的面向未来的框架有种莫名的瞧不起,或者为什么你应该学习Python作为你的第一门编程语 ...

  8. cost function 成本函数

    cost function 成本函数 cost function-成本函数 1.目标 :实现和探索具有一个变量的线性回归的成本函数. import numpy as np %matplotlib wi ...

  9. 使用 ApplicationContextAware 定义 SpringContextHolder 类

    需求:使用 @autowired注入一些对象,但发现不可以直接使用@Autowired,因为方法是static的,要使用该方法当前对象也必须是static,正常情况下@Autowired无法注入静态的 ...

  10. 【故障公告】数据库服务器 CPU 近 100% 造成全站故障,雪上加霜难上加难的三月

    数据库服务器 CPU 近 100% 问题几乎每年都要发生一次,上次发生在去年1月31日,每次都是通过主备切换或者重启实例解决,数据库服务用的是阿里云 RDS SQL Server 2016 标准版. ...