Mybatis使用
1. <insert>元素
很多时候,执行插入操作后,需要获取插入成功的数据生成的主键值,不同类型数据库获取主键值的方式不同,下面分别对支持主键自动增长的数据库获取主键值和不支持主键自动增长的数据库获取主键值的方式进行介绍。
如果使用的数据库支持主键自动增长(如MySQL和SQL Server),那么可以通过keyProperty属性指定类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true。
<insert id="addUser" parameterType="com.itheima.pojo.User" keyProperty="uid" useGeneratedKeys="true" > insert into users(uid,uname,uage)values(#{uid},#{uname},#{uage}) </insert>
使用不支持主键自动增长的数据库获取主键值。
<insert id="insertUser" parameterType="com.itheima.pojo.User" > <selectKey keyProperty="uid" order="AFTER" resultType="Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into users(uid, uname, uage) values (#{uid}, #{uname}, #{uage}) </insert>
如果设置为BEFORE,那么它会首先执行<selectKey>元素中的配置来设置主键,然后执行插入语句;如果设置为AFTER,那么它先执行插入语句,然后执行<selectKey>元素中的配置内容。
2. <update>元素的更新使用
<update>元素用于映射更新语句,它可以更新数据库中的数据。在执行完元素中定义的SQL语句后,会返回更新的记录数量。使用<update>元素执行更新操作非常简单,示例代码如下:
<!—更新操作 -->
<update id="updateUser" parameterType="com.itheima.pojo.User">
update users set uname= #{uname},uage = #{uage} where uid = #{uid}
</update>
3. <delete>元素的删除使用
<delete>元素用于映射删除语句,在执行完<delete>元素中的SQL语句之后,会返回删除的记录数量。使用<delete>元素执行删除操作非常简单,示例代码如下所示:
<delete id="deleteUser" parameterType="Integer"> delete from users where uid=#{uid} </delete>
4. <sql>元素的作用
在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量。针对此问题,可以在映射文件中使用MyBatis所提供的<sql>元素,将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用。 <sql>元素的作用是定义可重用的SQL代码片段,它可以被包含在其他语句中。<sql>元素可以被静态地(在加载参数时)参数化,<sql>元素不同的属性值通过包含的对象发生变化。
<!--定义要查询的表 --> <sql id="someInclude"> from users </sql> <!--定义查询列 --> <sql id="userColumns">uid,uname,uage</sql> <!--根据客户id查询客户信息 --> <select id="findUserById" parameterType="Integer" resultType="com.itheima.pojo.User"> select <include refid="userColumns"/> <include refid="someInclude"> </include> where uid = #{uid} </select>
进阶用法
通过property标签动态传参,使用时用 ${PROPERTY_NAME}
在 if 等标签和代码段中都可使用
<select id="selectById" resultMap="BaseResultMap"> select my.* FROM sys_user my <include refid="test"> <property name="testVal" value="1"/> </include> </select> <sql id="test"> <if test="${testVal} != null"> WHERE my.id = ${testVal} </if> </sql> -- 执行结果:select my.* FROM sys_user my WHERE my.id = 1
注意:
mybatis中有两种传入动态参数的方式:#{}和${}
#{} 占位符:对传入的参数会做预编译,也就是会当做字符串来处理
${} 拼接符:对传入的参数不会做任何的处理,也就是说传递什么就是什么
举例:
1. select * from sys_user where id = #{id} and name = #{name}
最后执行的sql:select * from sys_user where id = ‘1’ and name = ‘zhangsan’
2. select * from sys_user where id = ${id} and name = ${name}
最后执行的sql:select * from sys_user where id = 1 and name = zhangsan (这里zhangsan没有单引号,因此会报错。如果需要加单引号,则需要手动在传参时传入。)
改进版本:
<!--定义要查询的表 --> <sql id="someInclude"> from ${include_target} </sql> <!--定义查询列 --> <sql id="userColumns">uid,uname,uage</sql> <!--根据客户id查询客户信息 --> <select id="findUserById" parameterType="Integer" resultType="com.itheima.pojo.User"> select <include refid="userColumns"/> <include refid="someInclude"> <property name="include_target" value="users"/> </include> where uid = #{uid} </select>
5. <resultMap>元素的作用
<resultMap>元素表示结果映射集,是MyBatis中最重要也是功能最强大的元素。<resultMap>元素主要作用是定义映射规则、更新级联以及定义类型转化器等。 数据表中的列和需要返回的对象的属性可能不会完全一致,这种情况下MyBatis不会自动赋值,这时就需要使用<resultMap>元素进行结果集映射。例如将User中的年龄字段改为如下:
package com.itheima.pojo; public class User { private int uid; //用户id private String uname; //用户姓名 private int myAge; //用户年龄 public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public int getMyAge() { return myAge; } public void setMyAge(int myAge) { this.myAge = myAge; } @Override public String toString() { return "User{" + "uid=" + uid + ", uname='" + uname + '\'' + ", myAge=" + myAge + '}'; } }
在xml文件中写入如下代码
<resultMap type="com.itheima.pojo.User" id="userMap"> <id property="uid" column="uid"/> <result property="uname" column="uname"/> <result property="myAge" column="uage"/> </resultMap> <select id="findAllStudent" resultMap="userMap"> select * from users </select> <select id="findById" parameterType="int" resultType="com.itheima.pojo.User"> select * from users where uid = #{id} </select>
创建测试类MyBatisTest,在测试类中,编写测试方法findAllStudentTest(),用于测试<resultMap>元素实现查询结果的映射。
public class UserTest { @Test public void userFindByIdTest() { //读取文件名 String resources = "mybatis-config.xml"; //创建流 Reader reader = null; try { //读取mybatis-config.xml文件内容到reader对象中 reader = Resources.getResourceAsReader(resources); } catch (IOException e) { e.printStackTrace(); } //初始化mybatis数据库,创建SqlSessionFactory类的实例 SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader); //创建SqlSession实例 SqlSession session = sqlMapper.openSession(); List<User> list = session.selectList("findAllStudent"); for (User tmpUser : list) { System.out.println(tmpUser.toString()); } User user2 = session.selectOne("findById", 2); System.out.println(user2.toString()); //关闭session session.close(); } }