深入Mybatis参数,返回值,Dao底层实现
一.参数的深入(传递 pojo 包装对象)
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅是包括一个类对象查询条件还包括其它的查
询条件(比如将用户类,用户部门类,同时作为查询条件),这时可以使用包装对象传递输入参数。
用一句话说就是:将所有查询的条件封装到一个poji对象中
将查询条件封装到QueryVo类中
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为poji属性名称 OGNL表达式:Object Graphic Navigation Language 对象 图 导航 语言 它是通过对象的取值方法来获取数据。在写法上把get给省略了。 比如:我们获取用户的名称 类中的写法:user.getUsername(); OGNL表达式写法:user.username mybatis中为什么能直接写username,而不用user.呢: 因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名
测试:
/**
* 测试QueryVo作为查询条件
*
* @throws IOException
*/
@Test
public void testFindUserByVo() throws IOException {
QueryVo vo = new QueryVo();
User user = new User();
user.setUname("%李%");
vo.setUser(user);
List<User> users = userDao.findUserByVo(vo);
for (User u : users) {
System.out.println(u);
}
}
查询结果:
二.返回值的深入(Mysql数据库在windows系统下不区分大小写,Lunix严格区分)
1.实体类属性和数据库字段名尽量一致
字段名和实体类属性对应的才能封装进去,不同的全是null
2.当实体类属性和数据库字段名不一致时
方法一(最简单):
sql语句中给字段名取别名(与实体类属性名对应)
方法二 :
配置 :查询结果的列名和实体类的属性名的对应关系(resultMap:)
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="uSeR">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userMap">
<!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
select * from user;
</select>
三.编写Dao实现类的及其底层实现
public class UserDaoImpl implements IUserDao {
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory;
}
@Override
public List<User> findAll() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现查询列表
List<User> users = session.selectList("com.javasm.dao.IUserDao.findAll");//参数就是能获取配置信息的key
//3.释放资源
session.close();
return users;
}
@Override
public void updateUser(User user) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用方法实现更新
session.update("com.javasm.dao.IUserDao.updateUser",user);
//3.提交事务
session.commit();
//4.释放资源
session.close();
}
}