用戶表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, '深圳市龍華新區');
實體類SysUser8public 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`>#{1}
AND `salary`<#{2}
</select>
<select id="getUser2" resultMap="sysUser8Map">
SELECT * FROM `sys_user8` WHERE 1=1
AND `user_name` like CONCAT('%',#{userName, jdbcType=VARCHAR},'%')
AND `birthday`>#{birthday, jdbcType=DATE}
AND `salary`<#{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`>#{birthday, jdbcType=DATE}
AND `salary`<#{salary, jdbcType=DECIMAL}
</select>
<select id="getUser4" resultMap="sysUser8Map">
SELECT * FROM `sys_user8` WHERE 1=1
AND `user_name` like CONCAT('%',#{userName},'%')
AND `birthday`>#{birthday}
AND `salary`<#{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