1.Mybatis 簡介
Apache Google (2010) GitHub
IBatis Mybatis Mybatis
2.Mybatis 的作用 ***
完成普通的sql操作 存儲過程
以及是一個高級的ORM(Object Relation Mapping) 框架
封裝了結果集的操作 以面向對象的思想操作數據庫
3.Mybatis 的核心構成
主配置文件 (xml文件) 連接數據庫的設置 和 加載sql定義文件
sql定義文件(xml 文件) 定義sql語句的
javaBean 的實體類
Mybatis中的API SqlSession 對象來體現
4.使用id 查詢銀行賬戶
4.1 建立一個項目 導入jar包(mybatis.jar ojdbc6.jar)
4.2 建立一個銀行賬戶的實體類 要求 成員變量 和 表中的字段一致
4.3 拷貝主配置文件sqlmap-config.xml到src下 填寫連接數據庫的信息 加載sql定義文件
一般只用修改url的值,jdbc:oracle:thin:@127.0.0.1:1521:MLDN
數據庫賬號和密碼,system 123456
然後是加載的sql文件的名字 com/xdl/mapper/XdlBankAccountMapper.xml 一般將文件改爲有一定業務含義的.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver"
value="oracle.jdbc.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"/>
<property name="username" value="system" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xdl/mapper/XdlBankAccountMapper.xml" />
</mappers>
</configuration>
4.4 拷貝sql定義文件 到對應的包中 定義sql
<mapper namespace="abc">
<!-- 定義SQL語句 -->
<select id="getBankAccountById" parameterType="int"
resultType="com.xdl.bean.XdlBankAccount">
select * from xdl_bank_account where id = #{id}
</select>
</mapper>
4.5 使用mybatisAPI 獲取SqlSession 使用SqlSession 完成查詢
public static void main(String[] args) {
// 構建一個SqlSession 工廠的構建器
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 獲取SqlSession 工廠對象
InputStream inputStream = SqlSessionTest.class.getClassLoader()
.getResourceAsStream("sqlmap-config.xml");
SqlSessionFactory ssf = ssfb.build(inputStream);
// 獲取sqlSession 對象
SqlSession sqlSession = ssf.openSession();
// 進行查詢
XdlBankAccount account = sqlSession.selectOne("getBankAccountById",1);
System.out.println(account);
}
5.多個查詢條件的查詢
sql定義文件在參數傳遞的時候必須和數據庫一致不能隨意
<select id="getBankAccountByNoAndPassword"
parameterType="com.xdl.bean.XdlBankAccount"
resultType="com.xdl.bean.XdlBankAccount">
select * from xdl_bank_account where acc_no = #{acc_no}
and acc_password = #{acc_password}
</select>
測試的時候傳遞參數可以通過一個對象傳遞
public static void main(String[] args) {
XdlBankAccount acc = new XdlBankAccount();
acc.setAcc_no("123");
acc.setAcc_password("456");
Object selectOne =
sqlSession.selectOne("getBankAccountByNoAndPassword",acc);
System.out.println(selectOne);
}
6.不跟據任何字段,直接查表中所有信息,注意因爲沒有參數字段所以parameterType參數可以不寫
<select id="getBankAccountByList"
resultType="com.xdl.bean.XdlBankAccount">
select * from xdl_bank_account
</select>
測試
List<Object> selectList = sqlSession.selectList("getBankAccountByList");
System.out.println(selectList);
7.Mybatis實現增刪改!
sql定義文件中 定義對應的sql語句 --- insert delete update
使用SqlSession 完成增刪改 --- insert delete update
7.1增加
<!-- 增加銀行賬戶 -->
<insert id="insertBankAccount"
parameterType="com.xdl.bean.XdlBankAccount">
insert into xdl_bank_account values(#{id},#{acc_no},#{acc_password},#{acc_money})
</insert>
需要手動commit
XdlBankAccount acc2 = new XdlBankAccount(145,"asddfgfg","123",123.2);
int insert = sqlSession.insert("insertBankAccount", acc2);
System.out.println(insert);
sqlSession.commit();
7.2刪除
<!-- 刪除銀行賬戶 -->
<delete id="deleteBankAccount" parameterType="int">
delete from xdl_bank_account where id = #{id}
</delete>
需要手動提交
int delete = sqlSession.delete("deleteBankAccount", 43);
sqlSession.commit();
System.out.println(delete);
7.3修改
8 不使用Mapper映射器
8.1封裝SqlSession的獲取。SqlSessionUtil.java
public class SqlSessionUtil {
private static SqlSessionFactory ssf;
static{
// 構建一個SqlSession 工廠的構建器
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 獲取SqlSession 工廠對象
InputStream inputStream = SqlSessionUtil.class.getClassLoader()
.getResourceAsStream("sqlmap-config.xml");
ssf = ssfb.build(inputStream);
}
public static SqlSession getSqlSession() {
return ssf.openSession();
}
}
8.2 DAO接口 需要注意的是方法返回值類型應和sql定義文件中的resultType相同該變list就要變list,參數與parameterType相同,方法名字與id相同。
public interface XdlBanlAccountDAO {
//可以根據id查銀行賬戶
XdlBankAccount getBankAccountById(int id);
//根據id查詢賬號名稱
String getACCNOById(int id);
//根據賬號和密碼查詢賬戶
XdlBankAccount getBankAccountByNoAndPassword(String acc_no,String acc_password);
//查詢所有的賬戶信息
List<XdlBankAccount> getBankAccountByList();
//根據id刪除賬戶信息,返回值寫int
int deleteBankAccount(int id);
}
8.3實現DAO接口
public class XdlBankAccountDAOImpl implements XdlBanlAccountDAO {
@Override
public XdlBankAccount getBankAccountById(int id) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectOne("getBankAccountById", id);
}
@Override
public String getACCNOById(int id) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectOne("getACCNOById", id);
}
@Override
public XdlBankAccount getBankAccountByNoAndPassword(String acc_no, String acc_password) {
XdlBankAccount account = new XdlBankAccount(0,acc_no,acc_password,0);
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectOne("getBankAccountByNoAndPassword", account);
}
@Override
public List<XdlBankAccount> getBankAccountByList() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectList("getBankAccountByList");
}
@Override
public int deleteBankAccount(int id) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
int delete = sqlSession.delete("deleteBankAccount", id);
sqlSession.commit();
return delete;
}
}
8.4測試類
public static void main(String[] args) {
XdlBanlAccountDAO xAccountDAO = new XdlBankAccountDAOImpl();
//根據id查賬戶
XdlBankAccount bankAccountById = xAccountDAO.getBankAccountById(1);
System.out.println(bankAccountById);
//根據id查賬戶的accno
String accountById = xAccountDAO.getACCNOById(1);
System.out.println(accountById);
//測試通過accno和accpassword查找賬戶信息
XdlBankAccount byNoAndPassword = xAccountDAO.getBankAccountByNoAndPassword("abc", "123456");
System.out.println(byNoAndPassword);
//測試查詢列表
List<XdlBankAccount> bankAccountByList = xAccountDAO.getBankAccountByList();
for (XdlBankAccount xdlBankAccount : bankAccountByList) {
System.out.println(xdlBankAccount);
}
//測試刪除
int deleteBankAccount = xAccountDAO.deleteBankAccount(145);
System.out.println(deleteBankAccount);
}
9.Mybatis中的Mapper映射器規範
Mybatis 可以幫你實現接口的實現類,但是接口得遵守如下規範
9.1接口中方法名 要和sql定義文件中的id保持一致
9.2接口中方法的參數和parameterType保持一致
如果沒有parameterType 參數 接口方法參數可以自由設計 但是sql需要特殊語法
<select id="getBankAccountByNoAndPassword2"
resultType="account">
<!-- 或者將 0 和 1 改爲 param1 param2 數字從0開始,param從1開始 -->
select * from xdl_bank_account where acc_no = #{0}
and acc_password = #{1}
</select>
where多個參數條件的時候可以使用#{0} #{1} 或者 #{param1} #{param2} 數字從0開始,param從1開始,代表參數的順序。
9.3接口方法的返回值一般和resultType保持一致
查詢多條時 使用List
增 刪 改對應的方法可以是void 也可以是int
9.4 sql定義文件中的namespace 也和接口的包名.接口名保持一致
接口二代
public interface XdlBankAccountDAO2 {
XdlBankAccount getBankAccountById(int id);
String getACCNOById(int id);
XdlBankAccount getBankAccountByNoAndPassword2(String acc_no,String acc_password);
int deleteBankAccount(int id);
}
測試二代
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
//通過Mapper映射規則生成了接口的實現類
XdlBankAccountDAO2 xAccountDAO2 = sqlSession.getMapper(XdlBankAccountDAO2.class);
//根據id查賬戶
XdlBankAccount bankAccountById = xAccountDAO2.getBankAccountById(1);
System.out.println(bankAccountById);
//根據id查賬戶名
String accnoById = xAccountDAO2.getACCNOById(1);
System.out.println(accnoById);
//根據賬戶名和密碼查賬戶信息(多個參數)
XdlBankAccount bankAccountByNoAndPassword2 = xAccountDAO2.getBankAccountByNoAndPassword2("abc", "123456");
System.out.println(bankAccountByNoAndPassword2);
//根據id刪除賬戶
int deleteBankAccount = xAccountDAO2.deleteBankAccount(45);
sqlSession.commit();
System.out.println(deleteBankAccount);
}
10 使用別名來簡化SQL定義文件的編寫
主配置文件中添加,之後sql定義文件中resultType返回com.xdl.bean.XdlBankAccount這個類型
的都可以簡寫爲account
<typeAliases>
<typeAlias type="com.xdl.bean.XdlBankAccount" alias="account"/>
</typeAliases>
11 當數據庫中的字段名 和 實體類中的成員變量不一致時 如何處理?
11.1 使用別名 來修改sql語句 給表中的字段起別名
11.2 使用ResultMap處理,type爲select標籤中真正返回的resultType
<!-- 假設實體類字段爲accNo則需要ResultMap處理 -->
<select id="getBankAccountById2" parameterType="int"
resultMap="accountMap">
select * from xdl_bank_account where id = #{id}
</select>
<!-- 定義一個ResultMap 來說明表中的特殊字段-->
<resultMap type="com.xdl.bean.XdlBankAccount" id="accountMap">
<result column="acc_no" property="accNo"/>
</resultMap>
12.如何處理插入時候不能出現空值的情況(Oracl數據庫 小坑)
sql定義文件中,通過jdbcType的方式允許一個字段可以出現空值
<!-- 增加銀行賬戶 -->
<insert id="insertBankAccount"
parameterType="com.xdl.bean.XdlBankAccount">
insert into xdl_bank_account values(#{id},#{acc_no,jdbcType=VARCHAR},#{acc_password,jdbcType=VARCHAR},#{acc_money})
</insert>