写点什么

第一个 mybatis 程序,实现 CRUD

用户头像
xiezhr
关注
发布于: 2021 年 03 月 16 日
第一个mybatis程序,实现CRUD

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 属性对应着接口,不能写错,<selec>标签表示是个查询语句。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,selectUserTue 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'}
复制代码

==扩展==

  • [x] 根据 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'}
复制代码
  • [x] 根据用户姓名密码查询用户信息

  • 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);    }
复制代码
  • [x] 模糊查询实现

  • 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 文件中的<properties></properties>中指定;


发布于: 2021 年 03 月 16 日阅读数: 9
用户头像

xiezhr

关注

把分享变成一种习惯,再小的帆也能远航 2021.03.01 加入

还未添加个人简介

评论

发布
暂无评论
第一个mybatis程序,实现CRUD