前言
通过前文Mybatis学习(一)—— 新手完成第一个Mybatis程序介绍的完成一个Mybatis的步骤可得,若再来新的需要操作的sql语句时,只需要更改第6步中的UserMapper接口内容,以及第7步中的Mapper.xml配置文件。很大程度简化了代码的编写。
本篇文章将从修改上述两个文件的内容,实现CURD功能。
tips:所有的增删改操作都需要事务的提交。
一、在XML配置文件中实现
1.增
UserMapper.java文件中:
public interface UserMapper {
void addUser(User user);
}
Mapper.xml文件中:
<mapper namespace="UserMapper">
<insert id="addUser" parameterType="com.ali.pojo.User">
<!-- 传值用% -->
insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
</insert>
</mapper>
测试:
@Test
public void test1() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(5, "dao","23");
mapper.addUser(user);
// 增删改事务要提交
sqlSession.commit();
sqlSession.close();
}
2.删
UserMapper.java文件中:
public interface UserMapper {
void deleteUser(int id);
}
Mapper.xml文件中:
<mapper namespace="UserMapper">
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id}
</delete>
</mapper>
测试:
@Test
public void test2() {
qlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(6);
sqlSession.commit();
sqlSession.close();
}
3.改
UserMapper.java文件中:
public interface UserMapper {
void updateUser(User user);
}
Mapper.xml文件中:
<mapper namespace="UserMapper">
<update id="updateUser" parameterType="com.ali.pojo.User">
<!-- #{} 括号中的名称需与字段名相同 -->
update mybatis.user set name = #{name} where id = #{id}
</update>
</mapper>
测试:
@Test
public void test3() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(5, "hiIIhi","23");
mapper.updateUser(user);
sqlSession.commit();
sqlSession.close();
}
4.查
UserMapper.java文件中:
public interface UserMapper {
User getById(int id);
}
Mapper.xml文件中:
<mapper namespace="UserMapper">
<select id="getById" parameterType="int" resultType="com.ali.pojo.User">
select * from mybatis.user where id = #{id}
</select>
</mapper>
测试:
@Test
public void test4() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getById(1);
System.out.print(user);
sqlSession.close();
}
5.万能的Map
方法:使用Map<String,Object> map 传入参数
使用情况:实体类、数据库中的表,字段或者参数过多时,可通过Map传入参数,直接在sql取key值即可。
实现:下面的例子实现查询功能。
UserMapper.java文件中:
public interface UserMapper {
User getById1(Map<String,Object> map);
}
Mapper.xml文件中:
<mapper namespace="UserMapper">
<select id="getById1" parameterType="map" resultType="com.ali.pojo.User">
<!-- 这里的idnum可以任意命名,可不与表中属性名相同 -->
select * from mybatis.user where id = #{idnum}
</select>
</mapper>
测试:
@Test
public void test4() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("id", 2);
User user = mapper.getById1(map);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
6.模糊查询LIKE
UserMapper.java文件中:
public interface UserMapper {
List<User> getUserLike(String string);
}
Mapper.xml文件中:建议这里将模糊查询的通配符%写死,防止字符串拼接带来的sql注入。
<mapper namespace="UserMapper">
<select id="getUserLike" resultType="com.ali.pojo.User">
select * from mybatis.user where name like "%"#{values}"%"
</select>
</mapper>
测试:
@Test
public void test4() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> user = mapper.getUserLike("王");
System.out.print(user);
sqlSession.close();
}
7.分页
目的:通过将所有数据分段展示,减少数据的处理量
实现:
# 1.创建接口
import java.util.List;
import java.util.Map;
public interface UserMapper {
List<User> getUserLimit(Map<String, Integer> map);
}
# 2.实现接口
<select id="getUserLimit" parameterType="map" resultType="User">
select * from mybatis.user limit #{startIndex}, #{page}
</select>
# 3.测试
public class UserMapperTest {
@Test
public void test10() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<>();
map.put("startIndex", 0);
map.put("page", 2);
List<User> userLimit = mapper.getUserLimit(map);
for (User user : userLimit) {
System.out.println(user);
}
sqlSession.close();
}
}
运行结果:
该结果加入了本文中介绍的日志功能。
二、利用注解实现
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,建议使用 XML 来映射语句。
实现:
1)在mybatis-config.xml文件中,指定注解的类。
<mappers>
<mapper class="com.ali.dao.UserMapper"></mapper>
</mappers>
2)在接口中添加注解,以select为例,update、delete、insert同理。
public interface UserMapper {
// 1.对不同操作注解不同关键词,在()中写入sql语句。
@Select("select * from mybatis.user")
List<User> getUserList();
// 2.若sql语句中需要传参,sql中传入的参数用#{}表示
// 接口的参数用 【@Param("数据库中字段名") 传入的数据类型 参数名】表示
@Select("select * from mybatis.user where id = #{id}")
User getById(@Param("id") int id);
}
3)测试:
public class UserMapperTest {
@Test
public void test(){
// 1.获取执行sal的对象sqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 2.获取并执行sql语句 方法:getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
// 输出结果
for (User user : userList) {
System.out.println(user);
}
// 3.关闭sqlSession连接
sqlSession.close();
}
@Test
public void test1() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getById(1);
System.out.print(user);
sqlSession.close();
}
}