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