MyBatis-CRUD

CRUD

select

select:選擇,查詢語句。

select標籤中,有幾個常用的屬性:

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

select標籤案例

1、編寫接口

User getUserById(int id);

2、編寫對應接口的mapper.xml文件中的sql語句

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

3、編寫測試類進行測試

@Test
    public void testGetUserList(){
        // 1. 獲取SqlSession 執行sql使用的
        SqlSession session = MyBatisUtils.getSession();

        // 2.通過 session    獲得接口
        UserMapper mapper = session.getMapper(UserMapper.class);

        List<User> users = mapper.getUserList();
        for (User user : users) {
            System.out.println(user);
        }
        session.close();
    }

insert

insert:插入語句。

在insert標籤中,常用的屬性有:

  • id:對應的namespace中的方法名
  • parameterType:參數類型

編寫對應Mapper.xml文件中的sql語句:

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

update

update:更新語句。

在update標籤中,常用的屬性有:

  • id:對應的namespace中的方法名
  • parameterType:參數類型

編寫對應的Mapper.xml文件中的sql語句:

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

delete

delete:刪除語句。

在delete標籤中,常用的屬性有:

  • id:對應的namespace中的方法名
  • parameterType:參數類型

編寫對應的Mapper.xml文件中的sql語句:

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

需要注意的是:在進行增刪改操作的時候,需要提交事務,這樣才能將數據持久化到數據庫中!

session.commit();

可能會遇到的錯誤:

  • 在寫sql語句的時候,標籤不要匹配錯,否則程序會報錯!
  • resource在綁定mapper的時候,需要使用路徑!
  • 程序的配置文件必須要符合規範!
  • 出現NullPointerException,沒有註冊到資源!
  • 輸出的xml文件中存在中文亂碼問題!
  • maven的資源沒有導出!

map

當遇到實體類或者數據庫中的表、字段或者參數過多,或者我們不知道用戶會傳什麼樣的值這樣的情況時,應當考慮使用Map。

編寫接口的方法:

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

編寫sql語句:

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

編寫測試方法:

@Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

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


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

        map.put("userid",5);
        map.put("passWord","2222333");

        mapper.addUser2(map);

        sqlSession.close();
    }
  • 使用Map傳遞參數,可以直接在sql中取出key即可(key可以隨意定義)!
    • 此時的參數類型是:parameterType="map"
  • 使用對象傳遞參數時,直接在sql中取出對象的屬性即可!
    • 此時的參數了類型是:parameterType="Object"
  • 只有一個基本類型參數(參數類型可以不寫)的情況下,可以直接在sql中取到!

在有多個參數的情況下使用Map或者註解(@Param)!

模糊查詢

在寫模糊查詢的時候,通配符的使用方式有兩種。

1、在執行java代碼的時候,傳遞通配符 % %(這種方式是比較安全的)

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

2、在sql拼接中使用通配符 (會存在sql注入)

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

配置解析

核心配置文件

Mybatis有一個核心配置文件:mybatis-config.xml。Mybatis的配置文件中包含了影響Mybatis行爲的設置和屬性信息。

具體的配置標籤有:

標籤名 含義
configuration 配置
properties 屬性
settings 設置
typeAliases 類型別名
typeHandlers 類型處理器
objectFactory 對象工廠
plugins 插件
environments 環境配置
environment 環境變量
transactionManager 事務管理器
dataSource 數據源
databaseIdProvider 數據庫廠商標識
mappers 映射器

environments(環境配置)

Mybatis可以配置成適應多種環境。

但是儘管可以配置多個環境,每個SqlSessionFactory 的實例只能選擇一種環境

transactionManager(事務管理器)

Mybatis默認的事務管理器是 JDBC。

dataSource(數據源)

dataSource默認是 POOLED(池化)。

properties(屬性)

我們可以通過properties 屬性來實現引用配置文件。

這些屬性都是可以外部配置而且可以動態替換的。我們既可以在典型的java屬性文件中進行配置,也可以通過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="pwd" value="11111"/>
    </properties>

引入配置文件後,可以修改property中的value:

<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${pwd}"/>

注意:

  • 可以直接引入外部文件
  • 可以在其中增加一些屬性配置
  • 如果兩個文件有同一個字段,那麼優先使用外部配置文件的

typeAliases(類型別名)

類型別名是爲java類型設置一個較短的名字。它存在的意義僅僅是在於 用來減少類完全限定名的冗餘。

方式1

給某個包下的具體類起別名:

<typeAliases>
        <typeAlias type="com.llx.pojo.User" alias="User"/>
</typeAliases>

方式2

可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean。例如:掃描實體類的包,它的默認別名就爲這個類的 類名,首字母小寫!

<typeAliases>
    <package name="com.llx.pojo"/>
</typeAliases>

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

如果實體類比較多,使用第二種方式比較好。

第一種方式可以自己定義別名,但是第二種方式不行,如果非要修改就需要在實體類上增加註解。

@Alias("user")
public class User {}

settings(設置)

settings 是Mybatis中非常重要的調整設置,它們會改變Mybatis 的運行時行爲。

 <settings>
        <!--下劃線命名轉駝峯命名-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--指定Mybatis所用日誌-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
 </settings>

mappers(映射器)

MapperRegistry:註冊綁定我們的Mapper文件。

綁定方式有三種:

方式1 推薦使用的方式

使用 resource,其後跟的是xml文件的具體路徑。

<!--每一個Mapper.XML都需要在Mybatis核心配置文件中註冊!-->
<mappers>
    <mapper resource="com/llx/mapper/UserMapper.xml"/>
</mappers>

方式2

使用 class 文件綁定註冊。

<mappers>
    <mapper class="com.llx.mapper.UserMapper"/>
</mappers>

方式3

使用掃描包進行註冊。name 後面跟到包名即可。

<mappers>
    <package name="com.kuang.dao"/>
</mappers>

注意:

  • 接口和其Mapper配置文件必須同名
  • 接口和其Mapper配置文件必須在同一個包下

生命週期和作用域

一個程序的完整執行過程,可以表示如下:

生命週期和作用域是至關重要的,因爲錯誤的使用會導致嚴重的併發問題。

SqlSessionFactoryBuilder:

  • SqlSessionFactoryBuilder一旦被創建,就不需要它了。
  • SqlSessionFactoryBuilder是一個局部變量。

SqlSessionFactory:

  • SqlSessionFactory,可以理解爲 數據庫連接池。
  • SqlSessionFactory一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或者重新創建另一個實例。
  • SqlSessionFactory的最佳作用域是應用作用域。
  • 最簡單的就是使用單例模式或者靜態單例模式。

SqlSession:

  • SqlSession是連接到連接池的一個請求。
  • SqlSession的實例不是線程安全的,因此不能夠被共享,所以它的最佳作用域是請求或者方法作用域。
  • SqlSession用完之後需要關閉,否則會佔用資源。

SqlSessionFactory在程序運行過程中,只可創建一次。SqlSession和Mappr可以創建多個,一個SqlSession可以有多個Mapper。

屬性名和字段名不一致

當數據庫中的字段名和實體類中的屬性名不一致的時候,執行sql語句的時候會得到意料之外的結果。

解決屬性名和字段名不一致的方法有兩種。

方式1 起別名

起別名。

<select id="getUserById" resultType="com.llx.pojo.User">
    select id,name,pwd as password from mybatis.user where id = #{id}
</select>

方式2 使用resultMap

resultMap,結果集映射。

<!--結果集映射-->
<resultMap id="UserMap" type="User">
    <!--column數據庫中的字段,property實體類中的屬性-->
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>

<select id="getUserById" resultMap="UserMap">
    select * from mybatis.user where id = #{id}
</select>

resultMap 元素是Mybatis中最重要的最強大的元素。

resultMap的設計思想是,對於簡單的語句不需要配置顯式的結果映射,對於複雜一點的語句只需要描述它們的關係即可。

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