CRUD的操作只需跟接口和配置文件有关,即
UserDao
和UserMapper.xml
有关
CRUD操作三步走:
- 写接口
- 写SQL配置文件
- 编写测试类。获取mapper,拿到对象,直接调用方法就可以了
namespace
namespace中的包名要和Dao/Mapper接口的包名一致!
select
- id:对应namespace中的方法名
- resultType:sql语句执行的返回值
- parameterType:返回参数类型
- 编写接口
//根据ID查询用户
User getUserByID(int id); //返回值 取名(传递参数)
- 编写对应的SQL语句
<!--根据id查询结果-->
<select id="getUserById" resultType="com.xiao.pojo.User" parameterType="int">
select * from mybatis.user where id=#{id};
</select>
- 测试
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class); //通过sqlSession可以获得接口getMapper,获得UserMapper的class对象
User user = mapper.getUserByID(1);
System.out.println(user);
sqlSession.close();
}
insert
- 编写接口
//插入一个用户
int addUser(User user);
- 编写对应的SQL语句
<!-- 插入对象(对象中的属性,可以直接取出来) -->
<insert id="addUser" parameterType="com.xiao.pojo.User">
insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
- 测试
//增删改需要提交事务!!!!
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.addUser(new User(4, "李白", "asd3333"));
if (res>0){
System.out.println("插入成功!");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
update
//修改用户
int updateUser(User user);
<!-- 修改用户-->
<update id="updateUser" parameterType="com.xiao.pojo.User">
update mybatis.user set name = #{name},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,"张飞","245789"));
sqlSession.commit();
sqlSession.close();
}
delete
//删除用户
int deleteUser(int id);
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{4};
</delete>
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
Map
在实体类,当参数过多或数据库中的表过多时,应当考虑使用Map!
使用Map对表进行操作时,可以不必将所有的参数或者表列出,只需将所需修改或添加的字段列举出即可。
int addUser2(Map<String,Object> map);
<!-- 传递map的key,使用map可以随意的控制参数,不使用map则参数的名称需要与数据库的名称一致-->
<insert id="addUser" parameterType="map">
insert into mybatis.user(id,name,pwd) values (#{uesrid},#{username},#{password})
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<String, Object>();
map.put("userid",6);
map.put("username","杜甫");
map.put("password",456789);
mapper.addUser2(map);
sqlSession.close();
}
Map传递参数时,直接在SQL中取出key即可。
parameterType="map"
而对象传递参数,直接在SQL中取对象的属性即可。
parameterType="object"
只有一个基本类型参数的情况下,可以直接在SQL中取到。
多个参数用Map,或者注解。
模糊查询
接口方法
//模糊查询
List<User> getUserLike(String value);
xml配置文件
<!--模糊查询-->
<select id ="getUserLike" resultType="com.xiao.pojo.User">
select * from mybatis.user where name like #{value}
</select>
测试类
@Test
public void getUserLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("%李");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
- Java代码执行的时候,传递通配符% %
List<User> userList = mapper.getUserLike("%赵%");
- 该种方式也能查询出结果,不过容易引起SQL注入问题
select * from mybatis.user where name like "%"#{value}"%"