MyBatis單表的CRUD

MyBatis的單表的crud

創(chuàng)建maven項目次酌,并分別添加依賴,junit厨喂,mysql和措,mybatis(3.4.6)

在resouces下創(chuàng)建mybatis的配置文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

? ? ? ? PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

? ? ? ? "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--

? ? 該配置文件中包含一個configuration節(jié)點

? ? ? ? 里面有配置信息 分別是環(huán)境和映射

? ? ? ?  其中環(huán)境里有datasource,里面有我們熟悉的連接數(shù)據(jù)庫的四個字符串

-->

<configuration>

? ? <environments default="development">

? ? ? ? <environment id="development">

? ? ? ? ? ? <transactionManager type="JDBC"/>

? ? ? ? ? ? <dataSource type="POOLED">

? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.jdbc.Driver"/>

? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://localhost:3306/hello"/>

? ? ? ? ? ? ? ? <property name="username" value="root"/>

? ? ? ? ? ? ? ? <property name="password" value="123456"/>

? ? ? ? ? ? </dataSource>

? ? ? ? </environment>

? ? </environments>

? ? <mappers>

? ? ? ? <mapper resource="com/qfedu/pojo/UserMapper.xml"/>

? ? </mappers>

</configuration>


db.sql

CREATE TABLE `user` (

? `uid` int(11) NOT NULL AUTO_INCREMENT,

? `username` varchar(20) NOT NULL,

? `password` varchar(20) NOT NULL,

? `age` int(11) DEFAULT NULL,

? `addr` varchar(50) DEFAULT NULL,

? PRIMARY KEY (`uid`),

? UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1

123456789

User.java

package com.qfedu.pojo;

public class User {

? ? private int uid;

? ? private String username;

? ? private String password;

? ? private int age;

? ? private String addr;

? ? @Override

? ? public String toString() {

? ? ? ? return "User{" +

? ? ? ? ? ? ? ? "uid=" + uid +

? ? ? ? ? ? ? ? ", username='" + username + '\'' +

? ? ? ? ? ? ? ? ", password='" + password + '\'' +

? ? ? ? ? ? ? ? ", age=" + age +

? ? ? ? ? ? ? ? ", addr='" + addr + '\'' +

? ? ? ? ? ? ? ? '}';

? ? }

? ? public int getUid() {

? ? ? ? return uid;

? ? }

? ? public void setUid(int uid) {

? ? ? ? this.uid = uid;

? ? }

? ? public String getUsername() {

? ? ? ? return username;

? ? }

? ? public void setUsername(String username) {

? ? ? ? this.username = username;

? ? }

? ? public String getPassword() {

? ? ? ? return password;

? ? }

? ? public void setPassword(String password) {

? ? ? ? this.password = password;

? ? }

? ? public int getAge() {

? ? ? ? return age;

? ? }

? ? public void setAge(int age) {

? ? ? ? this.age = age;

? ? }

? ? public String getAddr() {

? ? ? ? return addr;

? ? }

? ? public void setAddr(String addr) {

? ? ? ? this.addr = addr;

? ? }

}

在com.qfedu.pojo的包下創(chuàng)建UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

? ? ? ? PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

? ? ? ? "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--

? ? 每個mapper文件都將有一個自己的映射的namespace蜕煌,

? ? 每個方法對應(yīng)自己的sql語句派阱,每個sql語句對應(yīng)有一個id

? ? 整個項目中所有的namespace.id必須是唯一的

-->

<mapper namespace="com.qfedu.pojo.UserMapper">

? ? <select id="selectUser" resultType="com.qfedu.pojo.User">

? ? ? select * from user

? ? </select>

? ? <select id="selectUserCount" resultType="int">

? ? ? ? select count(1) from user;

? ? </select>

? ? <select id="selectUsersByPage1" resultType="com.qfedu.pojo.User">

? ? ? ? select * from user limit 3

? ? </select>

? ? <select id="selectUsersByPage2" resultType="com.qfedu.pojo.User">

? ? ? ? select * from user limit #{pageSize}

? ? </select>

? ? <select id="selectUsersByPage3" resultType="com.qfedu.pojo.User">

? ? ? ? select * from user limit #{startIndex}, #{pageSize}

? ? </select>

? ? <delete id="saveUser">

? ? ? ? insert into user values(null, #{username}, #{password}, #{age}, #{addr});

? ? </delete>

? ? <delete id="deleteUserByUid">

? ? ? ? delete from user where uid = #{uid}

? ? </delete>

? ? <update id="updateUser">

? ? ? ? update user set username= #{username}, password=#{password}, age = #{age}, addr = #{addr} where uid = #{uid};

? ? </update>

</mapper>


TestUser.java

package com.qfedu.test;

import com.qfedu.pojo.User;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import java.io.IOException;

import java.sql.Connection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class TestUser {

? ? private SqlSessionFactory sf = null;

? ? private SqlSession session = null;

? ? @Before

? ? public void setUp(){

? ? ? ? try {

? ? ? ? ? ? sf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));

? ? ? ? ? ? session = sf.openSession();

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

? ? @After

? ? public void tearDown(){

? ? ? ? if(session != null){

? ? ? ? ? ? session.close();

? ? ? ? ? ? session = null;

? ? ? ? }

? ? }

? ? @Test

? ? public void testGetAllUsers(){

? ? ? ? /**

? ? ? ? *? 1.? 使用mybatis的配置文件以及SqlSessionFactoryBuilder建造者模式創(chuàng)建SqlSessionFactory對象

? ? ? ? *? 2.? 使用SqlSessionFactory對象的openSession()方法來得到一個SqlSession對象,用該對象即可完成對象的所有的crud操作

? ? ? ? *? 3.? 使用SqlSession對象來完成crud操作

? ? ? ? *? 4.? 關(guān)閉資源

? ? ? ? *

? ? ? ? */

? ? ? ? /**

? ? ? ? * session的crud方法("namespace.id");整個項目中的namespace.id必須唯一

? ? ? ? */

? ? ? ? List<User> users = session.selectList("com.qfedu.pojo.UserMapper.selectUser");

? ? ? ? for (User u : users) {

? ? ? ? ? ? System.out.println(u);

? ? ? ? }

? ? }

? ? @Test

? ? public void testGetAllUsersCount(){

? ? ? ? /**

? ? ? ? *? 1.? 使用mybatis的配置文件以及SqlSessionFactoryBuilder建造者模式創(chuàng)建SqlSessionFactory對象

? ? ? ? *? 2.? 使用SqlSessionFactory對象的openSession()方法來得到一個SqlSession對象斜纪,用該對象即可完成對象的所有的crud操作

? ? ? ? *? 3.? 使用SqlSession對象來完成crud操作

? ? ? ? *? 4.? 關(guān)閉資源

? ? ? ? *

? ? ? ? */

? ? ? ? /**

? ? ? ? * session的crud方法("namespace.id");整個項目中的namespace.id必須唯一

? ? ? ? */

? ? ? ? Integer count = session.selectOne("com.qfedu.pojo.UserMapper.selectUserCount");

? ? ? ? System.out.println(count);

? ? }

? ? @Test

? ? public void testGetUsersByPage1(){

? ? ? ? List<User> users = session.selectList("com.qfedu.pojo.UserMapper.selectUsersByPage1");

? ? ? ? for (User u : users) {

? ? ? ? ? ? System.out.println(u);

? ? ? ? }

? ? }

? ? @Test

? ? public void testGetUsersByPage2(){

? ? ? ? List<User> users = session.selectList("com.qfedu.pojo.UserMapper.selectUsersByPage2", 9);

? ? ? ? for (User u : users) {

? ? ? ? ? ? System.out.println(u);

? ? ? ? }

? ? }

? ? @Test

? ? public void testGetUsersByPage3(){

? ? ? ? Map<String, Integer> map = new HashMap<>();

? ? ? ? map.put("startIndex", 10);

? ? ? ? map.put("pageSize", 5);

? ? ? ? List<User> users = session.selectList("com.qfedu.pojo.UserMapper.selectUsersByPage3", map);

? ? ? ? for (User u : users) {

? ? ? ? ? ? System.out.println(u);

? ? ? ? }

? ? }

? ? @Test

? ? public? void testSaveUser(){

? ? ? ? User u = new User();

? ? ? ? u.setUsername("lisi");

? ? ? ? u.setPassword("888888");

? ? ? ? u.setAddr("wuhan");

? ? ? ? u.setAge(20);

? ? ? ? int result = session.insert("com.qfedu.pojo.UserMapper.saveUser", u);

? ? ? ? System.out.println(result);

? ? }

? ? @Test

? ? public void testDelete(){

? ? ? ? Integer result = session.delete("com.qfedu.pojo.UserMapper.deleteUserByUid", 9);

? ? ? ? System.out.println(result);

? ? }

? ? @Test

? ? public void testUpdate(){

? ? ? ? User user = new User();

? ? ? ? user.setUid(8);

? ? ? ? user.setUsername("888");

? ? ? ? user.setPassword("lisixin");

//? ? ? ? user.setAge(20);

//? ? ? ? user.setAddr("nanjing");

? ? ? ? int result = session.update("com.qfedu.pojo.UserMapper.updateUser", user);

? ? ? ? session.commit();? ? ? //

? ? ? ? System.out.println(result);

? ? }

}


本案例要注意一些問題:

1. UserMapper的映射文件:

? 1. namespace和id在整個項目中贫母,必須要保證唯一

? 2. namespace+id找到的是唯一的sql語句,標(biāo)簽可能不對應(yīng)盒刚,但是不影響執(zhí)行結(jié)果腺劣,但是還是需要規(guī)范各個標(biāo)簽

2. TestUser.java

? 1. 創(chuàng)建SqlSession對象的時候,SqlSessionFactory對象的openSession()方法不包含參數(shù)因块,則使用事務(wù)手動提交橘原,做完增刪改操作后,需要調(diào)用SqlSession對象的commit()方法完成事務(wù)的提交涡上。如果openSession()方法包含有一個true趾断,代表自動提交生效,我們做完增刪改操作時候吩愧,就完成了對應(yīng)的增刪改功能芋酌。openSession()方法默認(rèn)的提交方式為手動提交

? 2. 該類活用了junit的生命周期方法,每個測試方法執(zhí)行之前都會調(diào)用標(biāo)注有@Before注解的setUp()方法完成環(huán)境的準(zhǔn)備工作雁佳,每個方法完成之后都自動的執(zhí)行標(biāo)注有@After注解的tearDown()方法完成資源的釋放工作

? 3. SqlSession是mybatis中的核心對象脐帝,使用該對象即可完成對于所有操作的crud功能,里面有對應(yīng)的方法糖权,selectList()堵腹,查詢列表(集合),selectOne()查詢單個對象星澳,insert()秸滴,delete,update()分別對應(yīng)增刪改功能募判。這三個方法的返回值均為受影響的行數(shù)

? 4. 每次使用完SqlSession對象之后荡含,使用close()方法將SqlSession對象關(guān)閉,不建議關(guān)閉SqlSessionFactory對象

? 5. 關(guān)于傳遞參數(shù)

? ? ? 1. 傳遞單個值届垫,sql語句里面的占位符可以任意寫

? ? ? 2. 多個值释液,可以使用Map來傳值,map中的key要與sql語句中的占位符一致

? ? ? 3. 對象傳值装处,sql語句中的字段值與對象的屬性名一致

? ? ? 4. 零散值的傳遞误债,可以使用兩種方式arg0, arg1妄迁,...或者param1寝蹈,param2...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市登淘,隨后出現(xiàn)的幾起案子箫老,更是在濱河造成了極大的恐慌,老刑警劉巖黔州,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耍鬓,死亡現(xiàn)場離奇詭異,居然都是意外死亡流妻,警方通過查閱死者的電腦和手機牲蜀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绅这,“玉大人涣达,你說我怎么就攤上這事≈ま保” “怎么了度苔?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棕叫。 經(jīng)常有香客問我林螃,道長,這世上最難降的妖魔是什么俺泣? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任疗认,我火速辦了婚禮,結(jié)果婚禮上伏钠,老公的妹妹穿的比我還像新娘横漏。我一直安慰自己,他們只是感情好熟掂,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布缎浇。 她就那樣靜靜地躺著,像睡著了一般赴肚。 火紅的嫁衣襯著肌膚如雪素跺。 梳的紋絲不亂的頭發(fā)上二蓝,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音指厌,去河邊找鬼刊愚。 笑死,一個胖子當(dāng)著我的面吹牛踩验,可吹牛的內(nèi)容都是我干的鸥诽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼箕憾,長吁一口氣:“原來是場噩夢啊……” “哼牡借!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袭异,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤钠龙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扁远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊鱼,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年畅买,在試婚紗的時候發(fā)現(xiàn)自己被綠了并闲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷羞,死狀恐怖帝火,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情湃缎,我是刑警寧澤犀填,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站嗓违,受9級特大地震影響九巡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹂季,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一冕广、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偿洁,春花似錦撒汉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春溯饵,著一層夾襖步出監(jiān)牢的瞬間侵俗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工丰刊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坡慌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓藻三,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跪者。 傳聞我的和親對象是個殘疾皇子棵帽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容