IDEA+Mybatis(三)映射文件_增删查改
一、mapper文件注意事项
1、namespace
namespace中的包名要和DAO/mapper接口的包名一致
<mapper namespace="DAO.UserDao">
public interface UserDao {
List<user> selectUser();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLnjKA1k-1612701194599)(C:\Users\94528\AppData\Roaming\Typora\typora-user-images\1612276864355.png)]
2、增删查改标签中的属性
-
id:就是namespace中对应的接口中的方法名;
-
resultType:SQL语句执行的返回值;
-
parameterType:参数类型(即接口方法输入参数的类型);
user selectUser(String name);
<select id="selectUser" resultType="entity.user" parameterType="String"> select * from user where username = #{name} </select>
二、select
选择,查询语句
-
编写接口
user selectUser(String name);
-
编写接口对应的mapper中的SQL语句
<select id="selectUser" resultType="entity.user" parameterType="String"> select * from user where username = #{name} </select>
-
测试
@Test public void testSelectUser(){ SqlSession sqlSession= MybatisUtils.sqlSession(); try { UserDao DAO=sqlSession.getMapper(UserDao.class); user user = DAO.selectUser("user1"); System.out.println(user); } finally { sqlSession.close(); } }
-
注解方式:
直接在接口方法处写注解sql,无需写mapper,适用简单的sql
无参:
public interface UserDao { @Select("select * from user") List<User> UserList(); }
有参(方法存在多个参数,每个参数前必须加上@Param(“parameter”)注解):
public interface UserDao { //方法存在多个参数,每个参数前必须加上@Param("username")注解 @Select("select * from user where username= #{username}") List<User> userListByUsername(@Param("username") String username); }
三、insert
插入语句
-
编写接口
int insertUser(User user);
-
编写接口对应的mapper中的SQL语句
<insert id="insertUser" parameterType="entity.User"> insert into user values (#{username},#{pwd},#{email}) </insert>
-
测试
//增删改需要提交事务 @Test public void testInsertUser(){ SqlSession sqlSession= MybatisUtils.sqlSession(); try { UserDao DAO=sqlSession.getMapper(UserDao.class); User user = new User("user4","123456", "fasfaf@qq.com"); int res=DAO.insertUser(user); if(res>0){ System.out.println("插入成功"+res); } sqlSession.commit();//增删改需要提交事务 } finally { sqlSession.close(); } }
**注意:**增删改需要提交事务!!
-
注解方式:
类似select的注解方式:
public interface UserDao { @Insert("insert into user values (#{name},#{passsword},#{Email})") int insertUser(User user); }
**注意:**可以设置自动提交事务!!
四、update
更新语句
-
编写接口
int updateUser(User user);
-
编写接口对应的mapper中的SQL语句
<update id="updateUser" parameterType="entity.User"> update user set pwd = #{pwd} where username=#{username}; </update>
-
测试
//增删改需要提交事务 @Test public void testUpdateUser(){ SqlSession sqlSession= MybatisUtils.sqlSession(); try { UserDao DAO=sqlSession.getMapper(UserDao.class); User user = new User("user2","1234", "fasfaf@qq.com"); int res=DAO.updateUser(user); if(res>0){ System.out.println("更新成功"+res); } sqlSession.commit();//增删改需要提交事务 } finally { sqlSession.close(); } }
**注意:**增删改需要提交事务!!
-
注解方式:
类似select的注解方式:
public interface UserDao { @Update("update user set pwd = #{pwd} where username=#{username};") int updateUser(User user); }
**注意:**可以设置自动提交事务!!
五、delete
删除语句
-
编写接口
int deleteUser(User user);
-
编写接口对应的mapper中的SQL语句
<delete id="deleteUser" parameterType="entity.User"> delete from user where username =#{username} </delete>
-
测试
//增删改需要提交事务 @Test public void testdeleteUser(){ SqlSession sqlSession= MybatisUtils.sqlSession(); try { UserDao DAO=sqlSession.getMapper(UserDao.class); User user = new User("user4","", ""); int res=DAO.deleteUser(user); if(res>0){ System.out.println("删除成功"+res); } sqlSession.commit();//增删改需要提交事务 } finally { sqlSession.close(); } }
**注意:**增删改需要提交事务!!
-
注解方式:
类似select的注解方式:
public interface UserDao { @Update(" delete from user where username =#{username}") int deleteUser(@Param("username") String username); }
**注意:**可以设置自动提交事务!!
六、注意事项
1、接口方法对应的mapper中的标签不要写错
如:selectuser() 对应mapper中的标签、insertuser() 对应mapper中的标签
2、resource绑定mapper需要使用路径
<mapper resource="com/resource/UserDao.xml"/>
而不是:
<mapper resource="com.resource.UserDao.xml"/>
3、程序配置文件必须符合规范
4、maven资源没有导出问题
参考这篇:maven配置注意事项
5、关于@Param() 注解
- 基本类型的参数或者String类型的参数需要加上
- 引用类型的参数不用加
- 如果只有一个基本类型,可以忽略,建议加上
- 在Sql中引用的就是在@Param()中设定的属性名
七、小技巧
1、map
使用map传递参数,可以跳出实体类和方法传参的一些限制,不必必须一一对应实体类中的每个属性,可自行定制所需传递的参数
使用方法对比:
dao接口:
int insertUser(User user); //不使用map
int addUser(Map<String,Object> map); //使用map
mapper:
<!--不使用map-->
<insert id="insertUser" parameterType="entity.User">
insert into user values (#{username},#{pwd},#{email})
</insert>
<!--使用map-->
<insert id="addUser" parameterType="Map">
insert into user values (#{name},#{passsword},#{Email})
</insert>
调用:
//不使用map
public void testInsertUser(){
SqlSession sqlSession= MybatisUtils.sqlSession();
try {
UserDao DAO=sqlSession.getMapper(UserDao.class);
User user = new User("user4","123456", "fasfaf@qq.com");
int res=DAO.insertUser(user);
if(res>0){
System.out.println("插入成功"+res);
}
sqlSession.commit();//增删改需要提交事务
} finally {
sqlSession.close();
}
}
//使用map
public void testAddtUser(){
SqlSession sqlSession= MybatisUtils.sqlSession();
try {
UserDao DAO=sqlSession.getMapper(UserDao.class);
//map处的字段不一定要与实体类和数据库相对应
Map<String,Object> map =new HashMap<String,Object>();
map.put("name","user5");
map.put("passsword","123");
map.put("Email","asfafas@qq.com");
int res=DAO.addUser(map);
if(res>0){
System.out.println("插入成功"+res);
}
sqlSession.commit();//增删改需要提交事务
} finally {
sqlSession.close();
}
}
对比:
map传递参数,直接在sql中去出key即可
对象传递参数,直接在sqi中取对象属性即可
小结:
1、使用mapper可以在一个方法内同时使用多个实体类的属性向数据库查询,方便多表联合查询等操作;
2、多个参数用Map,或者注解
2、模糊查询
(1)java代码执行的时候,传递通配符% %
List<User> stu = DAO.getUserLike("%李%");
(2)在sql拼接中使用通配符% %
<select id="getUserLike" resultType="entity.User">
select * from user where username like "%"#{value}"%"
</select>