1 全局配置文件的properties 和 alias的配置
1.1 properties 數據庫文件配置
在src下配置個db.properties文件
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis_test?useUnicode=true&characterEncoding=utf8
username=root
password=root
- 全局配置文件
SqlMapConfig.xml
1.2 setting【瞭解】
1.3 typeAliases
- 別名是使用是爲了在映射文件中,更方便的去指定參數和結果集的類型,不再用寫很長的一段全限定名。
mybatis支持的別名
別名
映射的類型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
2 MyBatis 加載映射文件的方式
<mapper resource=’’/>
使用相對於類路徑的資源
如:<mapper resource="sqlmap/User.xml" />
<mapper url=’’/>
【不用】
使用完全限定路徑
如:<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />
<mapper class=’’/>
- 使用mapper接口的全限定名
如:<mapper class="cn.gyf.mybatis.mapper.UserMapper"/>
- 也可使用註解開發,把xml文件刪除
public interface UserMapper {
/**
*
* @param user
* @return 返回受影響的行數
*/
@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
public int save(User user);
@Select("SELECT * FROM user WHERE id = #{id}")
public User findUserById(int id);
}
3 Mybatis的映射文件
3.1 輸入映射ParameterType
指定輸入參數的java類型,可以使用別名或者類的全限定名。它可以接收簡單類型,POJO對象、HashMap。
- 傳遞簡單類型
- 傳遞POJO對象
- 傳遞POJO包裝對象
開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作爲查詢條件),這時可以使用包裝對象傳遞輸入參數。
需求
綜合查詢用戶信息,需要傳入查詢條件複雜,比如(用戶信息、訂單信息、商品信息)。
vo:鍵值對對象,相對於kv
po:persist object 持久化對象
pojo:簡單的java對象
entity:實體
包裝類
package com.tzb.vo;
import com.tzb.model.User;
public class UserQueryVO {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
- UserMapper.java
package com.tzb.mapper;
import com.tzb.model.User;
import com.tzb.vo.UserQueryVO;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
/**
*
* @param user
* @return 返回受影響的行數
*/
//@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
public int save(User user);
//@Select("SELECT * FROM user WHERE id = #{id}")
public User findUserById(int id);
public List<User> findUserByUserQueryVo(UserQueryVO 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">
<mapper namespace="com.tzb.mapper.UserMapper">
<insert id="save" parameterType="com.tzb.model.User">
<!-- 這裏的佔位寫模型的屬性-->
INSERT INTO user (username,sex,birthday,address)
VALUE (#{username},#{sex},#{birthday},#{address});
</insert>
<select id="findUserById" parameterType="int" resultType="com.tzb.model.User">
SELECT * FROM user WHERE id = #{id};
</select>
<!--查詢用戶 id 爲 n 的用戶-->
<select id="findUserByUserQueryVo" parameterType="userQueryVO" resultType="user">
SELECT u.* FROM user u WHERE u.id = #{user.id}
</select>
</mapper>
- 測試類
public class Demo5 {
private SqlSession session;
@Before
public void before() throws IOException {
System.out.println("before.......獲取 session");
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
session = factory.openSession();
}
@After
public void after() {
System.out.println("after.......關閉 session");
session.close();
}
@Test
public void test1() throws IOException {
// 代理
UserMapper userMapper = session.getMapper(UserMapper.class);
//通過模型的包裝類來查詢用戶
UserQueryVO query = new UserQueryVO();
User user = new User();
user.setId(1);
query.setUser(user);
List<User> list = userMapper.findUserByUserQueryVo(query);
System.out.println(list);
session.commit();
}
}
- 傳遞Map對象
public interface UserMapper {
/**
*
* @param user
* @return 返回受影響的行數
*/
//@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
public int save(User user);
//@Select("SELECT * FROM user WHERE id = #{id}")
public User findUserById(int id);
public List<User> findUserByUserQueryVo(UserQueryVO vo);
public List<User> findUserByMap(Map<String,Object> map);
}
- 測試
@Test
public void test1() throws IOException {
// 代理
UserMapper userMapper = session.getMapper(UserMapper.class);
// 查詢條件
Map<String,Object> map = new HashMap<>();
map.put("username","張");
map.put("sex","1");
List<User> list = userMapper.findUserByMap(map);
System.out.println(list);
session.commit();
}
3.2 輸出映射 resultType/resultMap
3.2.1 resultType
- 使用resultType進行結果映射時,查詢的列名和映射的pojo屬性名完全一致,該列才能映射成功。
- 如果查詢的列名和映射的pojo屬性名全部不一致,則不會創建pojo對象;
- 如果查詢的列名和映射的pojo屬性名有一個一致,就會創建pojo對象。
- 輸出簡單類型
public interface UserMapper {
//@Insert("INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address})")
public int save(User user);
//@Select("SELECT * FROM user WHERE id = #{id}")
public User findUserById(int id);
public List<User> findUserByUserQueryVo(UserQueryVO vo);
public List<User> findUserByMap(Map<String,Object> map);
//返回用戶個數
public int findUserCount(UserQueryVO vo);
}
- 測試
@Test
public void test1() throws IOException {
// 代理
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryVO query = new UserQueryVO();
User user = new User();
user.setSex("1");
query.setUser(user);
int count = userMapper.findUserCount(query);
System.out.println("人數:" + count);
session.commit();
}
- 輸出POJO單個對象
- 輸出POJO列表
- 總結
- 輸出單個pojo對象和pojo列表時,mapper映射文件中的resultType的類型是一樣的,mapper接口的方法返回值不同。
- 同樣的mapper映射文件,返回單個對象和對象列表時,mapper接口在生成動態代理的時候,會根據返回值的類型,決定調用selectOne方法還是selectList方法。
3.2.2 resultMap
如果查詢出來的列名和屬性名不一致,通過定義一個resultMap將列名和pojo屬性名之間作一個映射關係。
- 定義resultMap
- 使用resultMap作爲statement的輸出映射類型
- 測試
@Test
public void test1() throws IOException {
// 代理
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.findUserByIdResultMap(1);
System.out.println("信息:" + user);
session.commit();
}