1、namespace
namespace中的包名要和Dao/Mapper接口名一致
2、select,选择,查询语句
● id:对应的就是namespace中的方法名
● resultType:Sql语句执行的返回值
● parameterType:参数类型
步骤
● 1、编写接口
//查询所有用户
List getUserList();
● 2、编写对应的mapper中对应的sql语句
<select id="getUserList" resultType="cn.zhy.pojo.User">
select *
from mybatis.user;
</select>
<select id="getUserId" resultType="cn.zhy.pojo.User" parameterType="int">
select *
from mybatis.user
where id = #{id}
</select>
● 3、测试
@Test
public void test() {
//第一步获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一、getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
//方式二(过时)
// List<User> userList = sqlSession.selectList("cn.zhy.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
@Test
public void getUserById() {
//第一步获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userId = mapper.getUserId(2);
System.out.println(userId);
//关闭SqlSession
sqlSession.close();
}
3、insert
● 1、编写接口
//insert一个用户
int addUser(User user);
● 2、编写对应的mapper中对应的sql语句
<insert id="addUser" parameterType="cn.zhy.pojo.User">
insert into mybatis.user (id, name, pwd)
values (#{id}, #{name}, #{pwd});
</insert>
● 3、测试
@Test
public void addUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(5, “小张”, “123123”));
//提交事务
sqlSession.commit();
sqlSession.close();
}
4、update
● 1、编写接口
//修改用户
int updateUser(User user);
● 2、编写对应的mapper中对应的sql语句
<update id="updateUser" parameterType="cn.zhy.pojo.User">
update mybatis.user
set name=#{name},
pwd=#{pwd}
where id = #{id};
</update>
● 3、测试
@Test
public void updateUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4, “小李”, “123123”));
sqlSession.commit();
sqlSession.close();
}
5、delete
● 1、编写接口
//删除用户
int deleteUser(int id);
● 2、编写对应的mapper中对应的sql语句
<delete id="deleteUser" parameterType="int">
delete
from mybatis.user
where id = #{id};
</delete>
● 3、测试
@Test
public void deleteUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
注意点增删改需要提交事务
6、分析错误
- 标签匹配不要写错
- resource绑定mapper,需要使用路径,用“/”连接
- 程序配置文件必须符合规范
- 空指针异常,没有注册到资源
7、万能的Map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
Map传递参数,直接在sql中取出key值即可 parameterType=“map”
对象传递参数,直接在sql中取对象的属性即可 parameterType=“cn.zhy.pojo.User”
只有一个基本类型参数的情况下,可以直接在sql中取 parameterType可以不写
多个参数用Mapper或者注解
8、模糊查询
1、java代码执行的时候,传递通配符%%
List<User> userList = mapper.getUserLike("%张%");
2、在sql配置中使用通配符
select * from mybatis.user where name like "%"#{value}"%"
select * from mybatis.user where name like "%"#{value}"%"
//模糊查询
List<User> getUserLike(String value);
<select id="getUserLike" resultType="cn.zhy.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();
}
补充
#{}和${}的区别
#{}表示一个占位符号
● 通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
● #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。
● 可以自动对值添加 ’ ’ 单引号
表示拼接
s
q
l
串●通过
{}表示拼接 sql 串 ● 通过
表示拼接sql串●通过{}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,
●
可以接收简单类型值或
p
o
j
o
属性值,如果
p
a
r
a
m
e
t
e
r
T
y
p
e
传输单个简单类型值,
{}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,
可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是 value。
● 比如order by id 这种的,以id排序 那么这个id 是没有单引号的,就是简单的SQL拼接,所以我们应该使用${} 而不是#{}