天天看點

Mybatis個人筆記

Mybatis官方文檔:

https://mybatis.org/mybatis-3/zh/index.html

1. 為什麼需要MyBatis

  • 幫助程式員将資料存入到資料庫中
  • 友善
  • 傳統的JDBC代碼太複雜了,簡化,架構,自動化
  • 不用MyBatis也可以,技術沒有高低之分
  • 優點:
    • 簡單易學
    • 靈活
    • sql和代碼的分離,提高了可維護性。
    • 提供映射标簽,支援對象與資料庫的orm字段關系映射
    • 提供對象關系映射标簽,支援對象關系組建維護
    • 提供xml标簽,支援編寫動态sql

2、第一個Mybatis程式

思路:搭建環境 --> 導入MyBatis --> 編寫代碼 --> 測試

.2.1導入maven依賴配置

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

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>
</dependencies>
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>      

2.2目錄結構

Mybatis個人筆記

2.3mybatis-config配置

<?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核心配置檔案-->
<configuration>
    <properties resource="db-config.properties"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/UserDao.xml" />
    </mappers>
</configuration>      

注意點:這裡url的value需要使用${jdbc.url}否則在編譯的時候回出現錯誤,value值回自動替換成www.example.com

2.4 db-config.properties配置

====      

2.5 編寫mybatisUtil工具類

package com.zhangpan.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 org.apache.ibatis.session.SqlSessionManager;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtil {

    static SqlSessionFactory sqlSessionFactory = null;

    static {

        try {

            String MybatisConfig = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(MybatisConfig);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static SqlSession getSqlSession(){

        return sqlSessionFactory.openSession();
    }

}      

2.6編寫dao接口

package com.zhangpan.mapper;

import com.zhangpan.pojo.User;

import java.util.List;

public interface UserDao {

    public List<User> getUserList();

    public void addUser(User user);
}      

2.7編寫接口實作UserDao.xml(由原來的接口實作類變成xml配置檔案)

<?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">

<!--namespace=綁定一個指定的Dao/Mapper接口-->
<mapper namespace="com.zhangpan.mapper.UserDao">
    <select id="getUserList" resultType="com.zhangpan.pojo.User">
    select * from USER
  </select>

    <select id="addUser" parameterType="com.zhangpan.pojo.User">
        insert into USER (username,sex,birthday,address) value (#{username},#{sex},#{birthday},#{address})
    </select>
</mapper>      

2.8 Junit測試

package com.zhangpan;

import com.zhangpan.mapper.UserDao;
import com.zhangpan.pojo.User;
import com.zhangpan.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.Date;
import java.util.List;

public class test {


    @Test
    public void test1(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();

        UserDao userDao = sqlSession.getMapper(UserDao.class);

        List<User> userList = userDao.getUserList();
        for (User user:userList){

            System.out.println(user);
        }

        sqlSession.close();
    }


    @Test
    public void addUser_test(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        UserDao userDao = sqlSession.getMapper(UserDao.class);

        User user = new User();

        user.setUsername("關二爺");
        user.setSex("1");
        user.setBirthday(new Date());
        user.setAddress("光棍屯18号");

        userDao.addUser(user);

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

    }
}      

3、通過配置檔案實作CURD

1. namespace**

namespace中的包名要和Dao/Mapper接口的包名一緻

選擇,查詢語句;

  • id:就是對應的namespace中的方法名;
  • resultType : Sql語句執行的傳回值;
  • parameterType : 參數類型;
import com.zhangpan.pojo.User;
import org.omg.CORBA.PUBLIC_MEMBER;

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

public interface UserDao {

    public List<User> getUserList();

    public void addUser(User user);

    public void addUserMap(Map<String,Object> map);

    public List<User> getUserLike(String username);

    public List<User> getUserByLimit(Map<String,Integer> map);

    public List<User> getUserByRowBounds();
}      

userDao.xml檔案

<?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">

<!--namespace=綁定一個指定的Dao/Mapper接口-->

<mapper namespace="com.zhangpan.mapper.UserDao">

    <resultMap id="UserMap" type="User">


        <result column="username" property="username"/>
        <result column="address" property="address"/>

    </resultMap>

    <select id="getUserList" resultType="User">
        select * from USER
     </select>

    <select id="addUser" parameterType="User">
        insert into USER (username,sex,birthday,address) value (#{username},#{sex},#{birthday},#{address})
    </select>

    <select id="addUserMap" parameterType="map">
        insert into USER (username,sex,birthday,address) value (#{username},#{sex},#{birthday},#{address})
    </select>

    <select id="getUserLike" parameterType="String" resultMap="UserMap">
        select * from USER where username like "%"#{username}"%"
    </select>
    
    <select id="getUserByLimit" parameterType="map" resultMap="UserMap">
        select * from user limit #{startIndex},#{pageSize}
    </select>

    <select id="getUserByRowBounds" resultMap="UserMap">
        select * from user
    </select>
</mapper>      

測試類

package com.zhangpan;

import com.zhangpan.mapper.UserDao;
import com.zhangpan.pojo.User;
import com.zhangpan.utils.MybatisUtil;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class test {

    Logger logger = Logger.getLogger(test.class);

    @Test
    public void test1(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();

        UserDao userDao = sqlSession.getMapper(UserDao.class);

        List<User> userList = userDao.getUserList();
        for (User user:userList){

            System.out.println(user);
        }

        sqlSession.close();
    }


    @Test
    public void addUser_test(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        UserDao userDao = sqlSession.getMapper(UserDao.class);

        User user = new User();

        user.setUsername("關二爺");
        user.setSex("1");
        user.setBirthday(new Date());
        user.setAddress("光棍屯18号");

        userDao.addUser(user);

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

    }

    @Test
    public void addUser_map(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);

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

        map.put("username","python1223423");
        map.put("sex","0");
        map.put("birthday",new Date());
        map.put("address","yangguangdadao 13hao");

        userDao.addUserMap(map);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void getUserLike(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        List<User> users = userDao.getUserLike("python");

        for (User user:users){

            System.out.println(user);
        }

        logger.info("info:穩得一匹");
        sqlSession.close();
    }



    @Test
    public void getUserByLimit(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        HashMap<String,Integer> map = new HashMap<String, Integer>();

        map.put("startIndex",0);
        map.put("pageSize",3);

        List<User> list = userDao.getUserByLimit(map);

        for (User user:list){

            System.out.println(user);
        }
    }

    @Test
    public void getUserByRowBounds(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();

        RowBounds rowBounds = new RowBounds(2,2);

        List<User> userList = sqlSession.selectList("com.zhangpan.mapper.UserDao.getUserByRowBounds",null,rowBounds);
        for (User user:userList){

            System.out.println(user);
        }

    }



}