最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通過(guò)MyBatis框架對(duì)MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法

 更新時(shí)間:2016年06月01日 14:53:12   作者:czj4451  
MyBatis框架由Java的JDBC API進(jìn)一步封裝而來(lái),在操作數(shù)據(jù)庫(kù)方面效果拔群,接下來(lái)我們就一起來(lái)看看Java通過(guò)MyBatis框架對(duì)MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法:

1. 查詢

除了單條記錄的查詢,這里我們來(lái)嘗試查詢一組記錄。

IUserMapper接口添加下面方法:

List<User> getUsers(String name); 

在User.xml中添加:

<resultMap type="User" id="userList"><!-- type為返回列表元素的類全名或別名 --> 
  <id column="id" property="id" /> 
  <result column="name" property="name" /> 
  <result column="age" property="age" /> 
  <result column="address" property="address" /> 
</resultMap> 
 
<select id="getUsers" parameterType="string" resultMap="userList"><!-- resultMap為上面定義的User列表 --> 
  select * from `user` where name like #{name} 
</select> 

測(cè)試方法:

@Test 
public void queryListTest() { 
  SqlSession session = sqlSessionFactory.openSession(); 
  try { 
    IUserMapper mapper = session.getMapper(IUserMapper.class); 
    List<User> users = mapper.getUsers("%a%"); // %在sql里代表任意個(gè)字符。 
    for (User user : users) { 
      log.info("{}: {}", user.getName(), user.getAddress()); 
    } 
  } finally { 
    session.close(); 
  } 
} 

如果聯(lián)表查詢,返回的是復(fù)合對(duì)象,需要用association關(guān)鍵字來(lái)處理。
如User發(fā)表Article,每個(gè)用戶可以發(fā)表多個(gè)Article,他們之間是一對(duì)多的關(guān)系。

(1) 創(chuàng)建Article表,并插入測(cè)試數(shù)據(jù):

-- Drop the table if exists 
DROP TABLE IF EXISTS `Article`; 
 
-- Create a table named 'Article' 
CREATE TABLE `Article` ( 
  `id` int NOT NULL AUTO_INCREMENT, 
  `user_id` int NOT NULL, 
  `title` varchar(100) NOT NULL, 
  `content` text NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
 
-- Add several test records 
INSERT INTO `article` 
VALUES 
('1', '1', 'title1', 'content1'), 
('2', '1', 'title2', 'content2'), 
('3', '1', 'title3', 'content3'), 
('4', '1', 'title4', 'content4'); 

(2) com.john.hbatis.model.Article類:

public class Article { 
  private int id; 
  private User user; 
  private String title; 
  private String content; 
  // Getters and setters are omitted 
} 

(3) 在IUserMapper中添加:

List<Article> getArticlesByUserId(int id); 

(4) 在User.xml中添加:

<resultMap type="com.john.hbatis.model.Article" id="articleList"> 
  <id column="a_id" property="id" /> 
  <result column="title" property="title" /> 
  <result column="content" property="content" /> 
   
  <association property="user" javaType="User"><!-- user屬性映射到User類 --> 
    <id column="id" property="id" /> 
    <result column="name" property="name" /> 
    <result column="address" property="address" /> 
  </association> 
</resultMap> 
 
<select id="getArticlesByUserId" parameterType="int" resultMap="articleList"> 
  select u.id, u.name, u.age, u.address, a.id a_id, a.title, a.content 
  from article a 
  inner join user u 
  on a.user_id=u.id and u.id=#{id} 
</select> 

(5)測(cè)試方法:

@Test 
public void getArticlesByUserIdTest() { 
  SqlSession session = sqlSessionFactory.openSession(); 
  try { 
    IUserMapper mapper = session.getMapper(IUserMapper.class); 
    List<Article> articles = mapper.getArticlesByUserId(1); 
    for (Article article : articles) { 
      log.info("{} - {}, author: {}", article.getTitle(), article.getContent(), article.getUser().getName()); 
    } 
  } finally { 
    session.close(); 
  } 
} 

附:
除了在association標(biāo)簽內(nèi)定義字段和屬性的映射外,還可以重用User的resultMap:

<association property="user" javaType="User" resultMap="userList" /> 

2. 新增

IUserMapper接口添加下面方法:

int addUser(User user); 

User.xml添加:

<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"><!-- useGeneratedKeys指定myBatis使用數(shù)據(jù)庫(kù)自動(dòng)生成的主鍵,并填充到keyProperty指定的屬性上。如果未指定,返回對(duì)象拿不到生成的值 --> 
  insert into user(name,age,address) values(#{name},#{age},#{address}) 
</insert> 

測(cè)試方法:

@Test 
public void addUserTest() { 
  User user = new User("Lucy", 102, "Happy District"); 
  SqlSession session = sqlSessionFactory.openSession(); 
  try { 
    IUserMapper mapper = session.getMapper(IUserMapper.class); 
    int affectedCount = mapper.addUser(user); 
    session.commit(); // 默認(rèn)為不自動(dòng)提交。調(diào)用session.getConnection().getAutoCommit()查看 
    log.info("{} new record was inserted successfully whose id: {}", affectedCount, user.getId()); 
  } finally { 
    session.close(); 
  } 
} 

3. 更新

接口添加方法:

int updateUser(User user); 

User.xml添加:

<update id="updateUser" parameterType="User"> 
  update `user` set name=#{name}, age=#{age}, address=#{address} 
  where id=#{id} 
</update> 

測(cè)試方法:

@Test 
public void updateUserTest() { 
  SqlSession session = sqlSessionFactory.openSession(); 
  try { 
    IUserMapper mapper = session.getMapper(IUserMapper.class); 
    User user = mapper.getUserById(8); 
    user.setAddress("Satisfied District"); 
    int affectedCount = mapper.updateUser(user); // 除了要修改的屬性外,user的其它屬性也要賦值,否則這些屬性會(huì)被數(shù)據(jù)庫(kù)更新為初始值(null或0等),可以先查詢一次,但這樣會(huì)增加和數(shù)據(jù)庫(kù)不必要的交互。后面的條件判斷能避免此問題。 
    log.info("Affected count: {}", affectedCount); 
    session.commit(); 
  } finally { 
    session.close(); 
  } 
} 

 4. 刪除

接口添加方法:

int deleteUser(int id); 

User.xml添加:

<delete id="deleteUser" parameterType="int"> 
  delete from `user` where id=#{id} 
</delete> 

測(cè)試方法:

@Test 
public void deleteUserTest() { 
  SqlSession session = sqlSessionFactory.openSession(); 
  try { 
    IUserMapper mapper = session.getMapper(IUserMapper.class); 
    int affectedCount = mapper.deleteUser(8); 
    log.info("Affected count: {}", affectedCount); 
    session.commit(); 
  } finally { 
    session.close(); 
  } 
} 

相關(guān)文章

  • Java線程協(xié)作的兩種方式小結(jié)

    Java線程協(xié)作的兩種方式小結(jié)

    Java中線程協(xié)作的最常見的兩種方式是利用Object.wait()、Object.notify()和使用Condition,本文主要介紹了Java線程協(xié)作的兩種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 微服務(wù)eureka和nacos案例詳解

    微服務(wù)eureka和nacos案例詳解

    這篇文章主要介紹了微服務(wù)eureka和nacos,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Java StampedLock實(shí)現(xiàn)原理與最佳實(shí)踐記錄

    Java StampedLock實(shí)現(xiàn)原理與最佳實(shí)踐記錄

    本文介紹了Java 8引入的StampedLock,這是一種多模式同步控制組件,通過(guò)“戳”(stamp)標(biāo)識(shí)鎖的狀態(tài),支持寫鎖、悲觀讀鎖和樂觀讀三種模式,StampedLock在特定場(chǎng)景下能夠大幅提升系統(tǒng)性能,特別是在讀多寫少的場(chǎng)景中,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • SpringCloud負(fù)載均衡實(shí)現(xiàn)定向路由詳情

    SpringCloud負(fù)載均衡實(shí)現(xiàn)定向路由詳情

    這篇文章主要介紹了SpringCloud負(fù)載均衡實(shí)現(xiàn)定向路由詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java工程中可執(zhí)行JAR兩種打包方式詳解

    Java工程中可執(zhí)行JAR兩種打包方式詳解

    這篇文章主要為大家詳細(xì)介紹了Java工程中可執(zhí)行JAR兩種打包方式,一體化可執(zhí)行包和帶外部依賴lib的可執(zhí)行包,有需要的小伙伴可以學(xué)習(xí)一下
    2024-04-04
  • JavaCV與FFmpeg音視頻流處理技巧總結(jié)大全

    JavaCV與FFmpeg音視頻流處理技巧總結(jié)大全

    JavaCV是一個(gè)開源的Java接口,它為幾個(gè)著名的計(jì)算機(jī)視覺庫(kù)(如OpenCV、FFmpeg)提供了Java封裝,這篇文章主要給大家介紹了關(guān)于JavaCV與FFmpeg音視頻流處理技巧總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • java中對(duì)象和JSON格式的轉(zhuǎn)換方法代碼

    java中對(duì)象和JSON格式的轉(zhuǎn)換方法代碼

    JSON格式可以輕松地以面向?qū)ο蟮姆绞睫D(zhuǎn)換為Java對(duì)象,下面這篇文章主要給大家介紹了關(guān)于java中對(duì)象和JSON格式的轉(zhuǎn)換方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • java制作仿微信錄制小視頻控件

    java制作仿微信錄制小視頻控件

    這篇文章主要介紹了java制作仿微信錄制小視頻控件的代碼,錄制小視頻非常方便,有需要的小伙伴可以參考下。
    2015-04-04
  • Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能

    Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能

    這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過(guò)程,需要前端和后端配合,比如前后端的上傳塊號(hào)的文件大小,前后端必須得要一致,否則上傳就會(huì)有問題,需要的朋友可以參考下
    2022-12-12
  • Java中的封裝性(包含this關(guān)鍵字,構(gòu)造器等)

    Java中的封裝性(包含this關(guān)鍵字,構(gòu)造器等)

    這篇文章主要介紹了Java中的封裝性(包含this關(guān)鍵字,構(gòu)造器等)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論

龙里县| 马龙县| 宜兰市| 罗山县| 德江县| 德安县| 家居| 治县。| 天津市| 平阳县| 开平市| 饶阳县| 崇信县| 循化| 红河县| 昌平区| 竹溪县| 广德县| 秦皇岛市| 孟州市| 永川市| 濉溪县| 佛坪县| 禹州市| 英超| 澄城县| 邵东县| 木兰县| 亳州市| 饶阳县| 陆丰市| 济源市| 阜南县| 易门县| 高陵县| 尉氏县| 安康市| 遂川县| 合山市| 吉隆县| 无为县|