🌈有幸相识 ,我是小相。有一个大厂梦,努力奔赴!加油陌生人!🌈
☁️该文章是跟随B站狂神学习Mybatis时的笔记与心得,若与您有用,感谢点赞。文章不免有不足之处,请指出,我会及时改正!
该部分代码见:mybatis-01- · xcy.小相/web-Mybatis - 码云 - 开源中国 (gitee.com)
1. *Mapper.xml结构
在Mybatis中,接口实现类由原来的* Impl.java变成 *Mapper.xml。通过xml来代替查询语句,替换了原先的接口实现类。在一个 XML 映射文件中,可以定义无数个映射语句。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.xcyxiaoxiang.dao.UserMapper">
<select id="getUserList" resultType="top.xcyxiaoxiang.pojo.User">
select * from users
</select>
<select id="getUserById" parameterType="int" resultType="top.xcyxiaoxiang.pojo.User">
select * from users where id=#{id}
</select>
<insert id="insertUser" parameterType="top.xcyxiaoxiang.pojo.User">
insert into users values(#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="top.xcyxiaoxiang.pojo.User" >
update users set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from users where id= #{id}
</delete>
</mapper>
namespace
:命名空间,对应一个mapper接口,该参数必须指定。select
:查询标签,查询SQL语句将会放置此处。id
:对应该mapper接口中的一个操作方法。resultType
:返回值类型,通常使用全限定名(或别名)。parameterType
: 传入的参数。
#{}
:用于传递参数。
2. <select >查询
- 模糊查询的SQL为:
select * from users where name like "%"#{value}"%"
编写Mapper接口
/**
* 获取用户列表
* @return
*/
List<User> getUserList();
/**
* 根据用户id查询用户
* @param id
* @return
*/
User getUserById(int id);
编写mapper.xml文件
<select id="getUserList" resultType="top.xcyxiaoxiang.pojo.User">
select * from users
</select>
<select id="getUserById" parameterType="int" resultType="top.xcyxiaoxiang.pojo.User">
select * from users where id=#{id}
</select>
编写测试文件
@Test
public void getUserList(){
// 获取session对象
SqlSession sqlSession = MybatisUnits.getSqlSession();
//执行sql
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for(User user:userList){
System.out.println(user);
}
// 关闭SqlSession
sqlSession.close();
}
3. <insert>插入
编写Mapper接口
/**
* 增加用户
* @param user
*/
void insertUser(User user);
编写mapper.xml文件
<insert id="insertUser" parameterType="top.xcyxiaoxiang.pojo.User">
insert into users values(#{id},#{name},#{pwd})
</insert>
编写测试文件
@Test
// 注意:增 删 改 需要提交事务
public void insertUser(){
SqlSession sqlSession = MybatisUnits.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(4,"王二麻","123123");
mapper.insertUser(user);
// 提交事务
sqlSession.commit();
sqlSession.close();
}
4. <update>更新
编写Mapper接口
/**
* 更新用户信息
* @param user
*/
void updateUser(User user);
编写mapper.xml文件
<update id="updateUser" parameterType="top.xcyxiaoxiang.pojo.User" >
update users set name=#{name},pwd=#{pwd} where id=#{id}
</update>
编写测试文件
@Test
public void updateUser(){
SqlSession sqlsession = MybatisUnits.getSqlSession();
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
mapper.updateUser(new User(4,"哈哈哈哈","123123123"));
sqlsession.commit();
sqlsession.close();
}
5. <delete>删除
编写Mapper接口
/**
* 根据用户ID删除用户
* @param id
*/
void deleteUser(int id);
编写mapper.xml文件
<delete id="deleteUser" parameterType="int">
delete from users where id= #{id}
</delete>
编写测试文件
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUnits.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
6. 部分参数的传递
通过将参数封装至HashMap中,来实现部分参数的传递。
- UserMapper.java
/**
* 通过Map传递部分参数来实现更新用户数据
* @param map
*/
void updateUserByMap(Map map);
- UserMapper.xml
<update id="updateUserByMap" parameterType="map">
update users set name = #{userName} where id= #{userId}
</update>
- Test
@Test
public void updateUserByMap(){
SqlSession sqlSession = MybatisUnits.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userId",3);
map.put("userName","mapper");
mapper.updateUserByMap(map);
sqlSession.commit();
sqlSession.close();
}
注意事项
-
mybatis默认设置关闭自动提交,因此
增删改
都需要提交事务
,否则不能成功操作数据库。 -
执行后一定要
关闭
sqlSession对象。 -
SQL语句中
#{}
中的参数名必须和pojo中的实体类变量或mapper接口中对应的参数名相同,或和对象中的属性名成相同。 -
namespace:后的名称必须要使用
.
来表达层次关系。 -
在核心配置文件中通过resource注册mapper时,使用
/
来表达层次关系。