文章目錄
MyBatis入門
- List item
什麼是MyBatis
- 持久層框架。
- 避免JDBC代碼 :無設置動態參數 和 處理結果集的
getXXX
方法。 - 配置:使用
xml
和註解 配置原生類型,接口 和 Java的POJO爲數據庫中的記錄。sql
代碼寫在xml
文件當中,完成分離。
獲取MyBatis
第一個MyBatis程序
搭建環境:
- 創建數據庫。
- 新建項目 :
2.1 : 創建一個空的maven
項目, 無需使用骨架。
2.2 : 刪除src目錄。 - 導入依賴 : mybatis + mysql 驅動 + Junit。
<!-- 依賴 -->
<dependencies>
<!-- mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- myBatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
創建模塊:
特意說明,這裏使用模塊兒而不是整個項目是爲了方便學習。每個模塊兒的pom.xml
都在父級項目當中進行了聲明,這樣不用頻繁進行jar包的導入
。
編寫配置文件
在src/main/resouces
目錄下面創建一個xml
文件,建議使用`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>
<!-- 可以配置多套環境 -->
<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?userSSL=true&userUnicode=ture&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
編寫MyBatis工具類
目的是爲了將MyBatis
配置文件加載,其他內容進行一次封裝。
public class MyBatisUtil {
// 加載配置文件獲取工廠
private static SqlSessionFactory sqlSessionFactory = null;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
編寫實體類User:
這裏的user
屬性 和 數據庫mybits.user
中的字段是一樣(先保持名字一致)。
public class User {
private int id;
private String name;
private String pwd;
// 省略構造 + getter/setter
}
編寫 Mapper接口 和 xml
- Mapper接口
package dao;
import pojo.User;
import java.util.List;
public interface UserMapper {
List<User> getAllUser();
}
- Mapper.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace : 指定到綁定到Mapper接口。
-->
<mapper namespace="dao.UserDao">
<!--
id : 對應Mapper接口的方法名字.
resultType : 返回的Pojo類型
-->
<select id="getAllUser" resultType="pojo.User">
select * from mybatis.user;
</select>
</mapper>
註冊mapper
<mappers>
<mapper resource="dao/UserMapper.xml"></mapper>
</mappers>
測試
public class UserDaoTest {
@Test
public void test() {
//1. 獲得SQLSession對象
SqlSession session = MyBatisUtil.getSqlSession();
//2.
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getAllUser();
System.out.println(userList);
}
}
核心API注意事項:
SqlSessionFactoryBuilder
一旦創建了SqlSessionFactory就不再需要了,因此其最佳使用位置是局部方法位置。不應該讓其一直存在,以保證所有的XML
解析資源可以被釋放給重要的事情。
SqlSessionFactory
被創建就應該一直存在,沒有必要拋棄它後重新創建。其最佳作用域是應用的作用區域。很多方法可以做到,比如單例模式,靜態單例模式,或者用靜態代碼塊兒進行初始化。
SqlSession
SqlSession是線程不安全,放在局部作用區域使用,確保其在單線程中。應該讓每次收到一個請求,打開一個SqlSession,返回響應,然後關閉。
CRUD
select
<!--
id : 對應的接口當中的方法名。
resultType : SQL 語句執行的返回值。
parameterType : 參數的類型。
-->
<! --
需求:根據指定的id查詢用戶。
UserMapper中存在抽象方法 : User getUserById(int id);
-->
<select id="getUserById" resultType="pojo..User" paramterType="int" >
select * from user where id = #{id}
</select>
isnert
<!--
需求: 插入一個User
在UserMapper中存在抽象方法:insertUser(User user);
insert 沒有resultType
參數對象的屬性可以直接在sql中使用,不用get方法
-->
<isnert id="insertUser" paramterType="pojo.User">
insert into user (id, name, pwd) values (NULL, #{name}, #{pwd});
</isnert>
- 測試代碼
@Test
public void insertUser() {
User user = new User(-1, "張三", "xxxxxx");
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.insertUser(user);
// 提交事務
session.commit();
session.close();
}
update
<!--
UserMapper中存在抽象方法:int updateUser(User user);
-->
<update id="updateUser" paramterType="pojo.User">
update user set name= #{name} where id=#{id};
</update>
- 測試代碼
@Test
public void updateUser() {
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(3, "王五", null);
mapper.updateUser(user);
// 提交事務
session.commit();
session.close();
}
delete
<!--
UserMapper當中存在方法:int deleteUser(User user);
-->
<delete id="deleteUserById" paramterType="int">
delete from user where id=#{id}
</delete>
- 測試代碼
@Test
public void updateUser() {
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(3, "王五", null);
mapper.updateUser(user);
// 提交事務
session.commit();
session.close();
}
Map作爲參數
使用POJO
作爲參數的情況下不是很方便,可以使用Map類型作爲參數,這樣只用填寫關鍵字段就可以了。
- UserMapper.java
int insertUserByMap(Map<String, Object> mp);
- UserMapper.xml
<!-- 使用Map作爲參數插入 -->
<insert id="insertUserByMap" parameterType="map">
insert into user (id, name, pwd) values (NULL, #{userName}, #{passWord})
</insert>
- 測試
@Test
public void insertUserByMap() {
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
Map<String, Object> data = new HashMap<String, Object>();
data.put("userName", "李白");
data.put("passWord", "123456");
mapper.insertUserByMap(data);
// 提交事務
session.commit();
session.close();
}