mybatis框架
MyBatis是一個(gè)數(shù)據(jù)持久層(ORM)框架活烙。把實(shí)體類和SQL語句之間建立了映射關(guān)系弹灭,是一種半自動(dòng)化的ORM實(shí)現(xiàn)
MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code污茵,并且改名為MyBatis 。MyBatis是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射紧阔,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄续担。
mybatis的優(yōu)點(diǎn):
1.基于SQL語法擅耽,簡單易學(xué)。
2.能了解底層組裝過程物遇。
3.SQL語句封裝在配置文件中乖仇,便于統(tǒng)一管理與維護(hù),降低了程序的耦合度询兴。
4.程序調(diào)試方便乃沙。
hibernate、MyBatis蕉朵、JDBC區(qū)別:
1)從層次上看崔涂,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎(chǔ)上進(jìn)行了封裝使其更加方便程序員對持久層的操作始衅。
2)從功能上看冷蚂,JDBC就是簡單的建立數(shù)據(jù)庫連接,然后創(chuàng)建statement汛闸,將sql語句傳給statement去執(zhí)行蝙茶,如果是有返回結(jié)果的查詢語句,會(huì)將查詢結(jié)果放到ResultSet對象中诸老,通過對ResultSet對象的遍歷操作來獲取數(shù)據(jù)隆夯;Hibernate是將數(shù)據(jù)庫中的數(shù)據(jù)表映射為持久層的Java對象,實(shí)現(xiàn)數(shù)據(jù)表的完整性控制别伏;MyBatis是將sql語句中的輸入?yún)?shù)和輸出參數(shù)映射為java對象蹄衷,放棄了對數(shù)據(jù)表的完整性控制,但是獲得了更靈活和響應(yīng)性能更快的優(yōu)勢厘肮。
3)從使用上看愧口,如果進(jìn)行底層編程,而且對性能要求極高的話类茂,應(yīng)該采用JDBC的方式耍属;如果要對數(shù)據(jù)庫進(jìn)行完整性控制的話建議使用Hibernate;如果要靈活使用sql語句的話建議采用MyBatis框架巩检。
hibernate厚骗、MyBatis區(qū)別:
MyBatis
1、是一個(gè)SQL語句映射的框架(工具)
2兢哭、注重POJO與SQL之間的映射關(guān)系领舰。不會(huì)為程序員在運(yùn)行期自動(dòng)生成 SQL
3、自動(dòng)化程度低、手工映射SQL,靈活程度高.
4提揍、需要開發(fā)人員熟煉掌據(jù)SQL語句
Hibernate
1啤月、主流的ORM框架、提供了從 POJO 到數(shù)據(jù)庫表的全套映射機(jī)制
2劳跃、會(huì)自動(dòng)生成全套SQL語句谎仲。
3、因?yàn)樽詣?dòng)化程度高刨仑、映射配置復(fù)雜郑诺,api也相對復(fù)雜,靈活性低.
4杉武、開發(fā)人同不必關(guān)注SQL底層語句開發(fā)
mybatis開發(fā)步驟:
1辙诞、創(chuàng)建一個(gè)java工程或web工程(整合)
2、導(dǎo)入mybatis對應(yīng)的jar文件
3轻抱、開發(fā)并配置mybatis-config.xml初始化文件(名可以任意)
<?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>
<!-- 配置mysql數(shù)據(jù)庫的連接環(huán)境 -->
<environments default="development"> <!-- 環(huán)境 -->
<environment id="development"><!-- 環(huán)境變量 -->
<transactionManager type="JDBC"/><!-- 事務(wù)管理器 -->
<dataSource type="POOLED"><!-- 數(shù)據(jù)源 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/stu?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers><!-- 映射器 -->
<mapper resource=""/>
</mappers>
</configuration>
4飞涂、開發(fā)和表中的字段一致的bean 對象
5、開發(fā)接口
6祈搜、開發(fā)SQL映射文件
7较店、測試
下面就是具體的開發(fā)步驟:
1、創(chuàng)建一個(gè)java工程或web工程(整合)
2容燕、導(dǎo)入mybatis對應(yīng)的jar文件
如果不是整合就用兩個(gè)jar包就行了梁呈,如果要整合ssm就需要再加一個(gè)jar包如圖箭頭所示
3、開發(fā)并配置mybatis-config.xml初始化文件(名可以任意)
<?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>
<!-- 配置mysql數(shù)據(jù)庫的連接環(huán)境 -->
<environments default="development"> <!-- 環(huán)境 -->
<environment id="development"><!-- 環(huán)境變量 -->
<transactionManager type="JDBC"/><!-- 事務(wù)管理器 -->
<dataSource type="POOLED"><!-- 數(shù)據(jù)源 -->
<property name="driver" value="com.mysql.jdbc.Driver"/><!-- 驅(qū)動(dòng) -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/stu?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="huayu123"/>
</dataSource>
</environment>
</environments>
<mappers><!-- 映射文件-->
<mapper resource="com/hw/mapper/studentDaoMapper.xml"/>
</mappers>
</configuration>
4蘸秘、開發(fā)和表中的字段一致的bean 對象
5官卡、開發(fā)接口
package com.hw.dao;
import java.util.List;
import com.hw.entity.Student;
public interface StudentDao {
public void addStudent(Student stu);//添加
public void updateStudent(Student stu);//修改
public void delStudent(int id);//刪除學(xué)生
public Student getStudent(int id);//由id獲取單個(gè)用戶
public int getCount();//統(tǒng)計(jì)總計(jì)錄數(shù)
public List<Student> listAll();//查詢所有
public List<Student> listPage(int currentPage,int pageSize);//查詢所有且有分頁
public List<Student> listLikeAll(String name);//模糊查詢指定名
public List<Student> listLikePage(int currentPage,int pageSize,String name);///模糊查詢指定名且有分頁
public int getLikeCount(String name);//統(tǒng)計(jì)模糊查詢總計(jì)錄數(shù)
}
6、開發(fā)SQL映射文件(原來的實(shí)現(xiàn)類impl用映射文件代替了)
<?xml version="1.0" encoding="UTF-8"?><!-- 相當(dāng)于實(shí)現(xiàn)impl -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hw.dao.StudentDao"><!-- namespace="qq"如果和spring整合時(shí)要用接口全類名 不整合無所謂 -->
<resultMap type="com.hw.entity.Student" id="stuinfo"><!-- id="stuinfo"如果不用resultMap則不寫 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="money" property="money"/>
<result column="jobtime" property="jobtime" javaType="java.sql.Date" jdbcType="DATE"/>
</resultMap>
<!-- id="listAll" id要取接口的方法名 這樣代碼結(jié)構(gòu)清晰 比較規(guī)范 不混亂-->
<select id="listAll" resultMap="stuinfo">
select * from stu
</select>
<!-- resultType返回結(jié)果類型 -->
<select id="getCount" resultType="int">
select count(id) from stu
<!-- resultMap返回map集合 -->
</select>
<select id="listLikeAll" resultMap="stuinfo" parameterType="string">
<!-- select * from stu where name like '%${value}%' -->
select * from stu where name like #{name}
</select>
<!-- parameterType參數(shù)類型 -->
<insert id="addStudent" parameterType="com.hw.entity.Student">
<!-- #{money}解析成"money" -->
insert into stu values(null,#{name},#{money},#{jobtime})
</insert>
<delete id="delStudent" parameterType="int">
delete from stu where id=#{id}
</delete>
<update id="updateStudent" parameterType="com.hw.entity.Student">
update stu set name=#{name},money=#{money},jobtime=#{jobtime} where id=#{id}
</update>
<select id="getStudent" resultMap="stuinfo">
select * from stu where id=#{id}
</select>
<select id="getLikeCount" resultType="int">
select count(id) from stu where name like #{name}
</select>
<select id="listPage" resultMap="stuinfo" parameterType="map">
select * from stu limit #{currentPage},#{pageSize}
</select>
<select id="listLikePage" resultMap="stuinfo" parameterType="map">
select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}
</select>
</mapper>
上面主要是#和$的區(qū)別要注意:
MyBatis/Ibatis中#和$的區(qū)別
1. #將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串醋虏,會(huì)對自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)寻咒。如:order by #user_id#,如果傳入的值是111,那么解析成sql時(shí)的值為order by "111", 如果傳入的值是id颈嚼,則解析成的sql為order by "id".
2. $將傳入的數(shù)據(jù)直接顯示生成在sql中仔涩。如:order by $user_id$,如果傳入的值是111,那么解析成sql時(shí)的值為order by user_id, 如果傳入的值是id粘舟,則解析成的sql為order by id.
3. #方式能夠很大程度防止sql注入。
4.$方式無法防止Sql注入佩研。
5.$方式一般用于傳入數(shù)據(jù)庫對象柑肴,例如傳入表名.
6.一般能用#的就別用$.
還有就是時(shí)間轉(zhuǎn)換需要在配置文件中添加javaType="java.sql.Date" jdbcType="DATE"
前面是指數(shù)據(jù)庫查詢出來的時(shí)間轉(zhuǎn)換成Java類型 后面是數(shù)據(jù)庫連接的類型 一般類型要數(shù)據(jù)庫表中對應(yīng)得字段類型一致
最后就是測試類了
package com.hw.test;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 com.hw.entity.Student;
public class Test3 {
public static void main(String[] args) throws Exception {
//mybatis讀取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
// 創(chuàng)建工廠模式SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//創(chuàng)建session
SqlSession session = sessionFactory.openSession();
Map<String ,Object> map=new HashMap<String, Object>();
/* int currentPage=1;
int pageSize=3;
map.put("currentPage", (currentPage-1)*pageSize);
map.put("pageSize", pageSize);
List<Student> selectList = session.selectList("listPage", map);
for (Student stu : selectList) {
System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
}*/
int currentPage=1;
int pageSize=3;
map.put("name", "張");
map.put("currentPage", (currentPage-1)*pageSize);
map.put("pageSize", pageSize);
List<Student> selectList = session.selectList("listLikePage", map);
for (Student stu : selectList) {
System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
}
}
}
分頁模糊查詢 需要注意的是測試類傳入的參數(shù)是map
<select id="listLikePage" resultMap="stuinfo" parameterType="map">select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}</select>
為什么是map 因?yàn)槲以谟成湮募锩鎸懙膕ql語句有三個(gè)需要傳參的(name,currentPage旬薯,pageSize) 所以我在上面寫的是 parameterType="map" 就是通過鍵值對的方式把值傳到sql語句里面
sesssion對象查找對應(yīng)id 并把map對象傳到映射文件 再通過鍵值對的方式給相應(yīng)的值
List<Student> selectList = session.selectList("listLikePage", map);
相關(guān)源碼:
鏈接:http://pan.baidu.com/s/1kVsepwF 密碼:rbiq