CRUD操作
本文參考自狂神博客(點擊打開)
namespace
1.將上面案例中的UserMapper接口改名爲 UserDao;
2.將UserMapper.xml中的namespace改爲爲UserDao的路徑
3.再次測試
結論:
配置文件中namespace中的名稱爲對應Mapper接口或者Dao接口的完整包名,必須一致!
select
-
select標籤是mybatis中最常用的標籤之一
-
select語句有很多屬性可以詳細配置每一條SQL語句
id -
命名空間中唯一的標識符
-
接口中的方法名與映射文件中的SQL語句ID一 一對應
-
parameterType
-
傳入SQL語句的參數類型 。【萬能的Map,可以多嘗試使用】
-
resultType
-
SQL語句返回值類型。【完整的類名或者別名】
需求:根據id查詢用戶
1.在UserMapper中添加對應方法
public interface UserMapper {
//查詢全部用戶
List<User> selectUser();
//根據id查詢用戶
User selectUserById(int id);
}
2.在UserMapper.xml中添加Select語句
<select id="selectUserById" resultType="com.kuang.pojo.User">
select * from user where id = #{id}
</select>
3.測試類中測試
@Test
public void tsetSelectUserById() {
SqlSession session = MybatisUtils.getSession(); //獲取SqlSession連接
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
思路一:直接在方法中傳遞參數
1.在接口方法的參數前加 @Param屬性
2.Sql語句編寫的時候,直接取@Param中設置的值即可,不需要單獨設置參數類型
//通過密碼和名字查詢用戶
User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
/*
<select id="selectUserByNP" resultType="com.kuang.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
*/
思路二:使用萬能的Map
1.在接口方法中,參數直接傳遞Map;
User selectUserByNP2(Map<String,Object> map);
2.編寫sql語句的時候,需要傳遞參數類型,參數類型爲map
<select id="selectUserByNP2" parameterType="map" resultType="com.kuang.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
3.在使用方法的時候,Map的 key 爲 sql中取的值即可,沒有順序要求!
Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = mapper.selectUserByNP2(map);
總結:
如果參數過多,我們可以考慮直接使用Map實現,如果參數比較少,直接傳遞參數即可
insert
我們一般使用insert標籤進行插入操作,它的配置和select標籤差不多!
需求:給數據庫增加一個用戶
1.在UserMapper接口中添加對應的方法
//添加一個用戶
int addUser(User user);
2.在UserMapper.xml中添加insert語句
<insert id="addUser" parameterType="com.kuang.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
3.測試
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5,"王五","zxcvbn");
int i = mapper.addUser(user);
System.out.println(i);
session.commit(); //提交事務,重點!不寫的話不會提交到數據庫
session.close();
}
注意點:增、刪、改操作需要提交事務!
update
我們一般使用update標籤進行更新操作,它的配置和select標籤差不多!
需求:修改用戶的信息
1.同理,編寫接口方法
//修改一個用戶
int updateUser(User user);
2.編寫對應的配置文件SQL
<update id="updateUser" parameterType="com.kuang.pojo.User">
update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
3.測試
@Test
public void testUpdateUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
user.setPwd("asdfgh");
int i = mapper.updateUser(user);
System.out.println(i);
session.commit(); //提交事務,重點!不寫的話不會提交到數據庫
session.close();
}
delete
我們一般使用delete標籤進行刪除操作,它的配置和select標籤差不多!
需求:根據id刪除一個用戶
1.同理,編寫接口方法
//根據id刪除用戶
int deleteUser(int id);
2.編寫對應的配置文件SQL
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
3.測試
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.deleteUser(5);
System.out.println(i);
session.commit(); //提交事務,重點!不寫的話不會提交到數據庫
session.close();
}
map
//萬能的Map
int addUser2(Map<String ,Object> map);
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd) values (#{userId},#{userName },#{passWord});
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);//傳進去接口.class文件
Map<String, Object> map = new HashMap<String, Object>();
map.put("userId",6);
map.put("userName","Hello");
map.put("passWord","3333");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
Map傳遞參數,直接在SQL中取出key即可!(parameterType=“map”)
對象傳遞參數,直接在sql中取對象的屬性即可!(parameterType=“Object”)
只有一個基本類型參數的情況下,可以直接在sql中取到!
多個參數用map,或者註解
小結:
- 所有的增刪改操作都需要提交事務!
- 接口所有的普通參數,儘量都寫上@Param參數,尤其是多個參數時,必須寫上!
- 有時候根據業務的需求,可以考慮使用map傳遞參數!
- 爲了規範操作,在SQL的配置文件中,我們儘量將Parameter參數和resultType都寫上!
##思考題
模糊查詢like語句該怎麼寫?
第1種:在Java代碼中添加sql通配符。
string wildcardname = “%楊%”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like #{value}
</select>
第2種:在sql語句中拼接通配符,會引起sql注入
string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>