查询语句
selcet, 选择, 查询语句
对以下代码分析:
1 | <mapper namespace="com.lxb.dao.UserMapper"> |
id: 就是对应的namespace中的方法名
resultType: SQL语句执行的返回值
parameterType: 传入参数的类型
再来写一个根据id
查询的例子:
在接口中添加方法名:
1
2
3
4
5
6
7
8
9
10public interface UserMapper {
// 获取全部用户
List<User> getUserList();
// 根据id查询用户
User getUserById(int id);
}在
UserMapper.xml
文件中添加标签1
2
3<select id="getUserById" parameterType="int" resultType="com.lxb.pojo.User">
select * from mybatis.user where id = #{id};
</select>在测试类中进行测试
1
2
3
4
5
6
7
8
9
10
11
12
public void getUserById() {
// 获取SqlSession对象
SqlSession sqlSession = MybtisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(2);
System.out.println(user);
// 关闭SqlSession
sqlSession.close();
}输出为:
比之前方便太多了!!
插入操作
在接口中添加方法名
1
2
3
4
5
6
7
8
9
10
11
12public interface UserMapper {
// 获取全部用户
List<User> getUserList();
// 根据id查询用户
User getUserById(int id);
// insert一个用户
int addUser(User user);
}在
UserMapper.xml
文件中添加标签1
2
3<insert id="addUser" parameterType="com.lxb.pojo.User">
insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
</insert>在测试类中进行测试
1
2
3
4
5
6
7
8
9
10
11
public void addUser(){
// 获取SqlSession对象
SqlSession sqlSession = MybtisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(4, "啦啦啦", "89746"));
// 关闭SqlSession
sqlSession.close();
}但是结果并没有添加成功:
这是因为增删改必须要提交事物
添加提交事务的语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void addUser(){
// 获取SqlSession对象
SqlSession sqlSession = MybtisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(4, "啦啦啦", "89746"));
// 提交事物
sqlSession.commit();
// 关闭SqlSession
sqlSession.close();
}再进行查询, 就发现成功了, 不再贴出来
修改操作
在接口中添加方法名
1
2
3
4
5
6
7
8
9
10
11
12
13
14public interface UserMapper {
// 获取全部用户
List<User> getUserList();
// 根据id查询用户
User getUserById(int id);
// insert一个用户
int addUser(User user);
// 修改用户
int updateUser(User user);
}在
UserMapper.xml
文件中添加标签1
2
3<update id="updateUser" parameterType="com.lxb.pojo.User">
update mybatis.user set name = #{name},pwd = #{pwd} where id = #{id};
</update>在测试类中进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void updateUser() {
// 获取SqlSession对象
SqlSession sqlSession = MybtisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4, "呵呵呵", "74155"));
// 提交事物
sqlSession.commit();
// 关闭SqlSession
sqlSession.close();
}结果为:
删除操作
在接口中添加方法名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public interface UserMapper {
// 获取全部用户
List<User> getUserList();
// 根据id查询用户
User getUserById(int id);
// insert一个用户
int addUser(User user);
// 修改用户
int updateUser(User user);
// 删除用户
int deleteUser(int id);
}在
UserMapper.xml
文件中添加标签1
2
3<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>在测试类中进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void deleteUser(){
// 获取SqlSession对象
SqlSession sqlSession = MybtisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(2);
// 提交事物
sqlSession.commit();
// 关闭SqlSession
sqlSession.close();
}结果为:
自动提交事物
在使用openSession() 方法时, 可以传入一个布尔值, 来控制是否开启自动提交事物, 源码如下:
1 | SqlSession openSession(); |
如果这样设置, 就不需要在添加, 删除, 修改操作后手动提交了:
1 | public static SqlSession getSqlSession() { |
传递MAP
对于插入或者修改操作, 如果一个对象有非常多的字段(属性), 那么按照之前的方法写SQL语句的话就会非常臃肿.
或者说如果想要修改某些属性, 如果不用map的话就需要新建一个对象进行传递, 使用map就解决了整个问题, 需要改动什么就传什么
在接口中添加方法名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public interface UserMapper {
// 获取全部用户
List<User> getUserList();
// 根据id查询用户
User getUserById(int id);
// insert一个用户
int addUser(User user);
// 运用万能的map
int addUser2(Map<String, Object> map);
// 修改用户
int updateUser(User user);
// 删除用户
int deleteUser(int id);
}在
UserMapper.xml
文件中添加标签1
2
3
4<!--传递map中的key-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
</insert>在测试类中进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void addUser2(){
SqlSession sqlSession = MybtisUtils.getSqlSession();
HashMap<String, Object> map = new HashMap<>();
map.put("id", 4);
map.put("name", "sdlfew");
map.put("pwd", "5498764");
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
Map传递参数, 直接在SQL中取出KEY即可 parameterType=”map”
对象传递参数, 直接在SQL中取出对象的属性即可 parameterType=”Object”
多个参数用Map, 或者注解
模糊查询
在接口中添加方法名
1
2// 获取全部用户
List<User> getUserList();在
UserMapper.xml
文件中添加标签1
2
3<select id="getUserLike" resultType="com.lxb.pojo.User">
select * from user where name like #{value};
</select>在测试类中进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
public void getUserLike(){
SqlSession sqlSession = MybtisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserLike("J%");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}输出为
注意传入参数要加通配符
要么在Java代码中传递
1
List<User> users = mapper.getUserLike("J%");
要么在SQL拼接中使用
1
select * from user where name like "%"#{value}"%";
ResultMap 结果集映射
问题
解决属性名和字段名不一致的问题
新建一个项目, 验证这个问题
在
User
类中将pwd
字段改为password
1
2
3private int id;
private String name;
private String password;查询
1
User user = mapper.getUserById(2);
结果为
1
User{id=2, name='John', password='null'}
解决方法: 起别名
把sql语句改为:
1
select id, name, pwd as password from mybatis.user where id = #{id};
结果集映射
结果集映射的使用
在UserMapper.xml文件中添加resultMap标签
1
2
3
4
5<resultMap id="UserMap" type="User">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>只修改不一样的属性字段也可以
在select标签中绑定resultMap
1
2
3<select id="getUserById" parameterType="int" resultMap="UserMap">
select * from mybatis.user where id = #{id};
</select>不需要在使用
resultType