Mybatis入門、配置及搭建增刪改查demo

Mybatis

1. 簡介

1.1 什麼是Mybatis

​ MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。

配置Mybatis:

  1. mybatis-x.x.x.jar 文件置於類路徑(classpath)中即可。

  2. 如果使用Maven構建項目則將依賴配置到pom.xml文件中。

    依賴搜索網站:

    https://mvnrepository.com/search?q=mybatis

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    
  3. 官方文檔:https://mybatis.org/mybatis-3/zh/getting-started.html

1.2 持久化

數據持久化

  • 持久化就是將程序的數據在持久狀態和瞬時狀態轉化的過程。
  • 內存:斷電即失。
  • 數據庫(jdbc),io文件持久化。

爲什麼需要持久化?

由於內存斷電即失,有些對象,不能讓他丟掉。

1.3 持久層

Dao層,Service層,Controller層

  • 完成持久化工作的代碼塊
  • 曾界限十分明細。

2.第一個Mybatis程序

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

2.1 搭建環境

1.搭建數據庫

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PXGZ5r4x-1591430014169)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200409192623831.png)]

  1. 創建項目
  2. 添加依賴
<!--導入依賴-->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2.2 創建模塊(配置)

新建一個moudle

  1. 編寫mybatis核心配置文件

    mybatis-config.xml

    <?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>
        <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=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
    <!--    每個Mapper.xml都需要在Mybatis核心配置文件中註冊-->
        <mappers>
            <mapper resource="com/dao/UserDao.xml"/>
        </mappers>
    </configuration>
    
  2. 編寫mybatis工具類

    MybatisUtils

    package com.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;
    
    //sqlSessionFactory
    public class MybatisUtils {
        private  static SqlSessionFactory sqlSessionFactory;
        static {
            try {
                // 第一步 必備
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。
        // SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。
        // 你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。例如:
        public  static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    }
    
    

2.3 編寫代碼

  1. 實體類

    package com.pojo;
    public class User {
        private int id;
        private String name;
        private  String pwd;
        public User(){
        }
        @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;
        }
    }
    
    
  2. dao接口

    Userdao.java

    package com.dao;
    import com.pojo.User;
    import java.util.List;
    public interface UserDao {
        List<User> getUserList();
    }
    
    
  3. 實現接口的類由UserDaoimp轉換成爲一個.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.dao.UserDao">
    <!--    select查詢語句  resultType返回結果集-->
        <select id="getUserList" resultType="com.pojo.User">
            select * from mybatis.user
        </select>
    </mapper>
    

2.3 測試

package com;

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

import java.util.List;

public class UserDaoTest {
    @Test
    public void test(){
        //第一步 通過MybatisUtils工具類獲取SqlSession對象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        //執行sql
        UserDao userDao=sqlSession.getMapper(UserDao.class);
        List<User> userList=userDao.getUserList();
        //遍歷user表
        for (User user:userList){
            System.out.println(user);
        }
        //關閉 sqlSession
        sqlSession.close();
    }
}

2.4 常見錯誤

錯誤1:

org.apache.ibatis.binding.BindingException: 

Type interface com.dao.UserDao is not known to the MapperRegistry.

原因:沒有在Mybatis核心配置文件

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

錯誤2:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-X15LW9BN-1591430014172)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410135615229.png)]

java.lang.ExceptionInInitializerError
at com.UserDaoTest.test(UserDaoTest.java:15)

原因:在maven 中沒有xml文件沒有生效(在target/classes目錄中沒有此配置文件)

解決:在resources目錄下 創建一個跟java目錄一樣的文件夾把xml文件放在resources的子目錄下

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sSuLhOLR-1591430014173)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410135933351.png)]

此時會自動在target/classes目錄中生成該配置文件

注意3:

namespace 中 的包名要跟Dao/Mapper中的接口包名一致。

2.5Mybatis 環境搭建總結

搭建環境–>導入Mybatis–>編寫代碼–>測試

搭建環境

  1. 搭建數據庫

  2. 創建項目(maven)

  3. 在pom.xml中添加依賴

    依賴搜索網站:https://mvnrepository.com/search?q=mybatis

導入Mybatis

  1. 創建一個新的模塊
  2. 創建mybatis核心配置文件 mybatis-config.xml
  3. 編寫mybatis工具類

編寫代碼

  1. 實體類創建
  2. dao層接口
  3. 實現dao層接口的配置文件(實現接口的類由UserDaoimp轉換成爲一個.xml文件)

測試類及常見問題

  1. 測試類 中不要忘記關閉流
  2. .xml文件可能會存在不生效的問題,解決:在resources目錄下 創建一個跟java目錄一樣的文件夾把xml文件放在resources的子目錄下

3.增刪改查

增刪改需要提交事務

  • namespace 綁定一個對應的dao/mapper接口

  • select查詢語句 resultType返回結果集

  • id:對應的namespace中的方法名;

  • resultType :sql語句執行的返回類型

  • parameterType :參數類型

1.UserDao/Mapper接口類:

UserDao.java

public interface UserDao {
    List<User> getUserList();
    //查詢
    User getUserById(int id);
    //增加
    int addUser(User user);
    //刪除
    int deleteUser(int id);
    //修改
    int updateUser(User user);
}

2.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.dao.UserDao">
<!--    select查詢語句  resultType返回結果集-->
    <select id="getUserList" resultType="com.pojo.User">
        select * from mybatis.user
    </select>
<!--    根據id查詢-->
    <select id="getUserById" parameterType="int" resultType="com.pojo.User">
        select * from mybatis.user where id = #{id};
    </select>
<!--    增加一個用戶-->
    <insert id="addUser" parameterType="com.pojo.User">
        insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd});
    </insert>
<!--    修改一個用戶-->
    <update id="updateUser" parameterType="com.pojo.User">
       update mybatis.user set name=#{name},pwd=#{pwd} where id= #{id};
    </update>
<!--    刪除一個用戶-->
    <delete id="deleteUser" parameterType="com.pojo.User">
        delete from mybatis.user where id=#{id};
    </delete>
</mapper>

3.測試類

public class UserDaoTest {

    //查詢用戶信息
    @Test
    public void test(){
        //第一步 通過MybatisUtils工具類獲取SqlSession對象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        try {
            //執行sql
            UserDao userDao=sqlSession.getMapper(UserDao.class);
            List<User> userList=userDao.getUserList();
            //遍歷user表
            for (User user:userList){
                System.out.println(user);
            }
        }
        finally {
            //關閉 sqlSession
            sqlSession.close();
        }
    }


    //根據id查詢用戶信息
    @Test
    public void getUserByid(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);

        User user = dao.getUserById(2);
        System.out.println(user);
        sqlSession.close();
    }


    //增加用戶
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);

        int add = dao.addUser(new User(4, "張三", "12345"));
        //提交事務
        sqlSession.commit();
        sqlSession.close();
    }


    //刪除用戶
    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);

        int i = dao.deleteUser(3);
        sqlSession.commit();
        sqlSession.close();
    }


    //修改用戶信息
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);
        dao.updateUser(new User(2,"李四","12345"));
        sqlSession.commit();
        sqlSession.close();


    }
}

4.萬能Map

如果實體類或者數據庫中的表,字段或者參數過多,應考慮使用Map!

用Map 避免了用實體類(實體類會調用構造方法,所有傳遞參數是固定的),即想傳幾個參數就傳遞幾個參數

接口:

int addUser2(Map<String,Object> map);

xml:

<!--對象中的屬性,可以直接取出來 傳遞map的key-->
<insert id="addUser2" parameterType="map">
    insert into mybatis.user(id,name) values (#{id},#{name});
</insert>

測試類:

//使用map增加
@Test
public void mapAddUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao dao = sqlSession.getMapper(UserDao.class);

    Map<String,Object>map=new HashMap<String, Object>();
    map.put("id",6);
    map.put("name","map增加");
    dao.addUser2(map);
    sqlSession.commit();
    sqlSession.close();
}

5.模糊查詢

  1. java代碼執行的時候,傳遞通配符
  2. sql拼接的時候寫

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9McUyAmB-1591430014176)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410200922863.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZXQAgBqd-1591430014177)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410201128846.png)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章