mybatis-02 Mybatis的CRUD和其它基本操作
mybatis-02 mybatis的CRUD和其它基本操作
目录
再次强调!!!xml 文件中的 namespqce 中的包名要和 mapper 接口保持一致!
默认条件下除查询之外的操作都需要提交!!!可以手动在创建 sqlSession 的时候通过构造器修改成自动提交。
3 CRUD
先来看看我们在 mapper 中编写的显而易见的一段 sql 的内容:
<select id="getUserList" resultType="com.ermao.pojo.User">
select * from mybatis.user
</select>
第一眼望去就看了我们的 sql 语句,嘻嘻。然后就是一些个赋值语句,对于这些被赋值的语句,最最最常见的有:
名称 | 意义 |
---|---|
id | 对应接口中的方法名 |
resultType | 返回值类型(全限定) |
parameterType | 参数类型(全限定) |
…… | …… |
还可以使用#{参数名}
的形式来直接使用参数,要注意,参数名可以是 pojo 类的 field,也可以是接口方法签名的参数。另外,出了查询之外的操作都需要通过 sqlSession 的 commit 进行提交,这么说有些模糊,咱们直接上代码:
select
根据姓用户id查找用户的全部信息
xml 代码:
<select id="getUserByID" parameterType="int" resultType="com.ermao.pojo.User">
select * from mybatis.user where id = #{id}
</select>
java 代码:
// UserMapper 中
// 这里的 param 注解限定和指名了接口参数,这个名称将在 xml 文件中以 #{} 的形式被使用
User getUserByID(@Param("id") int id);
// 测试文件中
@Test
public void test02() {
try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userByID = mapper.getUserByID(1);
System.out.println(userByID);
}
}
执行结果:
User{id=1, name='ermao', pwd='123456'}
insert
根据字段信息插入新的用户
xml 文件:
<insert id="addUser">
insert into mybatis.user (id, name, pwd)
values (#{id}, #{name}, #{pwd})
</insert>
java 代码:
// UserMapper 中
int insertUser(@Param("id") int id, @Param("name") String name, @Param("pwd") String pwd);
@Test
public void test03() {
try(SqlSession sqlSession = MybatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int effected = mapper.insertUser(999, "jiumao", "123qwe");
System.out.println(effected);
//sqlSession.commit(); // 注意出了查询之外的其它操作都要通过 sqlSession 提交,否则不会生效,在这里为了不破坏表信息,不提交
}
}
// 执行结果:1
// 说明数据库内确实被插入了一条新的用户记录
根据对象插入新的用户
xml 文件:
这次的 id,name,pwd 都是从传入的 User 对象中获取的。
<insert id="insertUserByUserObject" parameterType="com.ermao.pojo.User">
insert into mybatis.user (id, name, pwd)
values (#{id},#{name}, #{pwd})
</insert>
java 代码:
// UserMapper 中
int insertUserByUserObject(User user);
@Test
public void test04() {
try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 在这里直接新建一个用户对象进行插入
int effected = mapper.insertUserByUserObject(new User(789, "二毛", "111111"));
System.out.println(effected);
// 在这里进行插入结果的判断,成功则提交,失败则 rollback
if (effected > 0) {
sqlSession.commit();
} else {
sqlSession.rollback();
}
}
}
// 输出结果:1
如果在这里遇到了插入数据库的字段为乱码的情况,请从两个方面检查:IDE 环境编码和 MySQL 编码。
还有一点就是 mybatis 不支持 id 重载,也就是一条 sql 只能对应一个 id,一个 id 只能对应一条 sql,而不能根据传入的参数类型等信息进行重载!
update
根据用户对象更新
xml 文件:
参数也是从传入的用户对象中获取。
<update id="updateUserByUserObject" parameterType="com.ermao.pojo.User">
update mybatis.user set name=#{name}, pwd=#{pwd} where id=#{id}
</update>
java 代码:
// UserMapper 中
int updateUserByUserObject(User user);
@Test
public void test05() {
try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int effected = mapper.updateUserByUserObject(new User(4, "sanmao", "22222"));
if (effected > 0) {
sqlSession.commit();
} else {
sqlSession.rollback();
}
}
}
// 输出结果:1
delete
根据用户ID删除
xml 文件:
<delete id="deleteUserById" parameterType="int">
delete from mybatis.user where id = #{id}
</delete>
java 代码:
@Test
public void test06() {
try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
final UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int effected = mapper.deleteUserById(5);
if (effected > 0) {
sqlSession.commit();
} else {
sqlSession.rollback();
}
}
}
4 使用map传参
假如实体类中的字段过多,可以考虑使用 map 传递局部参数。因为如果直接传递所有参数的话会显得非常臃肿,毕竟谁也不喜欢搁函数实参那里摆一堆没有 IDE 提示都不知道是啥的变量吧。
xml 代码:
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id, name, pwd) values(#{userid}, #{username}, #{password})
</insert>
java 代码:
@Test
public void test07() {
try (final SqlSession sqlSession = MybatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("userid", 732);
map.put("username", "aaa");
map.put("password", "7777");
int effected = mapper.insertUserByMap(map);
if (effected > 0) {
sqlSession.commit();
}
}
}
5 模糊查询
使用模糊查询时,要注意防止sql注入。下面两种方式都可行,且都是安全的,因为只要使用了#{}就可以防止sql注入了。
<select id="selectUserByNameLike" resultType="com.ermao.pojo.User">
select * from mybatis.user where name like #{value}
</select>
<select id="selectUserByNameLike" resultType="com.ermao.pojo.User">
select * from mybatis.user where name like "%"#{value}"%"
</select>
@Test
public void test08() {
try (final SqlSession sqlSession = MybatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUserByNameLike("%三%");
users.forEach(System.out::println);
}
}
// User{id=4, name='张三', pwd='999'}
// User{id=5, name='李三', pwd='8888'}