<insert>
ResultType
指定返回类型UserMapper.java
接口中添加方法/** @param user User对象 */ Integer reg(User user);
UserMapper.xml
文件中添加<insert>
节点java
#{}
中填写的是User
对象的属性名称
<!-- 节点名称取决于须要执行的操做 --> <!-- 例如增长操做应该使用insert节点 --> <!-- id属性(*)的值是Java接口中的方法名称 --> <!-- parameterType属性的值是参数类型 --> <!-- 节点中间编写SQL语句 --> <insert id="reg" parameterType="cn.tedu.spring.entity.User"> INSERT INTO user ( username, password ) VALUES ( #{username}, #{password} ) </insert>
@Test public void testReg() { //加载Spring的配置文件 AbstractApplicationContext ac = new ClassPathXmlApplicationContext( "spring-mvc.xml", "spring-dao.xml"); //获取UserMapper的bean,这个是spring经过扫描mapper.xml文件自动为mybatis自动建立的,首字母小写 UserMapper userMapper = ac.getBean( "userMapper", UserMapper.class); //新建User对象 User user = new User(); user.setUsername("Tom1"); user.setPassword("123456"); //调用reg(user),进行添加,返回的是受影响的行数 Integer affectedRows = userMapper.reg(user); System.out.println( "affectedRows=" + affectedRows); ac.close(); }
mybatis
在处理增长数据的功能时,只是返回受影响的行数
,因此在持久层中并不会返回新增长的Id
,首先,在XML
映射的<insert>
节点中须要添加2
个属性
useGeneratedKeys
:设置是否返回自增主键,若是为true
则返回,默认为false
keyProperty
: 配置自增主键在表中对应的字段 ,由于有时候在表中的自增主键的字段可能不是id
,所以须要指定<!-- 节点名称取决于须要执行的操做 --> <!-- 例如增长操做应该使用insert节点 --> <!-- id属性(*)的值是Java接口中的方法名称 --> <!-- parameterType属性的值是参数类型 useGeneratedKeys: 指定是否返回自增主键,默认为false keyProperty:配置自增主键在表中对应的字段 --> <insert id="reg" parameterType="cn.tedu.spring.entity.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user ( username, password ) VALUES ( #{username}, #{password} ) </insert>
mybatis
执行insert
方法以后,便是调用reg(user)
,返回的仍是受影响的行数
,并非此时的自增主键id
的值。而是在调用这个方法的时候将id
封装到指定的方法参数
中,便是封装到user
中了,所以只有调用者才能够获取id
,而持久层没法获取@Test public void testReg() { //加载Spring的配置文件 AbstractApplicationContext ac = new ClassPathXmlApplicationContext( "spring-mvc.xml", "spring-dao.xml"); //获取UserMapper的bean,这个是spring经过扫描mapper.xml文件自动为mybatis自动建立的,首字母小写 UserMapper userMapper = ac.getBean( "userMapper", UserMapper.class); //新建User对象,此时并无设置id的值 User user = new User(); user.setUsername("Tom1"); user.setPassword("123456"); //调用reg(user),进行添加,返回的是受影响的行数,可是此时已经将id封装到参数User对象中了 Integer affectedRows = userMapper.reg(user); System.out.println( "affectedRows=" + affectedRows); //直接获取Uesr对象中的id值,这个是自增主键返回的值 System.out.println("id = "+user.getId()); ac.close(); }
<delete>
在删除数据的时候,自动会返回受影响的行数,不须要在delete
节点中定义返回类型,只有在查询数据的时候才会定义返回类型git
在UserMapper.java
中添加一个接口方法github
//根据id删除数据,返回受影响的行数,返回1,若是删除失败返回0 Integer deleteUserById(int id);
UserMapper.xml
中配置<delete>
节点<!-- 删除用户数据根据id Integer deleteUserById(int id) parameterType: 指定参数类型,这里也能够不须要指定 --> <delete id="deleteUserById" parameterType="int"> delete from user where id=#{id} </delete>
修改
操做,一般在表中有一个字段is_deleted
标记是否删除,若是执行删除,那么就会设置其值为true
表示已经删除了,那么此时将不会显示在客户端,让客户觉得已经被删除了mybatis
默认支持一个参数,便是定义的接口方法中只能有一个参数@Param()
注解parameterType
指定类型,若是不是基本类型的,规范要求须要使用parameterType
指定类型,可是能够不写@Param()
@Param()
来指定参数,好比Integer ChangePassword(@Param("id")Integer id,@Param("newPassword")String newPassword);
@Param("key")
中的value
在配置增删改查的时候是使用#{key}
表达式取出的mybaits
在处理过程当中,本质上是使用了Map
对参数进行了封装的。便是@Param("")
注解中给出的参数值是Map
中的key
,调用方法时给出的参数值是Map中的value
值,而最终在XML
文件中使用#{}
获取值,实际上是使用Map中的get(key)
方法获取的<update>
在修改数据的时候,mybatis自动返回受影响的行数,所以咱们不须要定义返回类型,默认的返回数据就是受影响的行数spring
在UserMapper.java
接口中定义根据id
修改数据的方法spring-mvc
@Param()
注解来标记多个参数
/** * 修改密码 * @param id id * @param newPassword 新密码 * @return 受影响的行数 */ Integer ChangePassword(@Param("id")Integer id,@Param("newPassword")String newPassword);
在UserMapper.xml
中添加<update>
节点mybatis
#{}
表达式中的字段为@Param("value")
中的value
<!-- 修改密码 Integer ChangePassword(@Param("id")Integer id,@Param("newPassword")String newPassword); --> <update id="ChangePassword"> update user set password=#{newPassword} where id=#{id} </update>
@Test public void testChangePassword() { //加载Spring的配置文件 AbstractApplicationContext ac = new ClassPathXmlApplicationContext( "spring-mvc.xml", "spring-dao.xml"); //获取UserMapper的bean,这个是spring经过扫描mapper.xml文件自动为mybatis自动建立的,首字母小写 UserMapper userMapper = ac.getBean( "userMapper", UserMapper.class); //调用删除的方法 int affectRow=userMapper.ChangePassword(3, "12345895"); System.out.println(affectRow); ac.close(); }
oldPassword
newPassword
id
查找用户信息
select * from user where id=? and password=?
,由于这个是不区分大小写的,咱们应该先根据id
获取用户信息,再比较password
UserserviceImpl
中完成验证逻辑,若是用户不存在,那么抛出用户不存在的异常,若是存在就验证原密码和是否匹配oldPassword
和用户信息中的原密码
是否相同了,若是不相同,抛出密码不匹配的异常
,若是相同,那么就能够修改密码UserService
中编写逻辑public void ChangePasssword(Integer id, String oldPassword, String newPassword) throws UserNotFoundException, PasswordNotMatchException{ User user=this.findUserById(id); //获取用户信息 if (user==null) { //若是用户信息不存在 throw new UserNotFoundException("操做失败,用户信息不存在"); }else { //用户存在,则判断原密码 if (user.getPassword().equals(oldPassword)) {//若是密码匹配 userMapper.ChangePassword(id, newPassword); //修改密码 }else { //原密码不匹配 throw new PasswordNotMatchException("操做失败,原密码不正确"); } } }
Controller
中若是要调用这个ChangePasssword
将会经过处理异常来判断哪里是出错了,并给出友好的提示<select>
id
的查询返回的查询结果就是单条数据,好比:select * from user where id=1
接口方法
的时候,只须要返回一个实体类对象
便可/** * 根据id查询用户信息 * @param id 用户id * @return 返回User对象 */ User findUserById(Integer id);
UserMapper.xml
中配置<select>
节点
resultType
指定返回的类型,由于参数是基本类型,所以不须要使用parameterType
指定参数类型<select id="findUserById" resultType="cn.tedu.spring.entity.User"> select * from user where id=#{id} </select>
List<>
集合来接收返回的结果,不能直接使用实体类对象
来接收UserMapper.java
中定义接口方法/** * 根据密码查找用户 * @param password 用户密码 * @return 返回的是一个用户的集合 */ List<User> findUserByPassword(String password);
UserMapper.xml
中添加<select>
节点
resultType
虽然返回的是User集合
,可是这里的类型仍是须要写User类型parameterType
<!-- List<User> findUserByPassword(String password); resultType: 虽然返回的是User集合,可是这里的类型仍是须要写User类型 --> <select id="findUserByPassword" resultType="cn.tedu.spring.entity.User"> select * from user where password=#{password} </select>
@Test public void testFindUserByPassword() { //加载Spring的配置文件 AbstractApplicationContext ac = new ClassPathXmlApplicationContext( "spring-mvc.xml", "spring-dao.xml"); //获取UserMapper的bean,这个是spring经过扫描mapper.xml文件自动为mybatis自动建立的,首字母小写 UserMapper userMapper = ac.getBean( "userMapper", UserMapper.class); //获取User集合 List<User> users=userMapper.findUserByPassword("12345895"); System.out.println(users); ac.close(); }
xxMapper.xml
中配置的节点的id
要和xxMapper.java
中的方法名
相同@Param("")
指定多个参数,不过在使用#{}
取值的时候要和@Param("")
中的参数一致自增主键
的值包装类
,好比Integer age**
<select>
节点,那么必须写返回类型resultType
,不管是基本型仍是其余类型