MyBatis增删改查快速上手
作为一个快乐的小码农,在每一个阶段往往都在重复写着不同版本的,学生管理,用户管理,注册登录,从JavaSE的控制台版,或者GUI版,再到JavaWeb的JSP版,再到纯粹使用HTML作为前端展示的版本,以及使用一个更新的技术,在此其中,我们用过txt做数据库,用XML也可以,到现在常用的MySQL,增删改查一直是我们必不可少的一部分内容,即使你不懂原理,即使你对这个技术的理解不是很深刻,拿出你的增删改查,噼里啪啦就是一段乱敲,好歹还是能让你着手先做起来(当然,对技术的理解还是很重要的),今天就和大家聊一聊MyBatis这门技术的CURD(增删改查)
优化测试方法
在测试方法中,读取配置文件,生产SqlSession,释放资源等等,在每一测试方法的时候,都是重复的,所以我们完全可以提出出这一部分,防止大量的重复代码
@Before publicvoidinit()throwsException{ //读取配置文件 inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory工厂 SqlSessionFactoryfactory=newSqlSessionFactoryBuilder().build(inputStream); //使用工厂生产SqlSession对象 sqlSession=factory.openSession(); //使用SqlSession创建Mapper接口的代理对象 userMapper=sqlSession.getMapper(UserMapper.class); } @After publicvoiddestroy()throwsException{ sqlSession.close(); inputStream.close(); }
在这两个方法上增加@Before和@Aftrer注解,就可以保证,init()和destory()这两个方法,分别在我们真正被测试的方法的前后执行
(一)增添操作(1)编写代码
首先,在UserMapper接口中增加对应的方法
publicinterfaceUserMapper{ /** *增加用户 *@paramuser */ voidaddUser(Useruser); }
接着,在SQL映射文件中,增加新增的映射配置,这些有关内容放在
insertintouser(username,telephone,birthday,gender,address)values(#{username},#{telephone},#{birthday},#{gender},#{address})
(2)说明:
1、id属性,自然是对应的方法名,而由于这里,我们并不需要拿到返回信息,所以这里并没有返回参数resultType,而方法中的参数又为一个JavaBean类,也就是User实体类,所以需要在标签属性中,添加一个parameterType属性,其中需要指定这个实体类
2、在文本中书写插入的SQL语句,由于实体类中已经快捷生成了对应的getset方法,所一可以使用#{}的方式代表对应的值
3、提示,数据库中id为自增,所以并不需要设置id
(3)注意:
由于添加是更新类的语句,所以在执行插入语句后,需要提交事务,也就是执行对应的commit方法,以提交更新操作,若没有这一句,即使不会报错,也无法正常存入,会被回滚,且这个id被占用
(4)测试代码:
/** *测试新增用户 *@throwsException */ @Test publicvoidtestUpdateUser()throwsException{ Useruser=newUser(); user.setId(17); user.setUsername("修改"); user.setTelephone("18899999999"); user.setBirthday(newDate()); user.setGender("女"); user.setAddress("广州"); //执行方法 userMapper.updateUser(user); }
(5)执行结果:
控制台:
(6)获取新增用户的id值
首先对于MySQL自增主键来说,在执行insert语句之前,MySQL会自动生成一个自增主键,insert执行后,通过SELECTLAST_INSERT_ID()可以获取这条刚插入记录的自增主键
在SQL映射配置文件中,需要借助
注:该标签插入到中
SELECTLAST_INSERT_ID();
测试一下
@Test publicvoidtestAddUser()throwsException{ Useruser=newUser(); user.setUsername("增加"); user.setTelephone("12266660000"); user.setBirthday(newDate()); user.setGender("男"); user.setAddress("珠海"); System.out.println("执行插入前"+user); //执行方法 userMapper.addUser(user); System.out.println("执行插入后"+user); }
执行效果
(二)修改操作(1)编写代码
在UserMapper接口中增加修改方法
publicinterfaceUserMapper{ /** *更新用户 *@paramuser */ voidupdateUser(Useruser); }
在SQL映射文件中增加语句,内容包括在
updateusersetusername=#{username},telephone=#{telephone},birthday=#{birthday},gender=#{gender},address=#{address}whereid=#{id}
(2)测试代码
/** *测试新增用户 *@throwsException */ @Test publicvoidtestAddUser()throwsException{ Useruser=newUser(); user.setUsername("增加"); user.setTelephone("12266668888"); user.setBirthday(newDate()); user.setGender("女"); user.setAddress("成都"); //执行方法 userMapper.addUser(user); }
(3)执行效果
(三)删除操作(1)编写代码
接口中增加删除方法
publicinterfaceUserMapper{ /** *删除用户 *@paramuid */ voiddeleteUser(Integeruid); }
在SQL映射文件中,使用
deletefromuserwhereid=#{id}
(2)测试代码
/** *测试删除用户 *@throwsException */ @Test publicvoidtestDeleteUser()throwsException{ //执行方法 userMapper.deleteUser(17); }
(3)执行效果
(四)模糊查询
由于查询全部非常简单,这里就不展示了,基本流程都是一样的
(1)编写代码
在UserMapper接口中编写方法
publicinterfaceUserMapper{ /** *通过姓名模糊查询 *@paramusername *@return */ ListfindByName(Stringusername); }
在SQL映射文件中新增查询语句
select*fromuserwhereusernamelike#{username}
(2)测试代码
/** *测试模糊查询 *@throwsException */ @Test publicvoidtestFindByName()throwsException{ Listusers=userMapper.findByName("%张%"); for(Useruser:users){ System.out.println(user); } }
(3)注意
在使用模糊查询的时候,我们需要在查询条件的两侧拼接两个“%”字符串,这个时候有两种解决方案,一种就是像在我上述代码中,在测试时将字符串补充完整,还有一种方式就是使用${},它在SQL配置文件中代表一个“拼接符号”,也就是说可以这样写SQL语句
select*fromuserwhereusernamelike'%{value}'
可接受的类型有,普通类型(此情况下{}内部只能写value),JavaBean,HashMap
但是使用%{}拼接字符串的时候,会引起SQL注入,所以不是很推荐使用
(4)执行效果
(五)自定义包装类作为查询条件
Mapper的输入映射样例中,我们对于基本数据类型和基本数据包装类,都有了一定的了解,而下面我们来聊一聊关于相对复杂的一种情况,那就是自定义包装类
先讲一个需求:还是关于用户的查询,但是查询条件复杂了一些,不仅仅局限于用户的信息,而且可能还包括订单,购物车,或者与用户一些行为相关的信息,那么如何实现这样一种需求呢?
那我们想,可不可以,在User类中增加一些我们需要的信息
从代码的角度来看,在User中添加的字段与数据库不一定能对应起来,在原来的基础上做修改,就会影响User作为数据库映射对象的功能,所以我们可以创建一个UserInstance类,继承User类就可以在其中为某些业务添加一些不属于数据库的字段了
(1)定义包装类
packagecn.ideal.domain; publicclassQueryUserVo{ privateUserInstanceuserInstance; publicUserInstancegetUserInstance(){ returnuserInstance; } publicvoidsetUserInstance(UserInstanceuserInstance){ this.userInstance=userInstance; } //其他查询条件,例如订单,购物车等等 }
(2)配置Mapper文件
我们这里使用用户的性别以及对姓名的模糊查询,来写SQL当然,你也可以自己通过别的信息写SQL
select*fromuserwhereuser.gender=#{userInstance.gender}anduser.usernamelike#{userInstance.username}
在QueryUserVo中,封装的是查询信息的各种对象,为什么上述代码可以直接通过userInstance.gender直接取出对应的属性,这种方式叫做OGNL表达式,在类中我们的写法通常是user.getUsername但在写法上,OGNL表达式将get给省略了
(3)测试代码
/** *包装对象作为查询参数 *@throwsException */ @Test publicvoidtestFindUserByVo()throwsException{ //创建包装对象,设置查询条件 QueryUserVoqueryUserVo=newQueryUserVo(); UserInstanceuserInstance=newUserInstance(); userInstance.setGender("女"); userInstance.setUsername("%张%"); queryUserVo.setUserInstance(userInstance); //调用UserMapper的方法 ListuserInstances =userMapper.findUserByVo(queryUserVo); for(UserInstanceu:userInstances){ System.out.println(u); } }
(4)执行效果
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。