Mybatis學習筆記(五)--mapper動態代理
阿新 • • 發佈:2019-01-08
Mapper介紹
Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),由Mybatis框架根據介面定義建立介面的動態代理物件,代理物件的方法體同上邊Dao介面實現類方法。
Mapper介面開發需要遵循以下規範:
- Mapper.xml檔案中的namespace與mapper介面的類路徑相同。
- Mapper介面方法名和Mapper.xml中定義的每個statement的id相同
- Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同
- Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同、
Mapper編寫
定義mapper對映檔案UserMapper.xml和UserMapper介面
將UserMapper.xml放在mapper目錄下,效果如下:
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.janson.mapper.UserMapper"> <!-- 查詢使用者 --> <!-- 屬性: id:宣告的唯一標識 paramterType:傳入引數型別 resultType:返回值的型別 --> <select id="findById" parameterType="Integer" resultType="User"> select * from user where id=#{v} </select> <!-- 通過名字模糊搜尋使用者 --> <select id="findUserByName" parameterType="String" resultType="User"> select * from user where username like "%"#{v}"%" </select> <!-- 新增使用者 --> <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="Integer" order="AFTER"> <!-- 這裡是查找出最新插入資料庫中的一ID值 --> select LAST_INSERT_ID() </selectKey> insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address}) </insert> <!-- 修改使用者 --> <update id="updateUser" parameterType="User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <!-- 刪除使用者 --> <delete id="deleteUser" parameterType="Integer"> delete from user where id = #{id} </delete> </mapper>
這裡的xml檔案使用了別名,在這裡介紹一下別名的書寫,在SqlMapConfig.xml中配置<typeAliases>屬性,注意這個屬性不能在<properties>屬性之前(<properties>是配置jdbc這類檔案的標籤)
<!-- 配置別名 -->
<typeAliases>
<package name="com.janson.pojo"/>
</typeAliases>
package中可以配置類的路徑,不過這裡建議使用配用包名,這樣在這個包下面的所有類就自動配上別名了,例如User.java這個類,我們的別可以使用user和User這兩個都可以。
UserMapper.java
package com.janson.mapper;
import java.util.List;
import com.janson.pojo.User;
public interface UserMapper {
//1.名字與xml中的id相同
//2.返回值型別與xml中的resultType相同
//3.傳入的引數型別與xml中的parameterType相同
//介面的名字要與xml的名字相同
public User findById(Integer id);
public List<User> findUserByName(String name);
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(Integer id);
}
測試程式碼
package com.janson.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.janson.mapper.UserMapper;
import com.janson.pojo.User;
public class MybatisMapperTest {
@Test
public void findById() throws IOException {
String resource = "sqlMapConfig.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
//建立sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.findById(1);
System.out.println(user);
}
@Test
public void findByNameTest() throws Exception {
//載入配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.findUserByName("janson");
for (User user : list) {
System.out.println(user);
}
}
//新增使用者
@Test
public void insertUserTest() throws Exception {
//載入配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setAddress("111");
user.setUsername("linjanson");
user.setSex("男");
user.setBirthday(new Date());
mapper.insertUser(user);
session.commit();
System.out.println(user.getId());
}
//修改使用者
@Test
public void updateUserTest() throws Exception {
//載入配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(29);
user.setAddress("22222");
user.setUsername("jansonlin");
user.setSex("男");
user.setBirthday(new Date());
mapper.updateUser(user);
session.commit();
System.out.println(user.getId());
}
//刪除使用者
@Test
public void deleteUserTest() throws Exception {
//載入配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(29);
session.commit();
}
}
mapper動態代理程式設計比原始的Dao程式設計快捷,方便,建議使用mapper動態程式設計。