MyBatis學習——第一篇(增刪改查實現)
1:MyBatis入門
1.1 Mybatis概述
MyBatis 是一款優秀的持久層(ORM)框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
物件關係對映(ORM Object-Relational Mapping)面向物件的開發方法是當今企業級應用開發環境中的主流開發方法,關係
1.2 ORM簡介
A . 簡單:ORM以最基本的形式建模資料。比如ORM會將MySQL的一張表對映成一個Java類(模型),表的欄位就是這個類的成員變數
B . 精確:ORM使所有的MySQL資料表都按照統一的標準精確地對映成java類,使系統在程式碼層面保持準確統一
C .易懂:ORM使資料庫結構文件化。比如MySQL資料庫就被ORM轉換為了java程式設計師可以讀懂的java類,java程式設計師可以只把注意力放在他擅長的java層面(當然能夠熟練掌握MySQL更好)
D.易用:ORM包含對持久類物件進行CRUD操作的API,例如create(), update(), save(), load(), find(), find_all(), where()等,也就是講sql查詢全部封裝成了程式語言中的函式,通過函式的鏈式組合生成最終的SQL語句。通過這種封裝避免了不規範、冗餘、風格不統一的SQL語句,可以避免很多人為Bug,方便編碼風格的統一和後期維護。
1.3 ORM的優缺點:
- 什麼是Mybatis?
優點:
1)它支援定製化 SQL、儲存過程以及高階對映,
2)MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊
3)文件社群支援,有apache-google-github 前身是iBatis
4)配置化便於上手,動態sql,可以很方便地引入資料快取之類的附加功能
缺點:
1)自動化進行關係資料庫的對映需要消耗系統性能。其實這裡的效能消耗還好啦,一般來說都可以忽略之。
2)在處理多表聯查、where條件複雜之類的查詢時,ORM的語法會變得複雜。
例項如下:
Java物件User()--------Mapping對映---------Relational 資料庫表(User表)
Java物件 對映 關係資料庫
2:Mybatis實現增刪改查
說明:該案例是一個簡單的mybatis入門案例 實現了資料的增刪改查基本操作,更多屬性配置請參考mybatis官網
主要是新建一個表M_test,包含主鍵、賬戶、密碼、賬戶金額四個欄位資料。實現簡單的入門案例。
2.1建立表:M_test id為主鍵自增
bean程式碼:
package com.thit.entity;
public class User {
private Integer id;
private String name;
private String password;
private Double account;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Double getAccount() {
return account;
}
public void setAccount(Double account) {
this.account = account;
}
@Override
public String toString() {
return "user [id=" + id + ", name=" + name + ", password=" + password + ", account=" + account + "]";
}
}
mybatis.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>
<!-- 引入外部的資料配置檔案 便於配置多個不同環境的資料來源 -->
<properties resource="db.properties"></properties>
<environments default="demo">
<!-- environment 可以有多個 對應開發測試生產不同的環境-->
<environment id="demo">
<!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務 -->
<transactionManager type="JDBC"></transactionManager>
<!-- mybatis提供了3種資料來源型別,分別是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支援JDBC資料來源連線池 -->
<!-- UNPOOLED 表示不支援資料來源連線池 -->
<!-- JNDI 表示支援外部資料來源連線池 -->
<dataSource type="POOLED">
<property name="driver" value="${mysqldriver}"/>
<property name="url" value="${mysqlurl}"/>
<property name="username" value="${mysqlusername}"/>
<property name="password" value="${mysqlpassword}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 引入實體對映 -->
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
資料庫配置db.properties
#\u6570\u636E\u5E93
mysqldriver=com.mysql.jdbc.Driver
mysqlurl=jdbc:mysql://localhost:3306/huyiju?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8
mysqlusername=root
mysqlpassword=123456
使用者表對映配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thit.entity.User">
<resultMap id="userResultMap" type="com.thit.entity.User">
<!-- 主鍵和欄位繫結 -->
<id property="id" column="id" />
<result property="name" column="username" />
<result property="password" column="password"/>
<result property="account" column="account"/>
</resultMap>
<insert id="insert" >
insert into M_test(username,password,account) values (#{name},#{password},#{account})
</insert>
<update id="updatebyid" >
update M_test set username=#{name},password=#{password},account=#{account} where id=#{id}
</update>
<delete id="deletebyid" >
delete from M_test where
id=#{id}
</delete>
<!-- <select id="selectbyid" parameterType="int" resultType="com.thit.entity.User">
select id,username as name,password,account from M_test where
id= #{id}
</select> -->
<select id="selectbyid" parameterType="int" resultMap="userResultMap">
select id,username,password,account from M_test where
id= #{id}
</select>
<select id="selectall" resultType="com.thit.entity.User">
select id,username as name,password,account from M_test
</select>
</mapper>
最後的程式碼測試:
工具類:
package com.thit.test;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Dbtools {
private static SqlSessionFactory sessionFactory;
static{
try {
String resource="mybatis.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//sqlSessionFactory通過SqlSessionFactoryBuilder構建出DefaultSqlSessionFactory
//DefaultSqlSessionFactory繼承了SqlSessionFactory介面
sessionFactory=new SqlSessionFactoryBuilder()
.build(inputStream);
//使用MyBatis提供的Resources類載入mybatis的配置檔案
} catch (Exception e) {
e.printStackTrace();
}
}
//建立能執行對映檔案中sql的sqlSession
public static SqlSession getSession(){
return sessionFactory.openSession();
}
}
測試主方法:測試不同的新增修改刪除查詢和查詢全部等方法
package com.thit.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.thit.entity.User;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test t=new Test();
t.selectbyid();
t.selectall();
t.updatebyid();
t.insert();
}
void selectbyid(){
Dbtools dbtools=new Dbtools();
SqlSession sqlSession= dbtools.getSession();
User u=sqlSession.selectOne("selectbyid", 1);
System.out.println("根據id查詢"+u);
}
void selectall(){
Dbtools dbtools=new Dbtools();
SqlSession sqlSession= dbtools.getSession();
List<User> list=sqlSession.selectList("selectall");
System.out.println("查詢所有:"+list.size());
for(User u:list) {
System.out.println(u);
}
}
void deletebyid(){
Dbtools dbtools=new Dbtools();
SqlSession sqlSession= dbtools.getSession();
int result=sqlSession.delete("deletebyid", 5);
sqlSession.commit();
System.out.println(result);
}
void updatebyid(){
Dbtools dbtools=new Dbtools();
SqlSession sqlSession= dbtools.getSession();
User u=new User();
u.setId(3);
u.setusername("土豆修改0903");
u.setPassword("123");
u.setAccount(11.11);
int a=sqlSession.update("updatebyid",u);
sqlSession.commit();
}
void insert(){
Dbtools dbtools=new Dbtools();
SqlSession sqlSession= dbtools.getSession();
User u=new User();
u.setusername("土豆新增111");
u.setPassword("3333");
u.setAccount(11.11);
int a=sqlSession.insert("insert", u);
sqlSession.commit();
}
}
最後資料庫的執行結果如圖: