Mapper 作為 Java 方法和 SQL 語句之間的橋梁,來更好地去使用 SQL
什么是Mapper
在MyBatis工程搭建 中我們主要講解的是 MyBatis 如何連接數據庫,具體執行 SQL 語句使用的是 JDBC 方式
但在實際應用中是不會選擇 JDBC 來執行 SQL 的,MyBatis 提供了 Mapper 作為 Java 方法和 SQL 語句之間的橋梁,來幫助我們更好地去使用 SQL
准備數據源
創建
drop database if exists mybatis_demo;
create database mybatis_demo;
use mybatis_demo;
create table user (
id int auto_increment primary key,
username varchar(20),
age int,
score int
);
insert into user (id, username, age, score) values
(1,'peter', 18, 100), (2,'pedro', 24, 200),
(3,'jerry', 28, 500), (4,'mike', 12, 300),
(5,'tom', 27, 1000);
在mybatis-config.xml配置文件中添加上對應的mapper配置
<!-- mapper配置 -->
<mappers>
<mapper class="mapper.UserMapper"/>
</mappers>
新建mapper包並新建UserMapper.java類
package mapper;
public interface UserMapper {
String selectUsernameById(Integer id);
}
添加SQL語句
@Select("SELECT username FROM user WHERE id = #{id}")
測試類usertest.java
@SuppressWarnings({"Duplicates"})
public class UserTest {
public static void main(String[] args) throws IOException, SQLException {
InputStream configuration = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
String username = mapper.selectUsernameById(1);
System.out.println("username: " + username);
session.close();
}
}
注解方式使用Mapper
代碼實現
要想使用MyBatis首先需要導入MySQL驅動包、MyBatis框架基礎包並且添加MyBatis核心配置文件
在mybatis-config.xml
配置文件中添加上對應的mapper配置
<!-- mapper配置 -->
<mappers>
<mapper class="mapper.UserMapper"/>
</mappers>
新建mapper
包,並在其下新建UserMapper.java
類
User模塊Mapper層:UserMapper.java
package mapper;
public interface UserMapper {
/**
* 通過用戶id查詢用戶名稱
*
* @param id 用戶id
* @return 用戶名稱
*/
String selectUsernameById(Integer id);
}
有了方法定義后,我們再通過注解為該方法添加上對應的SQL語句
User模塊測試類:UserTest.java
XML方式使用Mapper
XML方式是更加強大的一種使用方式,雖然它沒有注解那么方便,但是功能更強、更易維護,是 MyBatis 官方推薦的一種方式
代碼實現
因為我們在mybatis-config.xml
配置文件中已經添加過了mapper配置,所以說不需要在配置文件中添加額外的配置
在 UserMapper 接口中,我們再新增一個方法selectUserAgeById,該方法的作用是通過用戶id查詢用戶年齡
User模塊Mapper層:UserMapper.java
/**
* 通過用戶id查詢用戶年齡
*
* @param id 用戶id
* @return 用戶年齡
*/
Integer selectUserAgeById(Integer id);
這次使用XML的方式添加SQL語句,首先在資源文件夾下新建mapper
包,並在其下新建名為UserMapper
的XML文件
User模塊Mapper層配置文件:UserMapper.xml
namespace命名空間是每一個mapper的唯一標識,也是XML文件和Java接口類連接的標識
有了XML文件后,我們使用<select></select>
標簽給查詢年齡的方法添加上對應的SQL語句
<select id="selectUserAgeById" resultType="java.lang.Integer">
SELECT age FROM user WHERE id = #{id}
</select>
select 標簽中有兩個必填屬性:
- id:對應接口的方法名,即 selectUserAgeById,通過它 MyBatis 才能將二者對應起來
- resultType:對應 SQL 語句的返回類型,與接口方法的返回值相同,有時會用到resultMap
測試類添加代碼調用XML的SQL
User模塊測試類:UserTest.java
// 調用XML的SQL
Integer age = mapper.selectUserAgeById(1);
System.out.println("age: " + age);
select-resultType
代碼實現
在UserMapper.xml
文件中,我們新增 selectUserById 標簽,該 select 標簽的作用是:通過id查詢用戶
<select id="selectUserById" resultType="">
SELECT * FROM user WHERE id = #{id}
</select>
上面的內容返回的是所有字段值,我們需要自己創建實體類來存儲查出來的值
在entity包下創建User實體類:User.java
package entity;
public class User {
private Integer id;
private String username;
private Integer age;
private Integer score;
// 省略getter&setter方法
// 省略toString方法
}
把UserMapper.xml
文件中selectUserById
標簽的返回類型改為上面創建的實體類
resultType="entity.User"
User模塊Mapper層:UserMapper.java
/**
* 通過用戶id查詢用戶信息
*
* @param id
* @return
*/
User selectUserById(Integer id);
User模塊測試類:UserTest.java
// 調用通過用戶id查詢用戶信息的方法
User user = mapper.selectUserById(1);
System.out.println(user);
select-resultMap
MyBatis自動幫助我們映射數據庫數據和Java對象,其實這是MyBatis在幕后幫我們創建了resultMap對象,我們也可手動定義
代碼實現
User模塊Mapper層配置文件:UserMapper.xml
<resultMap id="userMap" type="entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="score" column="score"/>
</resultMap>
上標簽中有和兩個子標簽
其中標簽是主鍵,其它字段均使用 result 標簽來映射
標簽有property和column兩個屬性
其中 property 是 Java 對象中的屬性名稱,column 是數據表與之對應的字段名稱
把UserMapper.xml
文件中selectUserById
標簽的返回類型改為上面創建的resultMap
resultMap="userMap"