在mapper.xml文件中配置不少的sql語句,執行每一個sql語句時,封裝爲MappedStatement對象,mapper.xml以statement爲單位管理sql語句css
Statement的實際位置就等於namespace+StatementIdjava
typeAliases別名:mysql
自定義別名:程序員
<!-- 定義 別名 -->
<typeAliases>
<!-- 單個別名的定義 alias:別名,type:別名映射的類型 -->
<!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
<!-- 批量別名定義 指定包路徑,自動掃描包下邊的pojo,定義別名,別名默認爲類名(首字母小寫或大寫) -->
<package name="cn.itcast.mybatis.po"/>
</typeAliases>
<mappers>
<!-- 經過resource引用mapper的映射文件 -->
<mapper resource="sqlmap/User.xml" />
<!-- <mapper resource="mapper/UserMapper.xml" /> -->
<!-- 經過class引用mapper接口 class:配置mapper接口全限定名 要求:須要mapper.xml和mapper.java同名而且在一個目錄 中 -->
<!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
<!-- 批量mapper配置 經過package進行自動掃描包下邊的mapper接口, 要求:須要mapper.xml和mapper.java同名而且在一個目錄 中 -->
<package name="cn.itcast.mybatis.mapper"/>
</mappers>
一、數據庫連接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫連接池可解決此問題。sql
二、Sql語句寫在代碼中形成代碼不易維護,實際應用sql變化的可能較大,sql變更須要改變java代碼。數據庫
三、向sql語句傳參數麻煩,由於sql語句的where條件不必定,可能多也可能少,佔位符須要和參數一一對應。編程
四、對結果集解析麻煩,sql變化致使解析代碼變化,且解析前須要遍歷,若是能將數據庫記錄封裝成pojo對象解析比較方便。markdown
在Mybatis中,有兩種佔位符session
若是咱們在Hibernate中,當咱們插入數據的時候,咱們是能夠選擇是UUID策略的…mybatis
那麼在Mybatis是怎麼作的呢??
<!-- mysql的uuid生成主鍵 -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="BEFORE" resultType="string">
select uuid()
</selectKey>
INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
若是咱們通常插入數據的話,若是咱們想要知道剛剛插入的數據的主鍵是多少,咱們能夠經過如下的方式來獲取
需求:
解決思路:
mysql:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
oracle:
實現思路:
<!-- oracle 在執行insert以前執行select 序列.nextval() from dual取出序列最大值,將值設置到user對象 的id屬性 -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="BEFORE" resultType="int">
select 序列.nextval() from dual
</selectKey>
INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
Mapper代理方式的意思就是:程序員只須要寫dao接口,dao接口實現對象由mybatis自動生成代理對象。
通過咱們上面的幾篇博文,咱們能夠發現咱們的DaoImpl是十分重複的…
1 dao的實現類中存在重複代碼,整個mybatis操做的過程代碼模板重複(先建立sqlsession、調用sqlsession的方法、關閉sqlsession)
二、dao的實現 類中存在硬編碼,調用sqlsession方法時將statement的id硬編碼。
之前的重複代碼和硬編碼以下:
public class StudentDao {
public void add(Student student) throws Exception {
//獲得鏈接對象
SqlSession sqlSession = MybatisUtil.getSqlSession();
try{
//映射文件的命名空間.SQL片斷的ID,就能夠調用對應的映射文件中的SQL
sqlSession.insert("StudentID.add", student);
sqlSession.commit();
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
Student student = new Student(3, "zhong3", 10000D);
studentDao.add(student);
}
}
想要Mybatis幫咱們自動生成Mapper代理的話,咱們須要遵循如下的規範:
一、mapper.xml中namespace指定爲mapper接口的全限定名
二、mapper.xml中statement的id就是mapper.java中方法名
三、mapper.xml中statement的parameterType和mapper.java中方法輸入參數類型一致
四、mapper.xml中statement的resultType和mapper.java中方法返回值類型一致.
再次說明:statement就是咱們在mapper.xml文件中寫sql指定的id
mapper接口方法返回值: