一些配置参数的说明
parameterType:
在映射文件中通过parameterType指定输入参数的类型
resultType:
在映射文件中通过resultType指定输出结果的的类型
#{}和${}
#{}表示一格占位符,不会引起sql注入
${}表示一格拼接符号,会引起sql注入,所以不建议使用${}
selectOne()和selectList()
selectOne表示查询出一条记录进行映射,如果使用slectOne可以实现,使用selectList也可以实现,只不过结果是只包含一个元素的列表。
selectList表示查询出一个列表(多条记录)进行映射,当需要查询多条记录的时候,不能使用selectOne去查询。
测试案例:一个本该列表查询的语句,我故意使用selectOne去调用:
User list11 =sqlSession.selectOne("test.findUserByName",userName);
将会产生一个运行时你报错,如图:
以下分别是增删改查用户表的操作
查询用户
两个查询用户的statement语句配置demo,如下代码:
<select id="findUserById" parameterType="int" resultType="cn.mytest.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
<!-- 根据用户名模糊查询用户信息,可能返回多条,以查询用户名包含‘赵’这个字为例,具体 LIKE 关键字表示字符串匹配,如果传入常量‘赵六’则表示查找用户名等‘赵六’的人
resultType:指定的就是单挑记录所映射的java对象类型
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,使用${}拼接sql,引起sql注入,如输入串为'OR 1=1' (始终为真)
${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.mytest.mybatis.po.User">
SELECT * FROM USER WHERE NAME LIKE '%${value}%'
</select>
添加用户
user表的主键id资源,不要指定默认值并且勾选“自增”选项,这样插入表的时候就不需要填写id值了,如图表结构信息,此外Unsigned也需要勾选,我试过,不勾选,插入语句会“主键值插入1”的错误。我怀疑是修改完表妹立即刷新的结果(感觉Unsigned不是必须修改)
插入用户的Demo表达式:
//demo3:插入用户信息
//插入用户对象--主键自增的方式
try {
User insertItemUser=new User();
insertItemUser.setName("Stephanie123");
insertItemUser.setAge(12);
sqlSession.insert("test.insertUser",insertItemUser);
//提交事务,保存
sqlSession.commit();
System.out.println("插入数据库成功!");
}
catch (Exception e)
{
System.out.println("插入数据库失败!e="+e);
}
获取刚刚插入记录的主键id
表属性为主键自增的方式时:
进一步改进InsertUser的定义,使得可以获得user(id主键为自增方式下),刚刚插入那条记录的用户id:
<insert id="insertUser" parameterType="cn.mytest.mybatis.po.User">
<!-- 将插入数据的主键返回,返回到User对象中
SELECT LAST_INSERT_ID():得到刚Insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到主键设置到parameterType指定的对象的哪个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于Insert语句来说它的执行顺序
resutType:指定返回id的类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO USER(user.`name`,user.`age`) VALUES(#{name},#{age})
</insert>
在之前的sqlSesion.commit()逻辑之后,通过如下代码测试查看新插入记录的用户id:
//获取用户信息主键
//自增主键的返回,MySQL的自增主键:指定Insert提交之前自动生成一个自增主键。
//通过MySQL函数获得刚刚插入记录的自增主键:LAST_INSERT_ID(),是在Insert语句之后调用
System.out.println("用户id="+insertItemUser.getId());
表属性为主键非自增的方式时:使用uuid()
使用MySQL的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成36位。(老师讲错了,uuid()生成的字符串长度实际为36位)
执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中;
指定uuid()语句顺序相对于Insert函数之前。
如下先是为使用非自增主键的statement的调用,我新加了insertUser2这个statement:
sqlSession.insert("test.insertUser2",insertItemUser);
此外,相应的增加Mapper.xml中的配置:
<!-- 使用MySQL的uuid()生成主键
执行过程:
首先通过uuid()得到主键,将主键设置为user对象的id属性中
其次在Insert执行时,从user对象中取出id属性值
order:指的是该项执行在insert语句之前还是之后,uuid()函数是执行在Insert之前
-->
<insert id = "insertUser2" parameterType="cn.mytest.mybatis.po.User">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT uuid()
</selectKey>
INSERT INTO USER(user.id,user.`name`,user.`age`) VALUES(#{id},#{name},#{age})
</insert>
并且,User.java数据结构类的主键id也得是String类型,数据库表user的主键类型也得是varchar(36)类型
修改用户 和删除用户
懒得写了,只粘statement配置了。