文章目录
前言
MyBatis 是一款优秀的 ORM 框架,它可以帮助开发者实现 Java 对象与数据库之间的映射。在 MyBatis 中,DAO 层通常是指与数据库操作相关的接口和实现类。
这里对于 Mybatis 的基础代码编写及环境搭建将不再赘述,需要的小朋友请看我上一篇博客哦
CRUD
namespace 中的包名要和 Dao / mapper 接口的包名一致。
select 查询所有用户信息
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
//查询所有用户
List<User> getUserList();
}
- 然后编写对应 xml 配置文件,如下:
<mapper namespace="com.hb.dao.UserMapper">
<!--id 是namespace的方法名;resyultType 是sql语句的返回值-->
<select id="getUserList" resultType="com.hb.pojo.User">
select * from mybatis.user;
</select>
</mapper>
- 然后编写测试类,如下:
public class UserMapperTest {
@Test
public void getUserListTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession(); //获取执行sql的对象;
UserMapper mapper = sqlSession.getMapper(UserMapper.class); //通过sqlSession获取当前绑定的接口的class对象;
List<User> userList = mapper.getUserList(); //调用接口类中对应的方法
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();//关闭sqlSession
}
}
- 运行,查看结果:
与 Navicat 表中数据进行对比:
select 根据ID查询用户信息
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
//根据ID查询用户信息
User getUserById(int id);
}
- 然后编写对应 xml 配置文件,如下:
<select id="getUserById" resultType="com.hb.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
- 然后编写测试类,如下:
@Test
public void getUserByIdTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.getUserById(1);
System.out.println(user1);
sqlSession.close();
}
- 运行,查看结果:
与上表中对比,结果正确。
insertInto 插入一个用户信息
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
//插入一个用户信息
void addUserInfo(User user);
}
- 然后编写对应 xml 配置文件,如下:
<insert id="addUserInfo">
insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
- 然后编写测试类,如下:
@Test
public void addUserInfoTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUserInfo(new User(4,"小孙","03207077"));
sqlSession.commit();
sqlSession.close();
}
- 运行,查看 Navicat 表中结果:
添加用户信息成功;
update 修改一个用户信息
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
//修改一个用户信息
void updateUserInfo(User user);
}
- 然后编写对应 xml 配置文件,如下:
<update id="updateUserInfo">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id};
</update>
- 然后编写测试类,如下:
@Test
public void updateUserInfoTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUserInfo(new User(4,"孙孙","77777777"));
sqlSession.commit();
sqlSession.close();
}
- 运行,查看 Navicat 表中结果:
delete 删除一个用户信息
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
//删除一个用户信息
void deleteUserInfo(int id);
}
- 然后编写对应 xml 配置文件,如下:
<delete id="deleteUserInfo">
delete from mybatis.user where id=#{id};
</delete>
- 然后编写测试类,如下:
@Test
public void deleteUserInfoTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUserInfo(4);
sqlSession.commit();
sqlSession.close();
}
- 运行,查看 Navicat 表中结果:
删除成功!
parameterType 使用万能 map
在我们的实体类,或者数据库中的表,字段或者参数过多的情况下,我们应该考虑用 map,这里用增加用户信息来举例说明
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
void addUserInfo2 (Map<String,Object> map);
}
- 然后编写对应 xml 配置文件,如下:
<insert id="addUserInfo2" parameterType="map">
insert into mybatis.user (id, pwd) values (#{id},#{password});
// 除了主键id外,其他键都可以非空插入,这里的属性名称也不用和前面数据库字段名称的保持一致(体现一
// 个“乱”),这样使用map可以减少内存消耗;
</insert>
- 然后编写测试类,如下:
@Test
public void addUserInfo2Test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String,Object>();
map.put("id",5);
map.put("password","66666666");
mapper.addUserInfo2(map);
sqlSession.commit();
sqlSession.close();
}
- 运行,查看 Navicat 表中结果:
可以发现,这里没有插入name字段内容。
总结:
- Map传递参数,直接在 sql 中取出 key 即可!【parameterType=“map”】;
- 对象传递参数,直接在 sql 中取出对象的属性即可!【parameterType=“Object”】;
- 只有一个基本类型参数的情况下,可以直接在 sql 中取到!多个参数的情况下,使用 map 注解。
模糊查询实现
首先增加一个用户信息,执行addUserInfoTest()
中的mapper.addUserInfo(new User(4,"李七","03207077"));
可得数据库中表的数据为:
- 首先编写 UserMapper 接口,如下:
public interface UserMapper {
//模糊查询
List<User> getUserLikeList(String value);
}
- 然后编写对应 xml 配置文件,如下:
<select id="getUserLikeList" resultType="com.hb.pojo.User">
select * from mybatis.user where name like "%"#{value}"%";
</select>
- 然后编写测试类,如下:
@Test
public void getUserLikeListTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLikeList("李");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
- 运行,查看结果:
模糊查询成功!
模糊查询成功!
注意:
- Java 代码执行的时候,传递通配符 %%
List<User> userList = mapper.getUserLikeList("%李%");
- 在 sql 拼接时使用通配符%%
select * from mybatis.user where name like "%"#{value}"%";
注意事项
- 增删改需要提交事务!
sqlSession.commit();
- 每次增删改查的 Test 最后都需要关闭 sqlSession;
sqlSession.close();
错误分析
- xml 文件编写中,可能会出现标签写错问题,可以根据 idea 提示来写;
- 程序配置文件没有按标准规范来编写,检查配置文件格式,与上面所写文件对比;
- resource 绑定 mapper,需要使用路径(即 / ),如下:
<mappers>
<mapper resource="com/hb/dao/UserMapper.xml"/>
</mappers>
- NullPointerException(空指针异常,没有注册到资源);
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
- SQL 语句编写错误,检查语法错误,重新编写;