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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/237719.html
標籤:其他
上一篇:sql server資料庫練習
