mybatis实现MySQL数据库的增删改查之一

环境:

  • jdk1.8
  • mysql5.7
  • maven3.6.0
  • IDEA

什么是mybatis框架?

  • MyBatis 是一款优秀的持久层框架,
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。2013年11月迁移到Github

下面开始搭建

  1. sql文件如下:
/*
SQLyog Ultimate v13.1.1 (64 bit)
MySQL - 5.7.31-log : Database - mybatis
*********************************************************************
*/

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `mybatis`;

/*Table structure for table `user` */

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;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`pwd`) values 
(1,'qijian','123'),
(2,'Tom','123'),
(3,'qijian','111');
  1. 使用 Maven 来构建项目。pom.xml文件代码如下。注意我搭建该项目是mybatis-study的子项目。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mybatis-study</artifactId>
        <groupId>com.qijijan</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mybatis-01</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
    </dependencies>

    <build>
      <!--Maven静态资源过滤问题-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

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

</project>
  1. XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
<?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=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="****"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/qijian/dao/UserMapper.xml"/>
    </mappers>

</configuration>

注意: XML 头部的声明,它用来验证 XML 文档的正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。

  1. 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。这里使用的是XML 配置文件。

MybatisUtils工具类.

package com.qijian.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 {
   private static SqlSessionFactory sqlSessionFactory;
   private static String resource = "mybatis-Config.xml";
   private static InputStream inputStream;

   static {

       //使用mybatis的第一步:获取 SqlSessionFactory对象
       try {
           inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
        //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
        // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
     public static SqlSession getSqlSession() throws IOException {
         return sqlSessionFactory.openSession();
        }

}
  1. 实体类user如下
package com.qijian.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }
}
  1. UserMapper类
package com.qijian.dao;

import com.qijian.pojo.User;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    //查询所有的用户
    //@Select("SELECT * FROM mybatis.user WHERE id = #{id}")
    List<User> getUserList();

    //通过id查询用户
    User getUserById(int id);

    //增加用户
    int addUser(User user);

    //添加用户 使用Map集合
    int addUserByMap(Map<String,Object> map);

    //修改用户
    int updateUser(User user);

    //删除用户
    void deleteUser(int id);
}

  1. 基于 XML 映射语句 在命名空间 “com.qijian.dao.UserMapper” 中定义如下 的映射语句(例如名为 “getUserList”),这样你就可以用全限定名 “com.qijian.dao.UserMapper.getUserList” 来调用映射语句了
<?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.qijian.dao.UserMapper">
    <select id="getUserList" resultType="com.qijian.pojo.User">
    select * from mybatis.user
    </select>

    <select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User">
        select *from mybatis.user where id = #{id};
    </select>

    <insert id="addUser" parameterType="com.qijian.pojo.User">
        insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd});
    </insert>

    <insert id="addUserByMap" parameterType="Map">
        insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd});
    </insert>

    <update id="updateUser" parameterType="com.qijian.pojo.User">
        update mybatis.user
        set name = #{name},pwd = #{pwd}
        where id=#{id};
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user  where id=#{id};
    </delete>

</mapper>

注意:
对命名空间的一点补充
在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。
命名空间的作用有两个,一个是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。
命名解析:为了减少输入量,MyBatis 对所有具有名称的配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名。
8. 测试类

package com.qijian.dao;

import com.qijian.pojo.User;
import com.qijian.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserMapperTest {
    @Test
    public void testSelect() throws IOException {
        //第一步:获取sqlsesion对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //执行
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       List<User> userList =  userMapper.getUserList();
       for(User user : userList){
           System.out.println(user);
       }
       //关闭资源
        sqlSession.close();
    }

    @Test
    public void testSelectById() throws IOException {
        //获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //执行
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user = userMapper.getUserById(1);
        System.out.println(user);

        sqlSession.close();
    }

//    注意增删改差需要提交事务
    @Test
    public void testAddUser() throws IOException {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        int res = userMapper.addUser(new User(7,"herry","123"));
        if (res>0){
            System.out.println("插入成功!");
        }

        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testUpdateUser() throws IOException {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        sqlSession.getMapper(UserMapper.class).updateUser(new User(3,"qijian","111"));

        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testDeleteUser() throws IOException {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

       userMapper.deleteUser(7);

        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testAddByMap() throws IOException {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //空过Map可以很方便的插入数据
        // 假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当使用Map

        Map<String,Object> map = new HashMap<String, Object>();

        map.put("id",8);
        map.put("name","wangwu");
        map.put("pwd","1234");
        userMapper.addUserByMap(map);

        sqlSession.commit();
        sqlSession.close();

    }

//    Map中传递参数,直接在SQL中取出key
//    对象传递参数,直接在SQL中取对象的属性
//    只有一个基本类型参数的情况下,可以直接在SQL中取到
//    多参数用Map

}

在该项目的搭建中遇到的问题如下:

posted @ 2020-12-29 19:40  柒间  阅读(627)  评论(0编辑  收藏  举报