第一个mybatis程序,实现增删改查CRUD

第一个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,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文件中的<properties></properties>中指定;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容