- 一、增
- 1、在dao接口中创建一个抽象方法
- 2、在映射配置文件中
- 3、在执行的时候一定不要忘记sqlSession.commit()
- 二、保存操作的细节,获取保存数据的id
- 1、在dao接口中创建一个方法
- 2、在映射文件中这样写
- 3、然后再注册该mapper,
- 4、在测试类写的注意事项
- 三、改
- 1、在UserDao接口上新建一个方法
- 2、在映射配置文件中写sql
- 3、在主配置文件中注册上
- 4、在测试文件中写测试方法
- 四、删除
- 1、给UserDao接口上新建一个方法
- 2、在映射配置文件中写sql
- 3、在主配置文件中注册
- 4、在测试文件中写测试方法
- 五、根据Id查询用户
- 六、Like查询
- 4、Test类
- 七、详解Like 查询中 #{} 和 ‘${value}’的差距
- 八、查询总用户 (一行一列型)
- 4、测试方法
一、增
在环境搭建好的基础上
1、在dao接口中创建一个抽象方法
public interface UserDao {
int saveUser(User user);
}
2、在映射配置文件中
<!--namespace 写dao接口的全名 代包名-->
<mapper namespace="com.yixuexi.dao.UserDao">
<!--id 写dao接口中的方法名字 不带()-->
<!--parameterType 写对应那个实体类 从那个实体类中取数据 输入参数类型-->
<insert id="saveUser" parameterType="com.yixuexi.entity.User">
<!--取数据用 #{属性名或者getId() 都可以}-->
insert into user(id,name,password) values(#{id},#{name},#{password})
</insert>
</mapper>
3、在执行的时候一定不要忘记sqlSession.commit()
二、保存操作的细节,获取保存数据的id
Select last_insert_id(); 会查询到最后一次保存的id
1、在dao接口中创建一个方法
//保存一个User 并且返回该User的id
Integer saveUserReturnId(User user);
2、在映射文件中这样写
<!--id写到接口中方法名 parameterType输入参数类型-->
<!--useGeneratedKeys:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中-->
<insert id="saveUserReturnId" keyProperty="id" useGeneratedKeys="true" parameterType="com.yixuexi.entity.User">
insert into user(name,password) values(#{name},#{password})
</insert>
3、然后再注册该mapper,
(已经注册过的不需要在注册)
4、在测试类写的注意事项
- 返回的值并不是id属性
- 要想得到id属性从user对象中getId即可
- 一定不要忘记 session.commit();
- id必须为主键并且自增长 auto_increment
三、改
在环境搭建好的基础上
1、在UserDao接口上新建一个方法
public interface UserDao {
//用户更改的方法
void updateUser(User user);
}
2、在映射配置文件中写sql
<update id="updateUser" parameterType="com.yixuexi.entity.User">
update user set name = #{name},password = #{password} where id = #{id}
</update>
3、在主配置文件中注册上
<mappers>
<mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
</mappers>
4、在测试文件中写测试方法
注意最后一定要SqlSession.commit(); // 提交
四、删除
在环境搭建好的基础上
1、给UserDao接口上新建一个方法
public interface UserDao {
void deleteUser(Integer id);
}
2、在映射配置文件中写sql
类型不是User而是Integer
<update id="deleteUser" parameterType="java.lang.Integer">
取值直接用#{}
delete from user where id = #{id}
</update>
3、在主配置文件中注册
<mappers>
<mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
</mappers>
4、在测试文件中写测试方法
注意最后一定要SqlSession.commit();
五、根据Id查询用户
1、在dao接口中
public interface UserDao {
//查询一个的方法,根据id查询
User findOne(Integer id);
}
2、在映射配置文件中
<mapper namespace="com.yixuexi.dao.UserDao">
<!--
resultType写最后封装到哪里,
parameterType 写值是什么类型
-->
<select id="findOne" resultType="com.yixuexi.entity.User" parameterType="java.lang.Integer">
select * from user where id = #{id}
</select>
</mapper>
3、在主配置文件中注册
<mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
测试
六、Like查询
1、在接口中定义一个抽象方法
//模糊查询like [通过名字查询]
List<User> findLike(String name);
2、在映射文件中写sql
<select id="findLike" resultType="com.yixuexi.entity.User" parameterType="String">
select * from user where name like #{name}
Select * from user where name like '%${value}%';
也可以这样,不过这个value是固定的,% 是占位符【不常用】
测试类中调用 方法的时候就不需要再提供 % 占位符了
</select>
3、在主配置文件中配置
(如果配置了就不需要再配置了)
4、Test类
注意事项:再测试传值的时候 一定要带上占位符,因为在映射配置文件中不能写 % _
List<User> like = mapper.findLike("%曹%");
七、详解Like 查询中 #{} 和 ‘${value}’的差距
- #{}在传参的时候需要字符串添加 占位符 % _
- 使用的是预编译的数据库操作对象,更加安全 不会有
SQL
注入 - PrepatedStatement
- 常用,但是不能用作排序查询
- 使用的是预编译的数据库操作对象,更加安全 不会有
- ${value} 可以直接在映射文件中写占位符 ${%vlaue%}
- 使用的是 普通的数据库操作对象 可能会产生
SQL
注入问题 - Statement
- 一般可以使用在 排序查询的时候,传进去 ${value} desc / asc
- 不管传进来的是什么 都是
${value}
- 使用的是 普通的数据库操作对象 可能会产生
select * from user order by id ${value}
八、查询总用户 (一行一列型)
1、在dao接口中添加方法
//测试查询总记录条数
Integer countAll();
2、在映射配置文件中配置
只需要配置一个 结果界类型 resultType即可
<select id="countAll" resultType="Integer">
select count(*) from user
</select>