SQL的映射文件

使用MyBatis 实现条件查询 SQL映射文件

mapper:映射文件的根元素节点,只有一个属性namespace(命名空间),其作用如下:

用于区分不同的mapper,全局唯一

绑定DAO接口,即面向接口编程,当namespace绑定某一接口之后,可以不用写该接口的实现类, MyBatis会通过接口的完全限定名查找到对应的mapper配置来执行SQL语句,因此namespace的命名必须要跟接口同名

cache:配置给定命名空间的缓存
cache-ref:从其他命名空间引用缓存配置
resultMap:用来描述数据库结果集和对象的对应关系
sql:可以重用的SQL块,也可以被其他语句引用
insert:映射插入语句
update:映射更新语句
delete:映射删除语句
select:映射查询语句

注意:在不同的Mapper文件中,子元素的id可以相同,Mybatis通过namespace和子元素的id联合区分,接口中的方法与映射文件中SQL语句id应一一对应

使用select完成单条件查询 <!--根据用户名查询用户列表(模糊查询)--> <select resultType="User" parameterType="string"> SELECT * FROM USER WHERE userName LIKE concat('%',#{userName},'%') </select>

各属性介绍:
id:命名空间中唯一的标识符,可以被用来引用这条语句
parameterType:表示查询语句传入参数的类型的完全限定名或别名。
resultType:查询语句返回结果类型的完全限定名或别名别名表

使用select完成多条件查询

编写接口

public interface UserMapper{ //查询用户列表(参数:对象入参) List<User> getUserListByUser(User user); }

编写映射文件

<select resultType="User" parameterType="User"> SELECT * FROM USER WHERE userName LIKE concat('%',#{userName},'%') and userRole=#{userRole} </select>

编写测试

public void testGetUserList(){ SqlSession sqlSession=null; List<User> userList=new ArrayList<User>(); try{ sqlSession=MyBatisUtil.createSqlSession(); User user=new User(); user.setUserName("王"); user.setUserRole(3); userList=sqlSession.getMapper(UserMapper.class).getUserListByUser(user); }catch (Exception ex){ ex.printStackTrace(); }finally { MyBatisUtil.closeSqlSession(sqlSession); } for (User user: userList) { System.out.println("userName:"+user.getUserName()+"\t"+"userRole:"+user.getUserRole()); } }

当然也可以用别的方式入参,大家可以多试一试,都是大同小异的

使用resultMap完成查询结果的展示

resultMap的意思就是我们数据库的字段和我们实体类中的属性不一致的时候或者我们做一些复杂的查询,需要使用到resultMap 比如:我们有一个用户类,这里面有一个角色id 但是没有角色的名字,但是我们想要查这个角色的名字,这个时候我们就可以用到resultMap,具体操作请看下面示例 首先现在User(用户)类中加入角色名字这个属性

private String roleName;//角色名称 //省略getter和setter

编写UserMapper.xml文件,修改其中的getUserList方法

<select resultMap="userList" parameterType="User"> SELECT u.*,r.roleName FROM USER u,Role r WHERE u.userName LIKE concat('%',#{userName},'%') AND u.userRole=#{userRole} AND u.userRole=r.id </select> 添加id为userList的resultMap元素节点 <resultMap type="User"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="phone" column="phone"/> <result property="birthday" column="birthday"/> <result property="gender" column="gender"/> <result property="userRole" column="userRole"/> <result property="userRoleName" column="roleName"/> </resultMap>

编写测试

public void testGetUserList(){ SqlSession sqlSession=null; List<User> userList=new ArrayList<User>(); try{ sqlSession=MyBatisUtil.createSqlSession(); User user=new User(); user.setUserName("王"); user.setUserRole(3); userList=sqlSession.getMapper(UserMapper.class).getUserList(user); }catch (Exception ex){ ex.printStackTrace(); }finally { MyBatisUtil.closeSqlSession(sqlSession); } for (User user: userList) { System.out.println(user.getUserName()+"\t"+user.getUserRole()+"\t"+user.getUserRoleName()); } }

resultMap元素的属性值和子节点:
id属性:唯一标识,此id值用于select元素resultMap属性的引用
type属性:表示该resultMap的映射结果类型
result子节点:用于标识一些简答的属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的赋值给实体对象的哪个属性

resultType和resultMap的异同点及场景
1.resultType直接表示返回类型,包括基本数据类型和复杂数据类型
2.resultMap则是对外部resultMap定义的引用,对应外部resultMap的id
3.MyBatis的每个查询映射的返回类型都是resultMap,当我们提供的返回类型是resultType,会自动赋值给指定属性
4.resultMap自动映射界别默认映射级别为PARTIAL,在resultMap没有做映射关联时也能自动匹配。
当然也可以把自动匹配关掉

<settings> <!--设置resultMap的自动映射级别为NONE(禁止自动匹配)--> <setting value="NONE"/> </settings> 使用Mybatis实现增删改查操作 使用insert完成增加操作

在接口中添加add()方法

public int add(User user);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxsjf.html