一、不用純jdbc的原因,即缺點(diǎn)。
為洪湖等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及洪湖網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、洪湖網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
1、數(shù)據(jù)庫理解,使用時(shí)創(chuàng)建,不用時(shí)釋放,會(huì)對(duì)數(shù)據(jù)庫進(jìn)行頻繁的鏈接開啟和關(guān)閉,造成數(shù)據(jù)庫的資源浪費(fèi),影響數(shù)據(jù)庫的性能。
設(shè)想:使用數(shù)據(jù)庫的連接池。
2、將sql語句硬編碼到j(luò)ava代碼中,不利于系統(tǒng)維護(hù)。
設(shè)想:將sql放到配置文件中。
3、向preparedstatement中設(shè)置參數(shù),對(duì)占位符位置和設(shè)置參數(shù)值,硬編碼在Java代碼中,不利于系統(tǒng)維護(hù)。
設(shè)想:將sql語句及占位符配置到xml中。
4、從resultset中便利結(jié)果集時(shí),存在硬編碼,將獲取表的字段進(jìn)行硬編碼,不利于系統(tǒng)維護(hù)。
設(shè)想;將結(jié)果集,自動(dòng)映射成Java對(duì)象
二、mybatis是什么
1、mybatis讓程序員將主要精力放在sql上,通過mybatis提供的映射方式,自由靈活生成滿足需要的sql語句。
2、mybatis可以將輸入?yún)?shù)自動(dòng)映射,可以將結(jié)果集映射為Java對(duì)象,并且sql相對(duì)自由,不想hibernate那樣看不到sql。
3、mybatis需要一個(gè)SqlMapConfig.xml,它是mybatis的全局配置文件,其中包括了數(shù)據(jù)庫連接池,配置了數(shù)據(jù)源、事務(wù)等。
4、還需要一個(gè)SQLMap配置文件,它配置了映射關(guān)系(配置sql語句),sql語句要寫在這個(gè)配置文件里,其實(shí)就是配置了一個(gè)statement,避免了sql語句硬編碼到Java源文件中。后面會(huì)詳細(xì)介紹這個(gè)配置文件的使用。
5、SqlsessionFactory是mybatis中生成Sqlsession的工廠,操作數(shù)據(jù)庫。
mybatis框架結(jié)構(gòu)是把sql語句的映射文件加載到SQLMapConfig中去,然后SqlSessionFactory加載SQLMapConfig后生成SQLSession,SQLSession來執(zhí)行Statement。
三、構(gòu)建一個(gè)mybatis工程。
1.所需要的jar包
即需要下載mybatis包和數(shù)據(jù)庫驅(qū)動(dòng)包,可以從GitHub上下載mybatis,解壓后里面有l(wèi)ib文件夾和一個(gè)mybatis的核心包,lib中得包是mybatis的依賴包
mybatis的下載
2.工程結(jié)構(gòu)。
src中放源碼,lib中放所依賴的jar包,config中放各種配置文件,config文件下的sqlmap包中放sql映射文件。lib和config文件夾創(chuàng)建好后要記得郵件選擇build path->use a source folder
3.編寫log4j.properties
# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
注意:開發(fā)時(shí)log4j.rootLogger=DEBUG,生產(chǎn)環(huán)境可以把DEBUG換成info
4.編寫SqlMapConfig.xml
5.編寫user.xml
insert into users(name,birthday,address,sex) values(#{name},#{birthday},#{address},#{sex}) select last_insert_id() delete from users where id=#{id} update users set name=#{name},address=#{address},birthday=#{birthday},sex=#{sex} where id=#{id}
這里共寫了查詢,插入,刪除,更新四個(gè)sql語句,都用對(duì)應(yīng)的標(biāo)簽包裹起來,每一個(gè)標(biāo)簽最后會(huì)映射為一個(gè)statement,標(biāo)簽中的屬性id是此statement的唯一標(biāo)示,以后再Java中就是通過這個(gè)id來調(diào)用的。parameterType表示輸入?yún)?shù),類似于在jdbc的預(yù)編譯時(shí)為占位符賦值時(shí)的參數(shù)類型。
resultType是數(shù)據(jù)庫返回結(jié)果對(duì)應(yīng)的pojo類的類型。
6.創(chuàng)建一個(gè)實(shí)體類對(duì)應(yīng)數(shù)據(jù)庫,因?yàn)楸容^簡單,此處不再給出代碼
7.用Junit來測(cè)試。
package mt;import java.io.IOException;import java.io.InputStream;import java.util.Date;import java.util.List;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.Test;import entity.Classes;import entity.users;public class FirstDemo { @Test public void findUserbyIdTest(){ try { String resource="SqlMapConfig.xml"; InputStream stream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(stream); SqlSession sqlSession=sqlSessionFactory.openSession(); users u=sqlSession.selectOne("test.srarchByid", 1); System.out.println(u.getBirthday().toString()); sqlSession.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void findUserByName(){ try { String resource="SqlMapConfig.xml"; InputStream stream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(stream); SqlSession sqlSession=sqlSessionFactory.openSession(); Listu=sqlSession.selectList("test.searchByName", "張"); sqlSession.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void insertUser(){ try { String resource="SqlMapConfig.xml"; InputStream stream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(stream); SqlSession sqlSession=sqlSessionFactory.openSession(); users u=new users(); u.setName("王磊"); u.setSex("f"); u.setBirthday(new Date()); u.setAddress("上海"); sqlSession.insert("test.insertUser", u); System.out.println(u.getId()); sqlSession.commit(); sqlSession.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void deleteUser(){ try { String resource="SqlMapConfig.xml"; InputStream stream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(stream); SqlSession sqlSession=sqlSessionFactory.openSession(); sqlSession.insert("test.deleteUser",2); sqlSession.commit(); sqlSession.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void updateUser(){ try { String resource="SqlMapConfig.xml"; InputStream stream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(stream); SqlSession sqlSession=sqlSessionFactory.openSession(); users u=new users(); u.setId(3); u.setName("王磊"); u.setSex("f"); u.setBirthday(new Date()); u.setAddress("上海66666"); sqlSession.update("updateUser",u); System.out.println(u.getId()); sqlSession.commit(); sqlSession.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }