【目錄】
1 輸入映射parameterType
2 輸出映射resultType、resultMap
1 輸入映射parameterType
通過parameterType指定輸入?yún)?shù)類型,參數(shù)類型可以是基本類型焕毫、自定義對象沛善、自定義包裝類航揉、集合。
我們主要講解前三種參數(shù)類型金刁。
1.基本類型帅涂、自定義對象
動態(tài)sql是mybatis 的主要特性之一,mybatis 為我們提供了兩種支持動態(tài)sql 的語法:#{}以及${}尤蛮。
#{}:在預(yù)處理時媳友,會把參數(shù)部分用一個占位符 ? 代替。在使用時不需要關(guān)心參數(shù)值的類型产捞,MyBatis會自動進行java類型和jdbc類型的轉(zhuǎn)換醇锚。
${}:在預(yù)處理時,只是進行簡單的字符串替換坯临。通過${}可以將parameterType 傳入的內(nèi)容拼接在sql中且不進行jdbc類型轉(zhuǎn)換搂抒。
注意:如果傳輸基本類型艇搀,#{}括號中可以是value或其它名稱, ${}括號中只能是value求晶。
從安全性和性能的角度出發(fā)焰雕,為了防止sql注入,能使用#{}的情況下就不要使用 ${}芳杏, ${}更適用于直接插入一個不做任何修改的字符串到sql語句中矩屁。
(更多的動態(tài)sql語法看這里。)
傳遞簡單類型和自定義對象只需要注意#{}與${}的使用就可以爵赵。例如:
<!—傳遞pojo對象綜合查詢用戶信息 -->
2 <select id="findUserByUser" parameterType="user" resultType="user">
3 select * from user where id=#{id} and username like '%${username}%'
4 </select>
2.自定義包裝類
包裝類就是除了本對象以外吝秕,還包裝了一些其他的信息。在查詢條件復(fù)雜的時候空幻,就可以將查詢條件包裝在同一個包裝類xxxxVo中(VO:View Object烁峭,視圖對象)。
下面進行自定義包裝類的演示秕铛。
準(zhǔn)備數(shù)據(jù)庫约郁。
數(shù)據(jù)庫database:
新建項目HelloMyBatisMapper-parameterType。
主配置文件sqlMapConfig.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的事務(wù) -->
<transactionManager type="JDBC"/>
<!-- 使用連接池 連接數(shù)據(jù)庫 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/database?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射器的位置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
User.java:
package com.test.bean;
import java.util.Date;
public class User {
/**
* CREATE TABLE `user` (
`u_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id',
`u_username` VARCHAR(64) NOT NULL COMMENT '用戶名',
`u_password` VARCHAR(64) NOT NULL COMMENT '用戶密碼',
`u_sex` VARCHAR(16) DEFAULT NULL COMMENT '用戶性別',
`u_createTime` DATETIME DEFAULT NULL COMMENT '用戶創(chuàng)建時間',
`u_cid` INT(11) NOT NULL COMMENT '用戶國家id',
*/
private Integer u_id;
private String u_username;
private String u_password;
private String u_sex;
private Date u_createTime;
private Integer u_cid;
public Integer getU_id() {
return u_id;
}
public void setU_id(Integer u_id) {
this.u_id = u_id;
}
public String getU_username() {
return u_username;
}
public void setU_username(String u_username) {
this.u_username = u_username;
}
public String getU_password() {
return u_password;
}
public void setU_password(String u_password) {
this.u_password = u_password;
}
public String getU_sex() {
return u_sex;
}
public void setU_sex(String u_sex) {
this.u_sex = u_sex;
}
public Date getU_createTime() {
return u_createTime;
}
public void setU_createTime(Date u_createTime) {
this.u_createTime = u_createTime;
}
public Integer getU_cid() {
return u_cid;
}
public void setU_cid(Integer u_cid) {
this.u_cid = u_cid;
}
@Override
public String toString() {
return "User [u_id=" + u_id + ", u_username=" + u_username + ", u_password=" + u_password + ", u_sex=" + u_sex
+ ", u_createTime=" + u_createTime + ", u_cid=" + u_cid + "]";
}
}
UserVo.java:
package com.test.bean;
public class UserVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
動態(tài)代理接口類UserMapper.java:
package com.test.mapper;
import com.test.bean.User;
import com.test.bean.UserVo;
public interface UserMapper {
//通過UserVo id查詢一個用戶
public User selectUserByUserVoId(UserVo vo);
}
映射文件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">
<!-- 注意 namespace的修改 -->
<mapper namespace="com.test.mapper.UserMapper">
<!-- 使用selectUserByUserVoId查詢 但两,指定parameterType="com.test.bean.UserVo" -->
<select id="selectUserByUserVoId" parameterType="com.test.bean.UserVo" resultType="com.test.bean.User">
<!-- 注意此處的#{}里要寫user.u_id -->
select * from user where u_id = #{user.u_id}
</select>
</mapper>
測試類MapperTest.java:
package com.test.test;
import java.io.IOException;
import java.io.InputStream;
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.test.bean.User;
import com.test.bean.UserVo;
import com.test.mapper.UserMapper;
public class MapperTest {
@Test
public void Test_selectUserByUserVoId() throws IOException {
String resource = "sqlMapConfig.xml";
//讀取配置文件
InputStream in = Resources.getResourceAsStream(resource );
//創(chuàng)建sqlSessionfactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//生產(chǎn)一個sqlSession
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
UserVo vo = new UserVo();
User u = new User();
u.setU_id(1);
vo.setUser(u);
User user = mapper.selectUserByUserVoId(vo );
System.out.println(user);
}
}
進行測試鬓梅。
2 輸出映射resultType、resultMap
resultType直接表示返回類型(對應(yīng)實體類)谨湘,resultMap則是對外部ResultMap引用绽快,Mybatis會根據(jù)我們配置的信息進行映射,因此紧阔,resultMap常常用于解決復(fù)雜查詢坊罢,比如:列名和對象屬性名不一致、查詢的對象中包含其他的對象(關(guān)聯(lián)查詢)等擅耽。
在一般開發(fā)中艘绍,如果返回是基本類型,通常使用resultType秫筏,如果返回對象,通常使用resultMap挎挖。
小tips:
1.兩種映射的返回對象/返回集合都是寫全類路徑名/別名这敬。
2.resultType和resultMap兩者不可同時使用。
1.resultType
通過resultType指定輸出參數(shù)類型蕉朵,參數(shù)類型可以是基本類型崔涂、自定義對象、自定義包裝類(自動映射——包裝類中的屬性值與數(shù)據(jù)庫中的字段必須相匹配)始衅、集合冷蚂。
復(fù)制上面的項目HelloMyBatisMapper_parameterType缭保,命名為HelloMyBatisMapper_resultType。以基本類型為例蝙茶,查詢用戶總數(shù)艺骂。
在動態(tài)代理接口類UserMapper.java中添加代碼如下:
//查詢用戶總數(shù)
public Integer selectUserCount();
在映射文件UserMapper.xml中添加代碼如下:
<!-- resultType="Integer" -->
<select id="selectUserCount" resultType="Integer">
Select Count(*) from user
</select>
在測試類MapperTest.java中添加代碼如下:
@Test
public void Test_selectUserCount() throws IOException {
String resource = "sqlMapConfig.xml";
//讀取配置文件
InputStream in = Resources.getResourceAsStream(resource );
//創(chuàng)建sqlSessionfactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//生產(chǎn)一個sqlSession
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
Integer count = mapper.selectUserCount();
System.out.println(count);
}
進行測試。
2.resultMap
通過resultMap指定輸出參數(shù)類型隆夯,參數(shù)類型可以是基本類型钳恕、自定義對象、自定義包裝類(手動映射——包裝類中的屬性值與數(shù)據(jù)庫中的字段可以不匹配)蹄衷、集合忧额。經(jīng)常在bean對象字段與數(shù)據(jù)表字段不匹配或關(guān)聯(lián)查詢的時候使用。
以bean對象字段與數(shù)據(jù)表字段不匹配為例愧口,下面開始演示睦番。
在數(shù)據(jù)庫database中創(chuàng)建country表。
新建項目HelloMyBatisMapper_resultMap耍属。
給出相關(guān)代碼托嚣。
Country.java:
package com.test.bean;
public class Country {
// `c_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '國家id',
// `c_countryname` VARCHAR(128) NOT NULL COMMENT '國家名稱',
// `c_capital` VARCHAR(128) DEFAULT NULL COMMENT '國家首都名稱',
private Integer id;
private String c_countryname;
private String c_capital;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getC_countryname() {
return c_countryname;
}
public void setC_countryname(String c_countryname) {
this.c_countryname = c_countryname;
}
public String getC_capital() {
return c_capital;
}
public void setC_capital(String c_capital) {
this.c_capital = c_capital;
}
@Override
public String toString() {
return "Country [id=" + id + ", c_countryname=" + c_countryname + ", c_capital=" + c_capital + "]";
}
}
CountryMapper.java:
package com.test.mapper;
import java.util.List;
import com.test.bean.Country;
public interface CountryMapper {
//查詢所有
List<Country> selectAll();
}
CountryMapper.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.test.mapper.CountryMapper">
<!-- //查詢所有
List<Country> selectAll(); -->
<!-- type:返回類型 -->
<resultMap type="com.test.bean.Country" id="country">
<!-- 手動映射屬性 -->
<result property="id" column="c_id"/>
</resultMap>
<select id="selectAll" resultMap="country">
select * from country
</select>
</mapper>
測試類MapperTest.java:
package com.test.test;
import java.io.IOException;
import java.io.InputStream;
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.test.bean.Country;
import com.test.mapper.CountryMapper;
public class MapperTest {
@Test
public void Test_selectAll() throws IOException {
String resource = "sqlMapConfig.xml";
//讀取配置文件
InputStream in = Resources.getResourceAsStream(resource );
//創(chuàng)建sqlSessionfactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//生產(chǎn)一個sqlSession
SqlSession session = ssf.openSession();
CountryMapper mapper = session.getMapper(CountryMapper.class);
List<Country> list = mapper.selectAll();
for (Country country : list) {
System.out.println(country);
}
}
}
進行測試。