基于代理 Dao 实现 CRUD 操作
1、查询所有
mapper配置文件:
<select id="findAll" resultType="q.perter.domain.User">
select * from user;
</select>
测试类:List users =userDao.findAll();
2、新增
mapper配置文件:
<insert id="saveUser" parameterType="q.perter.domain.User">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="Integer">
select last_insert_id()
</selectKey>
insert into user(username, birthday, sex, address) values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
测试类:userDao.saveUser(user);
3、修改
mapper配置文件:
<update id="updateUser" parameterType="q.perter.domain.User">
update user set username = #{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} where id=#{id}
</update>
测试类:userDao.updateUser(user);
4、删除
mapper配置文件:
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{uid}
</delete>
测试类:userDao.deleteUser(1);
5、查找一个
mapper配置文件:
<select id="findOne" parameterType="Integer" resultType="q.perter.domain.User">
select * from user where id = #{uid}
</select>
测试类:User user =userDao.findOne(1);
6、模糊查询
方式1
mapper配置文件:
<select id="findByName" parameterType="String" resultType="q.perter.domain.User">
select * from user where username like #{username}
</select>
测试类:List users =userDao.findByName("%王%");
我们在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%,配置文件中的#{username}也只是一个占位符,所以 SQL 语句为: select * from user where username like ?
方式2
mapper配置文件:
<select id="findByName" parameterType="String" resultType="q.perter.domain.User">
select * from user where username like '%${value}%'
</select>
测试类:List<User> users = userDao.findByName("王");
将原来的#{}占位符改成了${value},注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其它名字,执行的语句为:select * from user where username like '%王%'
区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
7、使用聚合函数查询
mapper配置文件:
<select id="findCount" resultType="Integer">
select count(id) from user
</select>
测试类:Integer count =userDao.findCount();
8、补充
当进行数据库操作后除去释放资源外,还应进行事务的提交,即:sqlSession.commit();
因为mybatis默认是不进行事务提交,可以在初始化时,设置为默认提交:factory.openSession(true);
Mybatis 的参数深入
1、Mybatis的参数
参数parameterType输入类型,有以下几种类型:
1)简单数据类型:如String、Integer等,不区分大小写
2)传递pojo对象:就是我们常用的javabean(实体类对象),Mybatis使用ognl表达式解析对象的值,#{}或${}括号中的值为pojo属性名称
ognl表达式:Object Graphic Navigation Language 对象 图 导航 语言
通过对象的取值方法来获取数据,在写法上省略get
如获取用户名称,在类中:user.getUserName();,在ognl表达式中:user.username
在parameterType中已经指定属性所属的类,所以在使用时不需要写对象名,如:#{username}
3)传递pojo包装对象:开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件,这时可以使用包装对象传递输入参数,即:Pojo 类中包含 pojo。
注意:在使用包装对象时,参数parameterType类型为QueryVo,其中包含User对象属性,User对象包含username属性,使用格式为:#{user.username}
2、Mybatis的输出结果封装
输出结果类型包括:
1)简单数据类型,如:Integer
2)Pojo对象:如实体对象(查询一个)
3)Pojo列表:如实体列表(查询所有)
要求:数据库字段名与实体类字段名一致,如果不一致可以通过以下两种方式解决:
1)查询语句中将返回数据结果起别名(执行效率更快,但是每条语句都要修改)
2)使用resultMap来进行匹配(开发效率变快,但是要解析xml)
3、resultMap结果类型
定义resultMap标签:
<!-- 配置查询结果的列名和实体类属性名的对应关系 -->
<resultMap id="userMap" type="q.perter.domain.User">
<!-- 主键字段对应 -->
<id property="userId" column="id"></id>
<!-- 非主键字段对应 -->
<result property="userName" column="username"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userAddress" column="address"></result>
</resultMap>
使用:
在返回查询结果时,不再使用resultType定义的全限定类名,而是使用resultMap属性,如:
<select id="findAll" resultMap="userMap">
select * from user
</select>
Mybatis 传统 DAO 层开发(了解)
通过dao实现类进行mybatis的开发
private SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession){
this.sqlSession = sqlSession;
}
@Override
public List<User> findAll() {
List<User> list = sqlSession.selectList("q.perter.dao.IUserDao.findAll"); //这里的statement为map的key,即:namespace+id(方法名)
return list;
}
Mybatis调用过程(了解)

