文章目录
4. XML - 映射文件
MyBatis 的真正强大在于它的语句映射,MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
SQL 映射文件只有很少的几个顶级元素(只列出常用元素):
select
– 映射查询语句。insert
– 映射插入语句。update
– 映射更新语句。delete
– 映射删除语句。sql
– 可被其它语句引用的可重用语句块。resultMap
– 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
4.1. select
查询语句是 MyBatis 中最常用的元素之一,能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。前面我们写了一个比较简单的select
<select id="selectOne" parameterType="int" resultType="com.czxy.mybatis.model.User">
SELECT
uid,
username,
birthday,
phone,
sex,
address
FROM `user`
WHERE uid = #{aa}
</select>
这个语句名为selectOne
,接受一个 int(或 Integer)类型的参数,并返回一个 User类型的对象.
@Test
public void selectOne()throws IOException {
//配置文件位置
String resource = "mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//通过配置文件创建SessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
//可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
//读取数据库连接
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过 namespace.id的方式确定要执行的SQL片段
User user = sqlSession.selectOne("test.selectOne",12);
System.out.println(user);
//用完后必须管理连接
sqlSession.close();
}
4.1.1. 参数符号
注意参数符号:#{aa}
这就告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,
这样做更安全,更迅速,通常也是首选做法,因为参数会被双引号 “” 包裹,避免SQL注入,上述语句对应的SQL:
#<!-- #{id}表示占位符:获取传递的参数 ${id}原封不动的拼接-->
SELECT
uid,
username,
birthday,
phone,
sex,
address
FROM `user`
WHERE uid = "10"
参数符号还有另外一种方式: ${id}
有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。 比如 ORDER BY 子句,这时候你可以:
ORDER BY ${columnName}
-- mapper
SELECT
uid,
username,
birthday,
phone,
sex,
address
FROM `user`
ORDER BY ${columnName} DESC
-- 对应的SQL
SELECT
uid,
username,
birthday,
phone,
sex,
address
FROM `user`
ORDER BY uid DESC -- 这里的列名就没有被双引号包裹
4.1.2. 参数类型
parameterType 用于明确参数类型,可以指定这条语句的参数类的全限定名或别名。
这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)
- 参数只有一个
- int / java.lang.Integer
- string
- float
- double
- date
- …
- 参数有多个
- parameterType=“map” / java.util.HashMap
- user / com.czxy.mybatis.model.User
- 使用map和pojo类型传参
UserMapper.xml
<!--参数是map类型 需求:根据手机号或者性别进行查询-->
<select id="listUser" parameterType="map" resultType="user">
SELECT
uid,
username,
birthday,
phone,
sex,
address
FROM `user`
WHERE sex = #{sex}
AND phone like #{phone}
</select>
MyBatisTest类
@Test
public void listUser() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过sqlSession获取与数据库的会话连接,完成各种SQL的执行
SqlSession sqlSession = sqlSessionFactory.openSession();
//准备查询参数
//1. pojo类型
//User user = new User();
//user.setPhone("%"+888+"%");
//user.setSex("1");
//2.map类型参数,注意key必须和占位符名称一致#{key},否则获取不到参数
HashMap<String, Object> map = new HashMap<>();
map.put("phone","%"+888+"%");
map.put("sex","1");
//通过 namespace.id的方式确定要执行的SQL片段
//List<User> list = sqlSession.selectList("test.listUser", user);
List<User> list = sqlSession.selectList("test.listUser", map);
for (User u : list) {
System.out.println(u);
}
//用完后必须管理连接
sqlSession.close()