CRUD
增刪改操作,執行完sql後,需要提交事務,否則不生效。
查詢不需要提交事務。
通過SqlSession對象提交事務。
參數格式
sql語句中填寫參數的格式:#{}
在sql語句中填寫參數時,如果接口中的參數是類,那麼可以直接寫類中的屬性,如果不是類,接口中的方法參數是什麼,就寫什麼。
select
- id:對應namespace中的方法名
- resulteType:sqlj返回值結果的數據類型
- parameterType:sql參數類型
步驟:
- 在接口中定義方法。
- 在mapper.xml中定義sql語句。
接口中的方法:
List<User> getUserList();
sql語句
<select id="getUserList" resultType="top.jarvaniv.pojo.User">
select * from test.temp
</select>
執行:
// 查詢所有用戶
@Test
public void getUserListTest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close(); // 一定要關閉資源
}
insert
接口中的方法:
// 插入數據,User類型,返回值是插入了多少數據
int insertUser(User user);
sql語句
<insert id="insertUser" parameterType="top.jarvaniv.pojo.User">
--填參數時,可以直接使用user對象中的屬性名進行調用
insert into test.temp (id,name) values (#{id},#{name})
</insert>
執行
// 插入用戶
@Test
public void insertUserTest(){
// 在工具類中獲取SqlSession對象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 加載mapper類型,獲取UserMapper接口類型的對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insertUser(new User(101,"張三"));
sqlSession.commit(); // 增刪改 要提交事務
sqlSession.close(); //最後一定記得要關閉資源
}
update
接口中的方法:
// 修改數據,根據id值,將數據庫中對應id值的數據改成參數user中的數據,返回值是修改了多少條數據
int updataUser(User user);
sql語句
<update id="updataUser" parameterType="top.jarvaniv.pojo.User">
-- 根據參數user,修改數據表中的數據
update test.temp set name=#{
name} where id=#{
id}
</update>
執行
// 修改用戶名字
@Test
public void updataUserTest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.updataUser(new User(100, "李四"));
sqlSession.commit();
if (result > 0 ){
System.out.println("修改成功");
}
sqlSession.close();
}
delete
接口中的方法:
// 刪除數據,根據User的id值刪除,返回值是刪除了多少條數據
int deleteUser(int id );
sql語句
<delete id="deleteUser" parameterType="int">
-- 根據用戶id值刪除
-- 直接將方法中的參數傳入進來
delete from test.temp where id=#{
id}
</delete>
執行
// 根據id刪除用戶
@Test
public void deleteUserTest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.deleteUser(24);
sqlSession.commit();
if (result > 0){
System.out.println("刪除成功");
}
sqlSession.close();
}
萬能map
如果實體類或者數據庫表字段太多,那麼在插入、修改等操作時,即使僅僅需要修改一個字段,那麼也需要寫很多不需要的字段,很麻煩,因此,可以用map集合,把需要使用的字段存入到map集合中,在執行sql語句時,通過取map集合中的數據,來向sql語句中插入數據。
由多個參數不好操作時,可以用map。
接口中方法:
// 使用map集合修改temp表數據
int updataOfMapTemp(Map map);
sql語句:
<update id="updataOfMapTemp" parameterType="map">
--可以直接調用map集合中的鍵
update test.temp set name=#{name} where id=#{id}
</update>
執行:
// 通過map修改temp表數據
@Test
public void updataOfMapTempTest() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,String> map = new HashMap<>();
map.put("id","23");
map.put("name","王五");
userMapper.updataOfMapTemp(map);
sqlSession.commit();
sqlSession.close();
}
模糊查詢問題
模糊查詢時,模糊的部分(字符)在sql語句中寫死(類似於預編譯),防止sql的依賴注入。
實體類屬性名與數據庫字段名不匹配的問題
問題:
將數據庫中查詢結果存放的數據庫中時,如果類中的屬性名和數據庫字段名不一致(例如:pws與password),那麼,讀取出來的password就是null。
解決方式:
方法一:
在SQL查詢語句中,將數據庫字段起別名爲實體類的屬性名。
將數據庫字段pwd,設置別名password,與實體類的屬性名一致。
<select id="selectUserById" resultType="User">
select id , name , pwd as password from user where id = #{id}
</select>
這種方式不建議使用。不方便。
方法二:結果集映射(resultMap)
映射實體類與數據庫表字段之間的關係
<!-- 要將查詢的結果映射成一個User對象-->
<resultMap id="UserMap" type="User">
<!-- id爲主鍵 -->
<id column="id" property="id"/>
<!-- column是數據庫表的列名 , property是對應實體類的屬性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<!-- resultMap設置使用哪個resultMap映射 -->
<select id="selectUserById" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>
對於字段名與屬性名相同的字段,可以不用在映射中寫,只需要寫字段名與屬性名不一致的部分。例如:上個例子中的id
與name
,字段名與屬性名是一樣的,就可以在resultMap省略不寫,只映射不同的pwd與password。