二、與 JDBC 相比,減小了 50%以上的代碼量,消除了 JDBC 大量冗餘的代碼,不須要手動開關鏈接; 程序員
三、很好的與各類數據庫兼容(由於 MyBatis 使用 JDBC 來鏈接數據庫,因此只要JDBC 支持的數據庫 MyBatis 都支持)。 面試
四、可以與 Spring 很好的集成;spring
五、提供映射標籤,支持對象與數據庫的 ORM 字段關係映射;提供對象關係映射標籤,支持對象關係組件維護。 sql
二、SQL 語句依賴於數據庫,致使數據庫移植性差,不能隨意更換數據庫。 數據庫
二、對性能的要求很高,或者需求變化較多的項目,如互聯網項目,MyBatis 將是不錯的選擇
編程
二、Mybatis 直接編寫原生態 sql,能夠嚴格控制 sql 執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,由於這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。可是靈活的前提是 mybatis 沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件,則須要自定義多套 sql 映射文件,工做量大。緩存
三、Hibernate 對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件,若是用 hibernate 開發能夠節省不少代碼,提升效率。 安全
Mybatis 在處理#{}時,會將 sql 中的#{}替換爲?號,調用 PreparedStatement 的set 方法來賦值; bash
使用#{}能夠有效的防止 SQL 注入,提升系統安全性。
<select id=」selectorder」 parametertype=」int」 resultetype=」
me.gacl.domain.order」>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select> 複製代碼
<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=」me.gacl.domain.order」 id=」orderresultmap」>
<!–用 id 屬性來映射主鍵字段–>
<id property=」id」 column=」order_id」>
<!–用 result 屬性來映射非主鍵字段,property 爲實體類屬性名,column
爲數據表中的屬性–>
<result property = 「orderno」 column =」order_no」/>
<result property=」price」 column=」order_price」 />
</reslutMap>複製代碼
string wildcardname = 「%smi%」;
list<name> names = mapper.selectlike(wildcardname);<select id=」selectlike」>
select * from foo where bar like #{value}
</select>複製代碼
string wildcardname = 「smi」;
list<name> names = mapper.selectlike(wildcardname);
<select id=」selectlike」>
select * from foo where bar like "%"#{value}"%"
</select>複製代碼
舉例:com.mybatis3.mappers^tudentDao.findStudentByld,能夠惟 —找到 namespace 爲 co m.mybatis3. map pe rs.Stud ent Dao 下面 id 爲 findStudentByld MapperStatement.
Mapper接口裏的方法,是不能重載的,由於是使用全限名+方法名的保存和尋找策略。Mapper授口的工做原理是JDK動態代理,Mybatis運行時會使用JDK 動態代理爲Mapper接口生成代理對象proxy,代理對象會攔截接口方法,轉而 執行MapperStatement所表明的sql,而後將sql執行結果返回.
Mybatis使用RowBounds對象講行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁.能夠在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可使用分頁播件來完成物理分頁.
分頁播件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的欄截方法內攔截方法內攔截待執行的sql,而後重寫sql, 根據dialect方言,添加對應的物理分頁語句和物理分頁參數.
第二種是使用 sql 列的別名功能,將列的別名書寫爲對象屬性名。
<insert id=」insertname」>
insert into names (name) values (#{value})
</insert> 複製代碼
list < string > names = new arraylist();
names.add(「fred」);
names.add(「barney」);
names.add(「betty」);
names.add(「wilma」);
// 注意這裏 executortype.batch
sqlsession sqlsession =
sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name: names) {
mapper.insertname(name);
}
sqlsession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
}
finally {
sqlsession.close();
}複製代碼
若是採用自增加策略,自動生成的鍵值在 insert 方法執行完後能夠被設置到傳入的參數對象中。
<insert id=」insertname」 usegeneratedkeys=」true」 keyproperty=」
id」>
insert into names (name) values (#{name})
</insert>
name name = new name();
name.setname(「fred」);
int rows = mapper.insertname(name);
// 完成後,id 已經被設置到對象中
system.out.println(「rows inserted = 」 + rows);
system.out.println(「generated key value = 」 + name.getid()); 複製代碼
public UserselectUser(String name,String area);
對應的 xml,#{0}表明接收的是 dao 層中的第一個參數,#{1}表明 dao 層中第二
參數,更多參數一致日後加便可。 複製代碼
<select id="selectUser"resultMap="BaseResultMap">
select * fromuser_user_t whereuser_name = #{0}
anduser_area=#{1}
</select> 複製代碼
public interface usermapper {
user selectuser(@param(「username」) string
username,@param(「hashedpassword」) string hashedpassword);
} 複製代碼
<select id=」selectuser」 resulttype=」user」>
select id, username, hashedpassword
from some_table
where username = #{username}
and hashedpassword = #{hashedpassword}
</select> 複製代碼
try {
//映射文件的命名空間.SQL 片斷的 ID,就能夠調用對應的映射文件中的
SQL
//因爲咱們的參數超過了兩個,而方法中只有一個 Object 參數收集,所以
咱們使用 Map 集合來裝載咱們的參數
Map < String, Object > map = new HashMap();
map.put("start", start);
map.put("end", end);
return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
} finally {
MybatisUtil.closeSqlSession();
} 複製代碼
<mapper namespace="com.lcb.mapping.userMapper">
<!--association 一對一關聯查詢 --><select id="getClass" parameterType="int"
resultMap="ClassesResultMap">
select * from class c,teacher t where c.teacher_id=t.t_id and
c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
<!-- 實體類的字段名和數據表的字段名映射 -->
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
<!--collection 一對多關聯查詢 -->
<select id="getClass2" parameterType="int"
resultMap="ClassesResultMap2">
select * from class c,teacher t,student s where c.teacher_id=t.t_id
and c.c_id=s.class_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/><result property="name" column="t_name"/>
</association>
<collection property="student"
ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
</mapper> 複製代碼
一、在 sqlMapConfig.xml 中配置 mapper.xml 的位置
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers> 複製代碼
<bean id=" " class="mapper 接口的實現">
<property name="sqlSessionFactory"
ref="sqlSessionFactory"></property>
</bean>複製代碼
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>複製代碼
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper 接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>複製代碼
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper 接口包地址 "></property>
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory"/>
</bean>複製代碼
有關於mybatis的面試詳解就到這裏了,有機會在後面的備戰春招系列專題裏面會給你們分享微服務,ZooKeeper ,Dubbo,kafka 等面試專題。全部的專題我也總結到一個pdf文檔了
整個系列大概有1000道面試真題詳解,須要源文件可關注微信公衆號:Java程序員彙集地。