MyBatis學習(三)
阿新 • • 發佈:2018-09-09
數據模型 連接池 自定義 mysq integer out put 模型 exce
1、Mybatis入門Demo實踐
A、添加用戶
B、更新用戶
C、刪除用戶
重點:MySql自增主鍵返回
添加用戶時候,如何返回自增主鍵? <!-- 添加用戶 --> <insert id="insertUser" parameterType="com.kid.mybatis.pojo.User"> <!-- selectKey將主鍵返回,需要再返回 keyProperty:返回的主鍵存儲在pojo中的哪個屬性 order:selectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成, 所以這裏selectKey的執行順序為after;resultType:返回的主鍵是什麽類型 LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert> 添加selectKey實現將主鍵返回 keyProperty:返回的主鍵存儲在pojo中的哪個屬性 order:selectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成,所以這裏selectKey的執行順序為after resultType:返回的主鍵是什麽類型 LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。
Mysql使用 uuid實現主鍵
<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User"> <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id"> select uuid() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert> 註意這裏使用的order是"BEFORE"
1、繼續操作 User.xml實現用戶的刪除和更新
<!-- 刪除用戶 --> <delete id="deleteUserById" parameterType="int"> delete from user where id=#{id} </delete> <!-- 更新用戶數據 --> <update id="updateUser" parameterType="com.kid.mybatis.pojo.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update>
2、測試文件
//創建會話工廠
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void createSqlSessionFactory() throws Exception {
//第一步:創建一個SQLSessionFactoryBuilder對象。
SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
//第二步:加載配置文件。
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//第三步:創建SQLSessionFactory對象
sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
}
@Test //添加用戶信息
public void insertTest() {
// 數據庫會話實例
SqlSession sqlSession = null;
try {
// 創建數據庫會話實例sqlSession
sqlSession = sqlSessionFactory.openSession();
//創建User對象
User user = new User();
user.setUsername("趙雲");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("上海");
//插入數據
sqlSession.insert("insertUser",user);
System.out.println(user.getId());
//提交事務
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
@Test //刪除用戶
public void deleteUserById() {
//數據庫會話實例
SqlSession sqlSession=null;
try {
// 創建數據庫會話實例sqlSession
sqlSession=sqlSessionFactory.openSession();
//刪除用戶
sqlSession.delete("deleteUserById",16);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
@Test //更新用戶數據
public void uodateUserTest() {
// 數據庫會話實例
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
// 添加用戶信息
User user = new User();
user.setId(26);
user.setUsername("張小明");
user.setAddress("陜西西安");
user.setSex("1");
sqlSession.update("updateUser", user);
// 提交事務
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
總結
1、Mybatis解決jdbc編程的問題
a、數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。
解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。
b、Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。
解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。
c、向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,占位符需要和參數一一對應。
解決:Mybatis自動將java對象映射至sql語句,通過statement中的parameterType定義輸入參數的類型。
d、對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。
解決:Mybatis自動將sql執行結果映射至java對象,通過statement中的resultType定義輸出結果的類型。
2、mybatis與hibernate不同
a、Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML
或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。
b、Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求
不高的軟件開發,例如互聯網軟件、企業運營類軟件等,因為這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。
但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。
c、Hibernate對象/關系映射能力強,數據庫無關性好,對於關系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發
可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎麽設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。
總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟件架構都是好架構,所以框架只有適合才是最好。
MyBatis學習(三)