单表查询,mapper映射文件讲解,表关系,多表查询
一.MyBatis单表查询
(1)resultMap标签
- 如果数据库返回结果的列名和要封装的实体的属性名完全一致的话用resultType属性
- 如果数据库返回结果的列名和要封装的实体的属性名有不一致的情况用resultMap属性
====使用resultMap==手动建立对象关系映射==
(1)UserMapper接口
// ResultMap标签
public List<User> findAllResultMap();
(2)UserMapper.xml
<!--
resultMap 手动建立映射
id="userResultMap"
type="cn.wsl.domain.User" 建立映射的java类型
id 标签 主键
column="uid" 列名
property="id" 实体属性名
result 标签 普通字段
column="name" 列名
property="username" 实体属性名
-->
<resultMap id="userResultMap" type="cn.wsl.domain.User">
<id column="uid" property="id"></id>
<result column="name" property="username"></result>
<result column="bir" property="birthday"></result>
<result column="gender" property="sex"></result>
<result column="address" property="address"></result>
</resultMap>
<!--
模拟表与实体的属性名不一致情况
-->
<select id="findAllResultMap" resultMap="userResultMap">
SELECT id AS uid, username AS `name`,birthday AS bir ,sex AS gender ,address FROM `user`
</select>
(3)test
// resultMap标签
@Test
public void testFindAllResultMap() throws Exception {
// 获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行sql
List<User> list = userMapper.findAllResultMap();
for (User user : list) {
System.out.println(user);
}
}
(2)多条件查询:(两种方式)
需求:根据id和username查询user表
(1)UserMapper接口
public List<User> findByIdAndUsername01(@Param("id") Integer id, @Param("username") String name);
public List<User> findByIdAndUsername02(User user);
(2)UserMapper.xml
<!--
多条件查询方式一
如果传递多个参数 parameterType属性省略不写...
-->
<select id="findByIdAndUsername1" resultType="cn.wsl.domain.User">
select * from user where id = #{id} and username = #{username}
</select>
<!--
多条件查询方式二
其实mybatis这哥们传递一个参数 parameterType也可以省略【不太建议...】
-->
<select id="findByIdAndUsername2" parameterType="cn.wsl.domain.User" resultType="cn.wsl.domain.User">
select * from user where id = #{id} and username = #{username}
</select>
(3)test
// 多条件查询
@Test
public void test01()throws Exception{
// 获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 方式一
/*List<User> list = userMapper.findByIdAndUsername1(41, "老王");
System.out.println(list);*/
// 方式二
User user = new User();
user.setId(41);
user.setUsername("老王");
List<User> list = userMapper.findByIdAndUsername2(user);
System.out.println(list);
}
(3)模糊查询(四种方式)
需求:根据username模糊查询user表
(1)UserMapper接口
// 模糊查询,方式一
public List<User> findByUsername1(String username);
// 模糊查询,方式二
public List<User> findByUsername2(String username);
// 模糊查询,方式三
public List<User> findByUsername3(String username);
// 模糊查询,方式四
public List<User> findByUsername4(String username);
(2)UserMapper.xml
<!--
模糊查询,方式一
java代码与sql语句有耦合
-->
<select id="findByUsername1" parameterType="string" resultType="User">
select * from user where username like #{username}
</select>
<!--
模糊查询,方式二【了解】
mysql5.5版本之前,此拼接不支持多个单引号
oracle数据库,除了别名的位置,其余位置都不能使用双引号
-->
<select id="findByUsername2" parameterType="string" resultType="User">
select * from user where username like "%" #{username} "%"
</select>
<!--
模糊查询,方式三【此方式,会出现sql注入...】
${} 字符串拼接,如果接收的简单数据类型,表达式名称必须是value
-->
<select id="findByUsername3" parameterType="string" resultType="User">
select * from user where username like '%${value}%'
</select>
<!--
模糊查询,方式四【掌握】
使用concat()函数拼接
注意:oracle数据库 concat()函数只能传递二个参数... 可以使用函数嵌套来解决
-->
<select id="findByUsername4" parameterType="string" resultType="User">
select * from user where username like concat(concat('%',#{username}),'%')
</select>
(3) 测试
// 模糊查询
@Test
public void test02()throws Exception{
// 获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 方式一
// List<User> list = userMapper.findByUsername1("%王%");
// 方式二
// List<User> list = userMapper.findByUsername2("王");
// 方式三
// List<User> list = userMapper.findByUsername3("王");
// 方式四
List<User> list = userMapper.findByUsername4("王");
System.out.println(list);
}
(4&