3.CURD
namespace:
Mapper.xml中使用的namespace中分包名,要和Dao/Mapper接口中的包名一致。
过程:
完成MyBatis的实现后,操作数据库:
- 所有的操作只和“接口”和“配置文件”有关
- 实体类、工具类、mybatis.config.xml不在需要改变
- mapper.xml只需要去mybatis.config.xml中配置一次,mapper.xml中只需要有一个
<mapper>
dao层:
UserMapper接口(从UserDao改名为UserMapper)
UserMapper配置文件(相当于实体类UserMapperImpl)
Mapper.xml元素概念
- id: 就是对应的nsmespace中的方法名
- resultType: Sql语句执行的返回值
- parameterType: 参数类型
步骤:
3.1编写接口
在UserMapper中
public interface UserMapper {
//根据id查询用户
User getUserById(int id);
//insert用户
int insertUser(User user);
//修改用户
int updateUser(User user);
//删除用户
int deleteUserById(int id);
}
3.2编写对应的mapper.xml中的sql语句
在UserMapper.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">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.kuang.dao.UserMapper">
<!--根据id查询用户-->
<select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User">
select * from `user` where `id`=#{id};
</select>
<!--Insert用户-->
<insert id="insertUser" parameterType="com.kuang.pojo.User">
insert into `user`(`name`,`pwd`) values ('zhaoliu','zhao123456');
</insert>
<!--修改用户-->
<update id="updateUser" parameterType="com.kuang.pojo.User">
update `user` set `name`=#{name},`pwd`=#{pwd} where id=#{id};
</update>
<!--根据id删除用户-->
<delete id="deleteUserById" parameterType="int">
delete from `user` where id=#{id};
</delete>
</mapper>
3.3测试
在UserMapperTest中
public class UserMapperTest {
//根据id查找用户
@Test
public void getUserById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class); //相当于获得实现类对象
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
//插入用户
@Test
public void insertUser(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.insertUser(new User(0, "liu", "liu123"));
if(i>0){
System.out.println("插入成功");
}
//【关键】Mybatis中增删改查,需要提交事务才能生效
sqlSession.commit();
sqlSession.close();
}
//修改用户
@Test
public void updateUser(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(1, "liu", "liu123"));
if(i>0){
System.out.println("修改成功");
}
//【关键】Mybatis中增删改查,需要提交事务才能生效
sqlSession.commit();
sqlSession.close();
}
//删除用户
@Test
public void deleteUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUserById(4);
if(i>0){
System.out.println("删除成功");
}
//【关键】Mybatis中增删改查,需要提交事务才能生效
sqlSession.commit();
sqlSession.close();
}
}
在Mapper.xml中,对象中的属性,可以直接取出来,与实体类对应
Mybatis增删改必须提交事务才能生效
注意SqlSession对象使用完后关闭
3.4遇到的问题
-
Mapper.xml的curd标签不要匹配错
-
Mapper.xml需要到resource中的mybatis-config.xml中注册,路径要用‘/’,前面的命名空间使用的是包名 ‘.’
<mappers> <mapper resource="com/kuang/dao/UserMapper.xml"/> </mappers>
-
程序配置文件mybatis-config.xml必须符合规范
-
NullPointerException,没有注册到资源,MybatisUtils中提升作用域内外定义变量
sqlSessionFactory
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory;//提升作用域 static { //使用Mybatis的第一步:获取SqlSessionFactory对象 try { String resource = "mybatis-config.xml"; InputStream inputStream =Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //有了SqlSessionFactory以后,我们可以从中获得SqlSession的实例 //SqlSession提供了在数据库执行 SQL命令 所需的所有方法。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
-
输出的xml文件如果存在乱码,删除即可
-
maven资源导出问题,pom.xml中加
<build>
3.5万能的Map
- Mapper.xml中参数类型如果为实体类,在测试时需要初始化所有字段,传递整个实体类对象;如果sql操作只需要少量字段,则不合适;
实体类中的字段名和参数中字段名必须一致。
在接口方法中,参数直接传递实体类User;
//insert用户
int insertUser(User user);
编写sql语句的时候,需要传递参数类型,参数类型为实体类"com.kuang.pojo.User"
<!--Insert用户-->
<!--使用实体类:test中传入的“对象中的属性”必须和“数据库表中字段名”对应-->
<insert id="insertUser" parameterType="com.kuang.pojo.User">
insert into `user`(`name`,`pwd`) values (#{name},#{pwd});
</insert>
在使用方法的时候,需要创建实体类User对象,赋值所有属性
使用实体类:test中传入的“对象中的属性”必须和“数据库表中字段名”对应
//插入用户
@Test
public void insertUser(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.insertUser(new User(0, "田七1", "tian123456"));
if(i>0){
System.out.println("插入成功");
}
//【关键】Mybatis中增删改查,需要提交事务才能生效
sqlSession.commit();
sqlSession.close();
}
- 考虑用map作为参数,map中的key值也可以自定义,只需要在测试类中定义相应的key值。
在接口方法中,参数直接传递Map;
//insert用户
int insertUser(User user);
编写sql语句的时候,需要传递参数类型,参数类型为Map
<!--Insert用户-->
<!--使用万能的Map:test中传入的“map的key值”可以自定义,无需和“数据库表中字段名”对应-->
<insert id="insertUser2" parameterType="map">
insert into `user`(`name`,`pwd`) values (#{username},#{password});
</insert>
在使用方法的时候,需要创建实体类User对象,赋值所有属性
使用万能的Map:test中传入的“map的key值”可以自定义,无需和“数据库表中字段名”对应
//插入用户
@Test
public void insertUser2(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map=new HashMap<>();
map.put("username","田七");
map.put("password","tian123456");
int i = mapper.insertUser2(map);
if(i>0){
System.out.println("插入成功");
}
//【关键】Mybatis中增删改查,需要提交事务才能生效
sqlSession.commit();
sqlSession.close();
}
传递参数类型:
- 对象传递参数:直接在sql中取出对象的属性(实体类定义时属性和数据库表字段名一一对应)【parameterType=“Object”】
- Map传递参数:直接在sql中取出key即可,map的key值无需和数据库表字段名一致,【parameterType=“map”】
- 传递参数类型只有一个,且为基本类型,如int,可省略不写,直接在sql中取到。
多个参数用map,或者注解
返回结果类型:当为实体类对象时需要写,当为int时可省略。
3.6模糊查询
1.test中传递的字符串采用拼接,传递通配符%
容易造成sql注入,用户传入的值一般我们要求只能为值,不能拼接字符串
List<User> userList = mapper.getUserLike("%李%");
2.在Mapper.xml的sql中拼接,使用通配符,推荐
select * from `user` where name like "%"#{name}"%"