MyBatis 簡介、單條件查詢、多條件查詢、無條件查詢、增刪改操作

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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章