MyBatis架構學習(三)-Mapper代理開發,mybatis-mapper

來源:互聯網
上載者:User

MyBatis架構學習(三)-Mapper代理開發,mybatis-mapper
前言:上一節我們學習了MyBatis的簡單實現CRUD,在這個過程中我們用了原始的Dao的方法開發,在這個過程中我們發現存在一些弊端,如有很多重複的代碼,sqlSession的操作,statement中id的寫入程式碼給將來維護帶來不便等等,這也是很多程式員苦惱的,因此推薦Mapper代理開發,簡單高效,畢竟學習的過程總是先苦後甜.下面我們來一起研究Mapper代理開發.一、基於Mapper的代理開發方式 在使用MyBatis開發Dao是,通常有兩種方法,即原始Dao方法,和基於Mapper介面的方法,MyBatis在進行Dao開發時,一般會涉及到三姐妹,分別是SqlSessionFactoryBuilder、SqlSessionFactiory、SqlSession。
我們都知道SqlSession中封裝了對資料庫的操作,如增刪改查,通過SqlSessionFactory建立SqlSession,而SqlSessionFactory是由SqlSessionFactoryBuilder建立的.
1. SqlSessionFactoryBuilder SqlSessionFactoryBuilder用於建立SqlSessionFacoty,SqlSessionFacoty一旦建立完成就不需要SqlSessionFactoryBuilder了,因為SqlSession是通過SqlSessionFactory生產,所以可以將SqlSessionFactoryBuilder當成一個工具類使用,最佳使用範圍是方法範圍即方法體內局部變數。
2.SqlSessionFactory SqlSessionFactory是一個介面,介面中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用範圍是整個應用運行期間,一旦建立後可以重複使用,通常以單例模式管理SqlSessionFactory。
3.SqlSession SqlSession是一個面向使用者的介面, sqlSession中定義了資料庫操作,預設使用DefaultSqlSession實作類別。
SqlSession中提供了很多操作資料庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象),SqlSession是線程不安全的,在SqlSesion實作類別中除了有介面中的方法(操作資料庫的方法)還有資料域屬性,SqlSession最佳應用場合在方法體內,定義成局部變數使用,絕對不能將SqlSession執行個體的引用放在一個類的靜態欄位或執行個體欄位中。今天的博文中,小編將著重介紹小夥伴們介紹mybatis中開發dao的兩種方法,原始dao的開發方式和mapper代理開發。
mybatis 中 dao 的開發方法,分別是原始 dao 的開發和 mapper 代理開發,原始Dao開發和Mapper動態代理開發,這兩種各有優點。原始Dao開發:程式員要寫Dao和Dao實現,需要些較多的代碼,但是比較好理解。Mapper動態代理:程式員只需要寫Mapper介面,然後按照規範進行配置,MyBatis就會自動實作類別似Dao實現,減少模板方法。mybatis官方推薦使用mapper代理方法開發mapper介面,程式員不用編寫mapper介面實作類別,使用mapper代理方法時,輸入參數可以使用pojo封裝對象或map對象,保證dao的通用性。
二、Mapper代理開發的實列 1. Mapper代理開發的一些規則 *xxxmapper.xml中的namespace等於mapper介面地址
*xxxmapper.java介面中的方法 xxxmapper.xml中的statement的id一致
*xxxmapper.java介面中的方法輸入參數和xxxmapper.xml中statement的parameterType指定類型一致
*xxxmapper.java介面中的方法的傳回值類型和xxxmapper.xml中resultType指定的類型一致
2.MyBatis的開發過程
☐ 編寫MyBatis的設定檔MyBatis-config.xml
☐ 編寫MyBatis的對應檔xxxmapper.xml(這裡主要是statement和sql語句)
☐ 編寫MyBatis的介面方法xxxmapper.java(注意這裡方法名與對應檔中的statement一致)
☐ 通過SqlSessionFactory擷取SqlSession
☐ 通過SqlSesson操作資料庫(執行CRUD需要調用的SqlSession.commit()
☐ SqlSession使用完關閉資料庫
3.首先建立一個user資料庫

use mybatis;create table user(id int null auto_increment,name varchar(32) not null,password varchar(32) not null,age int not null,create_time datetime null,primary key(id));
4.加入日誌包,建立一個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><!-- 開啟駝峰命名法規則,create_time 就等於createTime  --><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 預設引用那個資料庫環境 --><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://127.0.0.1:3306/mybatis" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments><!-- SQL的對應檔 --><mappers><mapper resource="com/dqsy/mybatis/mapper/UserMapper.xml" /></mappers></configuration>
5.建立一個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.dqsy.mybatis.mapper.UserMapper"><!--  id:表示一個SQL控制代碼,相當於JDBC中的statementparametaerType:輸入參數的類型,在SQL語句中,通過預留位置#{}來接受參數resultType:SQL操作的返回結果類型-->  <!-- 單個查詢 -->  <select id="getUserById" parameterType="java.lang.Integer"   resultType="com.dqsy.mybatis.entity.User">    select id,name,password,age,create_time from user where id=#{id}  </select>  <!-- 查詢列表 -->  <select id="getUserList" resultType="com.dqsy.mybatis.entity.User">  select id,name,password,age,create_time from user  </select>  <!-- 添加使用者 注意在這傳參是java裡的參數 而不是資料庫裡的欄位名-->  <select id="addUser" parameterType="com.dqsy.mybatis.entity.User">  insert into user(name,password,age,create_time) values(#{name}, #{password} ,#{age}, #{createTime})  </select>  <!-- 刪除使用者 -->  <select id="delUser" parameterType="java.lang.Integer">  delete from user where id = #{id}  </select>  <!-- 修改使用者的資料 -->  <select id="uptUser" parameterType="com.dqsy.mybatis.entity.User">  update user set name=#{name}, password=#{password}, age=#{age}, create_time=#{createTime} where id=#{id}  </select></mapper>
6.同時在該包下建立一個與對應檔對應的UserMapper.java的介面
package com.dqsy.mybatis.mapper;import java.util.List;import com.dqsy.mybatis.entity.User;public interface UserMapper {public User getUserById(int id);public List<User> getUserList();public void addUser(User user);public void delUser(int i);public void uptUser(User user);}
7.建立一個User的實體類(並實現getset方法和tostring方法)
public class User {private int id;private String name;private String password;private int age;private Date createTime;
8.建立一個測試類別MapperTest
package com.dqsy.mybatis.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.Before;import org.junit.Test;import com.dqsy.mybatis.entity.User;import com.dqsy.mybatis.mapper.UserMapper;public class MapperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws IOException{String configFile = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(configFile);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void TestGetUserById(){SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);System.out.println(userMapper.getUserById(1));sqlSession.close();}//查詢使用者@Testpublic void TestGetUserList(){SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.getUserList(); for(User u: users){System.out.println(u);}sqlSession.close();}//添加使用者@Testpublic void TestAddUser(){SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setName("魯金環");user.setPassword("123");user.setAge(23);user.setCreateTime(new Date());userMapper.addUser(user);sqlSession.commit();sqlSession.close();}//刪除使用者@Testpublic void TestdelUser(){SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.delUser(1);sqlSession.commit();sqlSession.close();}//修改使用者@Testpublic void TestuptUser(){SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setId(2);user.setName("王巍");user.setPassword("123");user.setAge(23);user.setCreateTime(new Date());userMapper.uptUser(user);sqlSession.commit();sqlSession.close();}}
8.測試結果在這我就截一下資料庫的圖就行
在這注意下整個包的結構
三、總結(#{}和${}的區別) #{}表示一個預留位置號,#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap。
如果接收簡單類型,#{}中可以寫成value或其它名稱。
#{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式擷取對象屬性值。

${}表示一個拼接符號,會引用sql注入,所以不建議使用${}。
${}接收輸入參數,類型可以是簡單類型,pojo、hashmap。
如果接收簡單類型,${}中只能寫成value。
${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式擷取對象屬性值。

selectOne和selectList
動態代理對象調用sqlSession.selectOne()和sqlSession.selectList()是根據mapper介面方法的傳回值決定,如果返回list則調用selectList方 法,如果返回單個對象則調用selectOne方法。

namespace
mybatis官方推薦使用mapper代理方法開發mapper介面,程式員不用編寫mapper介面實作類別,使用mapper代理方法時,輸入參數可以使用pojo封裝對象或map對象,保證dao的通用性。

查看評論

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.