1.準備工作
-
創建工程
-
導入jar包(maven座標)
-
創建一個實體(實體類和數據庫的表對應)
-
創建接口,編寫一個方法(接口UserDao.java)
-
編寫配置文件(resources資源下,sqlMapConfig.xml)
-
編寫映射文件(resources資源下,創建的包結果和接口的結構對應,UserDao.xml)
-
測試類(使用mybatis的api),操作查詢所有
-
2. 使用Junit重寫UserDao.java
/**
* 測試mybatis的crud操作
*/
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao userDao;
@Before//用於在測試方法執行之前執行
public void init()throws Exception{
//1.讀取配置文件,生成字節輸入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.獲取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.獲取SqlSession對象
sqlSession = factory.openSession();
//4.獲取dao的代理對象
userDao = sqlSession.getMapper(UserDao.class);
}
@After//用於在測試方法執行之後執行
public void destroy()throws Exception{
//提交事務
sqlSession.commit();
//6.釋放資源
sqlSession.close();
in.close();
}
/**
* 測試查詢所有
*/
@Test
public void testFindAll(){
//5.執行查詢所有方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
/*
保存,刪除,修改等操作
*/
}
3.進行CURD時的注意事項
3.1 事務處理
在進行增刪改時需要進行事務處理,而mybatis內部會自動開啓和回滾事務,
所以需要我們使用sqlSession.commit()來提交事務.
3.2 獲取自增長的數據庫id
新增用戶後,同時還要返回當前新增用戶的id值,因爲id是由數據庫的自動增長來實現的,所以就相當於我們要在新增後將自動增長auto_increment的值返回。
配置:UserDao.xml
<!--保存用戶-->
<!-- 配置插入操作後,獲取插入數據的id -->
<insert id="saveUser" parameterType="com.itheima.domain.User"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into user(username,address,sex,birthday)
values(#{username},#{address},#{sex},#{birthday});
</insert>
<!--其中的參數
#{username}等價於 user.getUsername(); (OGNL)
useGeneratedKeys="true" 是否使用新增的主鍵:true使用
keyColumn="id" 主鍵對應的數據庫列名
keyProperty="id" 主鍵對應的java對象屬性名
-->
3.3模糊查詢中的問題:
查詢語句有兩種寫法:
a. select * from user where name like #{name}
b. select * from user where username like '%${value}%'
#{}與${}的區別:
a.#{}表示一個佔位符號
通過#{}可以實現prepareStatement向佔位符中設置值,自動進行java類型
和jdbc類型轉換,#{}可以有效防止sql注入問題.#{}可以接受簡單類型值和pojo屬性值.
如果parameterType傳輸單個簡單類型的值,#{}括號中可以是value或者其他自定義名稱.
b.${}表示拼接sql串
通過${}可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換,${}可以接受簡單類型值或pojo類型屬性值,如果parameterType傳輸單個簡單類型的值,
${}括號內只能是value(因爲源碼中讀取的key的名字是value,所以在綁定參數時只能叫value).
4.Mybatis輸出結果的封裝
如果數據庫中的字段和對象中的屬性不一致
<!--
如果返回的列名和實體類的屬性不一致時,我們就不能封裝結果到指定的實體對象
解決方案 使用resultMap替換resultType
在UserDao.xml中的<mapper>下定義resultMap
-->
<!-- 配置 查詢結果的列名和實體類的屬性名的對應關係 -->
<resultMap id="userMap" type="com.itheima.domain.User">
<!-- 主鍵字段的對應 -->
<id property="userId" column="id"></id>
<!--非主鍵字段的對應-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<id/>:此屬性表示查詢結果集的唯一標識,也是數據庫的主鍵,
如果是多個字段爲複合唯一約束則定義多個<id/>
property:表示java中類的屬性
column:表示數據庫的列名
column和property放在一塊兒表示將sql查詢出來的字段映射到指定的pojo類屬性上。
<result />:普通屬性(普通字段),即pojo的屬性