天天看點

Mybatis學習筆記

目錄

  • MyBatis概述
  • 建立項目
  • 建立一個子產品
  • 測試
  • CRUD
    • 1.namespace
    • 2.select
    • 3.insert
    • 4.update
    • 5.delete
  • 萬能的map
  • 模糊查詢怎麼實作
  • 2.環境配置(environments)
  • 3.屬性(properties)
  • 類型别名(typeAliases)
  • 分頁
    • 1.使用limit分頁
  • 使用注解開發

MyBatis是一個優秀的持久層架構,它對jdbc的操作資料庫的過程進行封裝,使開發者隻需要關注SQL本身,而不需要花費精力去處理例如注冊驅動、建立connection、建立statement、手動設定參數、結果集檢索等jdbc繁雜的過程代碼。

1.建立一個普通的maven項目

2.删除src目錄

3.導入maven依賴

1.編寫mybatis的核心配置檔案

<?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=true&amp;useUnicode=true&amp;characterEncoding=UTF-8/"/>
                <property name="username" value="root"/>
                <property name="password" value="fa6298500"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
           

2.編寫mybatis工具類

//mybatis工具類
//sqlSessionFactory --> sqlSession
public class MybatisUtils
{
    private static SqlSessionFactory sqlSessionFactory;
    static
    {
        try
        {
            //使用mybatis獲得sqlSessionFactory對象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    //既然有了sqlSessionFactory,就可以從中獲得sqlSession執行個體了
    //sqlSession完全包含了面向資料庫執行SQL指令所需的所有方法

    public static SqlSession getSqlSession()
    {
        return sqlSessionFactory.openSession();
    }
}
           

3.編寫實體類

package com.pojo;

//資料庫實體類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User
{
    private int id;
    private String name;
    private String pwd;
}
           

4.Dao接口

public interface UserDao
{
    List<User> getUserList();
}
           

5.接口實作類

<?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查詢語句 -->
    <select id="getUserList" resultType="com.pojo.User">
        select * from mybatislearn.user;
    </select>
</mapper>
           

org.apache.ibatis.binding.BindingException: Type interface com.dao.UserMapper is not known to the MapperRegistry.

錯誤原因:每一個mapper檔案都需要在Mybatis核心配置檔案中注冊

java.lang.ExceptionInInitializerError

錯誤原因:maven的約定大于配置

解決方法:

在build中配置resources,來防止資源導出失敗的問題

<build>       
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
</build>
           

這段代碼放入兩個pom.xml中

namespace中的包名要與Dao/mapper接口的包名一緻

選擇,查詢語句;

  • id:對應namespace中的方法名
  • resultType:sql語句執行的傳回值
  • parameterType:參數類型

1.編寫接口

//查詢全部使用者
    List<User> getUserList();
           

2.編寫對應的mapper中的sql語句

<select id="getUserList" resultType="com.pojo.User">
        select * from mybatislearn.user;
    </select>
           

3.測試

@Test
    public void test()
    {
        try (SqlSession sqlSession = MybatisUtils.getSqlSession())
        {
            //第一步,擷取SqlSession對象
            //第二步,執行sql
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
        }
    }
           

<!--對象中的屬性,可以直接取出來 -->
    <insert id = "addUser" parameterType = "com.pojo.User">
        insert into mybatislearn.user(id, name, pwd) values(#{id},#{name},#{pwd});
    </insert>
           

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

<delete id = "deleteUser" parameterType = "com.pojo.User">
        delete from mybatislearn.user where id = #{id};
    </delete>
           

注意點

  • 增删改需要送出事務
sqlSession.commit();
           

假設我們的實體類或者資料庫中的表,字段或者參數過多,我們應當考慮使用map

int addUser2(Map<String, Object> map);
           
<insert id = "addUser2" parameterType = "map">
        insert into mybatislearn.user(id,pwd) values (#{userID},#{passWord});
    </insert>
           
@Test
    public void getUserById2()
    {
        try(SqlSession sqlSession = MybatisUtils.getSqlSession())
        {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<>();
            map.put("mima","123456");
            userMapper.getUserById2(map);
            sqlSession.commit();

        }

    }
           

Map傳遞參數,直接在sql中取出key即可(parameterType = "map")

對象傳遞參數,直接在sql中取對象的屬性即可(parameterType = "Object")

隻有一個參數的情況下,可以直接在sql中取到!

多個參數用map或者注解

1.Java代碼執行的時候,傳遞通配符% %

List<User> userList= userMapper.getUserLike("%李%");
           

2.在sql拼接中使用通配符!

select * from mybatislearn.user where name like "%"#{value}"%";
           

MyBatis可以配置成适應多種環境

不過要記住:盡管可以配置多個環境,但每個SqlSessionFactory執行個體隻能選擇一種環境

預設事務管理器:JDBC 連接配接池:POOLED

我們可以通過properties來實作引用配置檔案

這些屬性都是可外部配置且可動态替換的,既可以在典型的Java屬性檔案中配置,

也可通過properties元素的子元素來傳遞【db.properties】

編寫一個配置檔案

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
           

在核心配置檔案中映入

<!-- 引入外部配置檔案 -->
    <properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="fa6298500"/>
    </properties>
           
  • 可以直接引入外部檔案
  • 可以在其中增加一些屬性配置
  • 如果兩個檔案有同一個字段,優先使用外部配置檔案的!

類型别名可為 Java 類型設定一個縮寫名字。 它僅用于 XML 配置,意在降低備援的全限定類名書寫

<!-- 可以給實體類起别名 -->
    <typeAliases>
        <typeAlias type = "com.pojo.User" alias="User"/>
    </typeAliases>
           

也可以指定一個包名,MyBatis會在包名下面搜尋需要的Java Bean,比如:掃描實體類的包,它的預設别名就為這個類的類名,首字母小寫。

<!-- 可以給實體類起别名 -->
    <typeAliases>
        <package name = "com.pojo"/>
    </typeAliases>
           

在實體類比較少的時候,使用第一種方式

如果實體類十分多,建議使用第二種

第一種可以DIY别名,第二種不行,如果非要改,需要在實體上添加注解

  • 減少資料的處理量

文法:select * from user limit startIndex,pageSize;
           

使用mybatis實作分頁,核心sql

1.接口

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

2.Mapper.xml

<select id="getUserByLimit" parameterType="map" resultType="User">
        select * from mybatislearn.user limit #{startIndex},#{pageSize};
    </select>
           
public void getUserByLimit()
    {
        try(SqlSession sqlSession = MybatisUtils.getSqlSession())
        {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<>();
            map.put("startIndex",0 );
            map.put("pageSize",2);
            List<User> userList = userMapper.getUserByLimit(map);
            for (User user : userList)
            {
                System.out.println(user);
            }
        }
    }
           

1.注解在接口上實作

@Select("select * from mybatislearn.user")
    List<User> getUsers();
}
           

2.需要在核心配置檔案中綁定接口

<!--綁定接口 -->
    <mappers>
        <mapper class="com.dao.UserMapper"/>
    </mappers>
           

SpringBoot整合MyBatis

整合包

mybatis-spring-boot-starter

1.導入包

2.配置檔案

3.mybatis配置

4.編寫sql

5.service層調用dao層

6.controller調用service層

總結

整體來說Mybatis的學習難度不大,and用XML寫sql真的香啊!不用頻繁修改代碼裡的sql語句很友善!具體可以去參考狂神說Java的Mybatis學習視訊。

上一篇: 結對作業二
下一篇: 寒假作業1/2