上一篇博文第一个MyBatis程序中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对users表执行CRUD操作。本文中使用到的测试环境是上一篇博文中的测试环境。
public interface UserDao {
/**执行查询操作,将查询结果自动封装成List返回*/
List<User> getUserList();
/**根据ID查询用户,将查询结果自动封装成pojo.User返回*/
User getUserById(int id);
/**insert*/
int addUser(User user);
/**update*/
int updateUser(User user);
/**delete*/
int deleteUser(int id);
}
/**模糊查询*/
List<User> findUserByName(String value);
getUserById:映射xml文件中的statement中的id就要保持一致
返回值User:映射文件中的statement的resultType就要为User类型
参数值id:映射文件中的statement的parameterType就要为int类型
也可以使用全限定名java.lang.Integer,int是别名
mybatis自动帮我们进行了转换
Integer是int的包装类, int是基本数据类型
最主要的区别就是这句 一个是基本数据类型, 一个是类,
但其实其中隐含的细节很多,比如:
<select id="findUserByName" resultType="com.kuang.pojo.User" parameterType="string" >
select * from mybatis.user where name LIKE "%"#{value}"%"
select>
<select id="getUserById" parameterType="java.lang.Integer" resultType="com.kuang.pojo.User">
select * from mybatis.user where id = #{id}
select>
<insert id="addUser" parameterType="com.kuang.pojo.User" >
insert into mybatis.user (id, name, pwd) value (#{id},#{name},#{pwd});
insert>
<update id="updateUser" parameterType="com.kuang.pojo.User" >
update mybatis.user set name=#{name}, pwd=#{pwd} where id = #{id}
update>
<delete id="deleteUser" parameterType="int" >
delete from mybatis.user where id=#{id}
delete>
<mapper namespace="com.kuang.dao.UserMapper">
为mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="com.kuang.dao.UserMapper"就是com.kuang.dao(包名)+UserMapper(UserMapper.xml文件去除后缀)
使用select来表示一个查询的statement,相当于statement.executeQuery
<select id="getUserList" resultType="com.kuang.pojo.User">
select * from mybatis.user
select>
id:表示该statement唯一标识
和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用
如果命名空间+id不唯一,那么 MyBatis 抛出异常
指定输入参数的java类型,可以填写别名或Java类的全限定名。别名的用法在详细讲解全局配置文件的时候会讲解到,在那边可以配置
指定输出结果的java类型,可以填写别名或Java类的全限定名。
resultType="com.kuang.pojo.User"就表示将查询结果封装成一个User类的对象返回
User类就是user表所对应的实体类
#{}:相当于预处理中的占位符?
#{}里面的参数表示接收java输入参数的名称
#{}可以接受HashMap、简单类型、POJO类型的参数
简单类型:#{}里面可以是value,可以是任意值
POJO类型的参数:必须是POJO中的属性名
hashmap:key值名
------------------------------------------------------------------
${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。
${}会引起SQL注入,所以要谨慎使用。
${}可以接受HashMap、简单类型、POJO类型的参数。
当接受简单类型的参数时,${}里面只能是value
Map是一个接口,即Interface Map
MapMap<>中只能存放指定类型的key和指定类型的value如下
Map<String,Object>中只能存放String类型的键,Object类型的值
Object是所有类型的父类
实例
Map map=new HashMap();
//正确使用方式
map.put(“a”,1);
//错误使用方式,会导致无法通过编译
map.put(11,“abc”);
它的每个元素包含一个key对象和一个value对象,且在这两个对象之间存在一种映射的对应关系,所有从Map集合中访问元素时,只有指定了key就可以找到对应的value,因此key必须是唯一的且不能重复,当key相同时,后面的value值会覆盖之前的value值。
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
/**update*/
int updateUser(User user);
int updateUser2(Map<String,Object> map);
<update id="updateUser" parameterType="com.kuang.pojo.User" >
update mybatis.user set pwd=#{pwd} where id = #{id}
update>
<update id="updateUser2" parameterType="map">
update mybatis.user set pwd=#{pwd} where id = #{id}
update>
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4,"玫瑰","123456"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser2(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("id",4);
map.put("pwd","123456");
int i = userMapper.updateUser2(map);
sqlSession.commit();
//关闭SqlSession
sqlSession.close();
}
List<User> getUserByIdAndName(Map<String,Object> map);
<select id="getUserByIdAndName" parameterType="map" resultType="com.kuang.pojo.User">
select * from user where id= #{id} and name like concat("%"#{name}"%")
select>
@Test
public void getUserByIdAndName(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("id",3);
map.put("name","李");
List<User> userByIdAndName = userMapper.getUserByIdAndName(map);
for (User user : userByIdAndName) {
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}