1、namespace
配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
2、select
选择、查询语句
- select标签是mybatis中最常用的标签之一
- select语句有很多属性可以详细配置每一条SQL语句
- SQL语句返回值类型。【完整的类名或者别名】
- 传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】
- 命名空间中唯一的标识符
- 接口中的方法名与映射文件中的SQL语句ID 一一对应
- id:就是对应的namespace中的方法名
- resultType:SQL语句执行的返回值类型 Class,基本数据类型
- parameterType:参数类型
根据id查询用户
-
在UserMapper中编写对应的接口
public interface UserMapper { //根据id查询用户 User getUserById(int id); }
-
在UserMapper.xml中编写对应的sql语句
<!-- 根据id查询用户 --> <select id="getUserById" parameterType="int" resultType="com.jh.domain.User"> select * from mybatis.user where id = #{id}; </select>
-
在测试类中测试结果
@Test public void getUserById() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user); sqlSession.close(); }
根据用户名和密码查询用户
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
-
Map传递参数,直接在sql中取出key即可!【parameterType="map"】
-
对象传递参数,直接在sql中取出属性即可!【parameterType="对应的对象类型"】
-
只有一个基本类型的情况下,可以直接在sql中取到!
多个参数使用map,或者注解!
方式一:直接在方法中传递参数
-
在接口方法的参数前加 @Param属性
public interface UserMapper { // 根据用户名和密码查询用户 User getUserByNameAndPwd(@Param("name")String name,@Param("pwd")String pwd); }
-
Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型
<select id="getUserByNameAndPwd" resultType="com.jh.domain.User"> select * from mybatis.user where name = #{name} and pwd = #{pwd} </select>
方式二:使用Map进行参数的传递
-
在接口方法中,参数直接传递Map;
User selectUserByNameAndPwd(Map<String,Object> map);
-
编写sql语句的时候,需要传递参数类型,参数类型为map
<select id="selectUserByNameAndPwd" resultType="com.jh.domain.User"> select * from mybatis.user where name = #{userName} and pwd = #{userPassword} </select>
-
在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!
Map<String, Object> map = new HashMap<String, Object>(); map.put("userName","小明"); map.put("userPassword","123456"); User user = mapper.selectUserByNameAndPwd(map);
总结:如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
3、insert
使用insert标签进行插入操作,它的配置和select标签差不多!
给数据库增加一个用户
-
在UserMapper接口中添加对应的方法
public interface UserMapper { //insert 一个用户 int addUser(User user); }
-
在UserMapper.xml中添加insert语句
<insert id="addUser" parameterType="com.jh.domain.User"> insert into mybatis.user(id, name, pwd) values (#{id}, #{name}, #{pwd}); </insert>
-
测试代码
@Test public void addUser() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int result = userMapper.addUser(new User(4, "小明", "123456")); System.out.println(result); // 提交事务,MyBatis默认不自动提交事务 sqlSession.commit();// 重点!不写的话不会提交到数据库 sqlSession.close(); }
注意:增、删、改操作需要提交事务!
4、update
使用update标签进行更新操作,它的配置和select标签差不多!
修改用户的信息
-
在UserMapper接口中添加对应的方法
public interface UserMapper { // 修改用户 int updateUser(User user); }
-
在UserMapper.xml中添加insert语句
<update id="updateUser" parameterType="com.jh.domain.User"> update mybatis.user set name = #{name}, pwd = #{pwd} where id = #{id}; </update>
-
测试代码
@Test public void updateUser() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int result = userMapper.updateUser(new User(4, "修改后", "123456")); System.out.println(result); // 提交事务,MyBatis默认不自动提交事务 sqlSession.commit();// 重点!不写的话不会提交到数据库 sqlSession.close(); }
5、delete
使用delete标签进行删除操作,它的配置和select标签差不多!
根据id删除一个用户
-
在UserMapper接口中添加对应的方法
public interface UserMapper { // 删除一个用户 int deleteUser(int id); }
-
在UserMapper.xml中添加insert语句
<delete id="deleteUser"> delete from mybatis.user where id = #{id}; </delete>
-
测试代码
@Test public void updateUser() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int result = userMapper.deleteUser(4); System.out.println(result); // 提交事务,MyBatis默认不自动提交事务 sqlSession.commit();// 重点!不写的话不会提交到数据库 sqlSession.close(); }
6、总结
- 所有的增删改操作都需要提交事务!
- 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
- 有时候根据业务的需求,可以考虑使用map传递参数!
- 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!
7、分析错误
- 标签不要匹配错
- resource绑定mapper,需要使用路径!
- 程序配置文件必须符合规范!
- NullPointserException,没有注册到资源!
- 输出的xml文件中存在乱码问题!
- maven资源没有导出问题!
7、模糊查询
-
Java代码执行的时候,传递sql通配符%%
list<name> names = mapper.selectlike("%李%");
-
在sql拼接中使用通配符!
<select id=”selectlike”> select * from foo where bar like "%"#{value}"%" </select>