1、接口编写
public interface UserMapper {
//查询所有用户
ArrayList<User> getUser();
//添加用户
int insertUser(User user);
//根据主键删除用户
int deleteUser(int id);
//根据主键修改用户
int updateUser(User user);
}
避免程序写死 修改功能 需要传入的参数 必须也得是对象
增删改返回值都是int 查询的返回值是一个集合
2、sql语句配置
<mapper namespace="com.llf.Mapper.UserMapper">
<!--id mapper接口名
resulsetType 要返回的类型 如果是集合 就写泛型的地址-->
<select id="getUser" resultType="com.llf.pojo.User">
select * from user
</select>
<insert id="insertUser" parameterType="com.llf.pojo.User">
insert into User (id,name,password,email,birthday)
values (#{id},#{name},#{password},#{email},#{birthday})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUser" >
update user set password=#{password} ,email=#{email},birthday=#{birthday} where id=#{id}
</update>
</mapper>
8.2.1、参数解释:
namespace:需要注册的接口的绝对路径 也就是编写的Mapper接口的路径
id:需要实现的接口的方法名
resulsetType :要返回的类型 如果是集合 就写泛型的地址
parameterType:参数类型 int 可以省略不写 如果是泛型 就写实体类的绝对地址
3、测试类测试
@Test
public void update(){
SqlSession session = MybatisUtils.getsession();
UserMapper mapper = session.getMapper(UserMapper.class);
String date="1998-02-03";
Date date1 = DateUtil.string2Date(date);
mapper.updateUser(new User(4, "赵六", "12456", "zl@qq.com", date1));
session.commit();
MybatisUtils.closeSqlSession();
}
在测试的过程中,需要注意的是 增删改都需要事务的提交(session.commit()), 否则数据库不会有变化 查询可以不用提交事务
4、使用map传递参数
Hashmap<>可以使用键值对的方式传递参数,与常规的对象传递参数相比
1、Hashmap可以自己定义参数的名字 而对象传参必须与实体类的变量名字一致
2、当一个表中字段较多 ,而我们需要对其进行更新操作时,使用对象传参我们需要将这些字段全部写出来,
使用Hashmap 我们可以只传递我们需要修改的字段的值即可
Mapper接口区别
//根据主键修改用户
int updateUser(User user);
//使用map更新信息
int updateUser1(HashMap<String,Object> map);
sql语句配置区别 注意两者的参数类型的变化
<update id="updateUser" parameterType="com.llf.pojo.User">
update user set password=#{password} ,email=#{email},birthday=#{birthday} where id=#{id}
</update>
<update id="updateUser1" parameterType="map">
update user set password=#{password} where id=#{userid}
</update>
我们可以验证 通过对象传参 参数必须和对象的成员变量一致 通过map传值 可以自定义参数的键
test测试
@Test
public void update(){
SqlSession session = MybatisUtils.getsession();
UserMapper mapper = session.getMapper(UserMapper.class);
String date="1998-02-03";
Date date1 = DateUtil.string2Date(date);
mapper.updateUser(new User(4, "赵六", "12456", "zl@qq.com", date1));
session.commit();
MybatisUtils.closeSqlSession();
}
@Test
public void update1(){
SqlSession session = MybatisUtils.getsession();
UserMapper mapper = session.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("password","1234566");
map.put("userid",4);
int i = mapper.updateUser1(map);
System.out.println(i);
session.commit();
MybatisUtils.closeSqlSession();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JY0gEwUz-1624684157154)(C:\Users\machenike\AppData\Roaming\Typora\typora-user-images\image-20210626123848769.png)]
两种方法都可以实现参数的传递 但是 正规的用法应该是对象传参的方式 map传参属于我们说的野路子 不过在工作中 map的效率更高
5、模糊查询
在之前jdbc的时候,我们使用list拼接字符串的方式实现模糊查询 现在我们依旧可以使用这种方式。为了避免sql注入的问题,我们通过可以把通配符写死的方法 来实现模糊查询
两种方法的Mapper接口都一致
//模糊查询
ArrayList<User> selectBylike(HashMap<String,Object> map);
(1)、将通配符写死在xml文件中
<select id="selectBylike" resultType="com.llf.pojo.User" parameterType="map">
select * from user where name like "%"#{values}"%";
</select>
@Test
public void selectBylike(){
SqlSession session = MybatisUtils.getsession();
UserMapper mapper = session.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("values", "赵");
ArrayList<User> users = mapper.selectBylike(map);
for (User user : users) {
System.out.println(user);
}
MybatisUtils.closeSqlSession();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T37R8i5o-1624684157157)(C:\Users\machenike\AppData\Roaming\Typora\typora-user-images\image-20210626125724099.png)]
(2)、将通配符写死在java程序中
<select id="selectBylike" resultType="com.llf.pojo.User" parameterType="map">
select * from user where name like #{values};
</select>
@Test
public void selectBylike(){
SqlSession session = MybatisUtils.getsession();
UserMapper mapper = session.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("values", "%赵%");
ArrayList<User> users = mapper.selectBylike(map);
for (User user : users) {
System.out.println(user);
}
MybatisUtils.closeSqlSession();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTZnace2-1624684157159)(C:\Users\machenike\AppData\Roaming\Typora\typora-user-images\image-20210626130337221.png)]
两种方法都可以实现模糊查询且比较安全