mybatis實現MySQL數據庫的增刪改查之一

環境:java

  • 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 代碼和映射定義信息。mysql

  1. 每一個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲核心的。SqlSessionFactory 的實例能夠經過 SqlSessionFactoryBuilder 得到。而 SqlSessionFactoryBuilder 則能夠從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。這裏使用的是XML 配置文件。

MybatisUtils工具類.sql

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

}

在該項目的搭建中遇到的問題以下:apache

相關文章
相關標籤/搜索