Mybatis框架(2)

基于代理 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调用过程(了解)


通过dao实现Mybatis的调用过程


通过代理的实现Mybatis的过程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容