MyBatis之傳多個參數

用戶表sys_user8:

CREATE TABLE `sys_user8` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(50) DEFAULT NULL,
  `birthday` DATE DEFAULT NULL,
  `salary` DECIMAL(8,2) DEFAULT NULL,
  `address` VARCHAR(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;
INSERT INTO `sys_user8` VALUES(1, '陳三', '1992-02-29', 123456.78, '深圳市南山區');
INSERT INTO `sys_user8` VALUES(2, '張三', '1990-03-05', 8500, '深圳市寶安區');
INSERT INTO `sys_user8` VALUES(3, '李三', '1991-05-23', 123326.1, '深圳市福田區');
INSERT INTO `sys_user8` VALUES(4, '趙四', '1988-09-15', 8000, '深圳市龍華新區');
實體類SysUser8
public class SysUser8 {
	private int id;
	private String userName;
	private Date birthday;
	private Double salary;
	private String address;
	//...省略setter、getter方法
	public String toString(){
		return "SysUser8 [id = " + id + ", userName = " + userName + ", birthday = " + birthday + ", salary = " + salary + ", address = " + address + "]";
	}
}

接口SysUser8Dao

public interface SysUser8Dao {
	public List<SysUser8> getUser1(String userName, Date birthday, Double salary);
	
	public List<SysUser8> getUser2(Map paramMap);
	
	public List<SysUser8> getUser3(@Param("userName")String userName, @Param("birthday")Date birthday, @Param("salary")Double salary);
	
	public List<SysUser8> getUser4(@Param("userName")String userName, @Param("birthday")Date birthday, @Param("salary")Double salary);
}
實體類SysUser8的映射文件SysUser8.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.chensan.sys.dao.SysUser8Dao">
  <resultMap type="com.chensan.sys.entity.SysUser8" id="sysUser8Map">
    <result property="userName" column="user_name"/>
  </resultMap>

  <!-- 查詢用戶列表所有用戶 -->
  <select id="getUser1" resultMap="sysUser8Map">
    SELECT * FROM `sys_user8` WHERE 1=1 
    AND `user_name` like CONCAT('%',#{0},'%')
    AND `birthday`&gt;#{1}
    AND `salary`&lt;#{2} 
  </select>

  <select id="getUser2" resultMap="sysUser8Map">
    SELECT * FROM `sys_user8` WHERE 1=1 
	AND `user_name` like CONCAT('%',#{userName, jdbcType=VARCHAR},'%')
    AND `birthday`&gt;#{birthday, jdbcType=DATE}
    AND `salary`&lt;#{salary, jdbcType=DECIMAL} 
  </select>

  <select id="getUser3" resultMap="sysUser8Map">
    SELECT * FROM `sys_user8` WHERE 1=1 
	AND `user_name` like CONCAT('%',#{userName, jdbcType=VARCHAR},'%')
    AND `birthday`&gt;#{birthday, jdbcType=DATE}
    AND `salary`&lt;#{salary, jdbcType=DECIMAL} 
  </select>

  <select id="getUser4" resultMap="sysUser8Map">
    SELECT * FROM `sys_user8` WHERE 1=1 
	AND `user_name` like CONCAT('%',#{userName},'%')
    AND `birthday`&gt;#{birthday}
    AND `salary`&lt;#{salary} 
  </select>
</mapper>
在MyBatis的配置文件引入實體類映射SysUser8.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">
	  <!-- 使用jdbc事務管理  或者JTA事務管理-->
	  <transactionManager type="JDBC" />
	  <!-- 數據庫連接池 -->
	  <dataSource type="POOLED">
		<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
	  </dataSource>
	</environment>
  </environments>

  <!-- 加載實體類的映射文件 -->
  <mappers>
    <mapper resource="com/chensan/sys/mapper/SysUser8.xml"/>   
  </mappers>
</configuration>

測試類

public class MyBatisSysUser8InterfaceParamTest {
	private static SqlSessionFactory sqlSessionFactory;
    private static Reader resource;
    
    //創建會話工廠
    static{
        try{
        	//讀取MyBatis配置文件
        	resource = Resources.getResourceAsReader("myBatisConfig.xml");
        	//創建SqlSessionFactory會話工廠
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;
    }
    
    public void getUser1(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser8Dao sysUser8Dao = sqlSession.getMapper(SysUser8Dao.class);
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1991-1-5");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	List<SysUser8> users = sysUser8Dao.getUser1("三", birthday, 123333D);
    	for(SysUser8 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public void getUser2(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser8Dao sysUser8Dao = sqlSession.getMapper(SysUser8Dao.class);
    	
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1991-1-5");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Map paramMap = new HashMap();
		paramMap.put("userName", "三");
    	paramMap.put("birthday", birthday);
    	paramMap.put("salary", 123333D);
    	
    	List<SysUser8> users = sysUser8Dao.getUser2(paramMap);
    	for(SysUser8 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public void getUser3(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser8Dao sysUser8Dao = sqlSession.getMapper(SysUser8Dao.class);
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1991-1-5");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	List<SysUser8> users = sysUser8Dao.getUser3("三", birthday, 123333D);
    	for(SysUser8 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public void getUser4(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser8Dao sysUser8Dao = sqlSession.getMapper(SysUser8Dao.class);
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1991-1-5");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	List<SysUser8> users = sysUser8Dao.getUser4("三", birthday, 123333D);
    	for(SysUser8 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public static void main(String[] args) {
    	MyBatisSysUser8InterfaceParamTest myBatisParamTest = new MyBatisSysUser8InterfaceParamTest();
    	//myBatisParamTest.getUser1();
    	//myBatisParamTest.getUser2();
    	//myBatisParamTest.getUser3();
    	myBatisParamTest.getUser4();
    } 
}
第一種傳參方式:如getUser1,在接口定義時已規定了參數的順序,映射文件的SQL操作元素中,用序號從0開始,要和參數對應。參數傳值用序號需要去對應接口參數,不夠直觀;

第二中傳參方式:如getUser2,接口中用Map,在映射文件中再設置參數。接口不能直觀看到要傳的參數;

第三種傳參方式:如getUser3,在接口時用註解確定傳參的情況,在映射文件中的調用如第二種方式。

第四種傳參方式:如getUser4,同第三種傳參方式,只是第四種沒有再去設置jdbcType。(由於個人覺得既然在接口處已經確定了傳參的數據類型和參數名稱,在映射文件還要繼續設置jdbcType是否也是過於繁瑣。嘗試了第四種傳參方式可行。第二種方式是在接口未設置參數類型和參數名稱,故需要用jdbcType來指定數據類型,那麼第三種傳參方式設置jdbcType又有什麼鬼作用?

按以往的經驗都是第一種傳參方式更直觀,很明顯在參數列表指定了參數和參數類型,那爲什麼要在參數前加了@param才能指定字段了。第一種方式就是沒指定字段,才需要在SQL語句中用序號去填充吧。

參考自:http://www.2cto.com/database/201409/338155.html

發佈了102 篇原創文章 · 獲贊 49 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章