MyBatis框架——四種實踐

本次實踐是針對實體映射文件、接口、註解的三種不同的實現方式進行實踐和對比

實踐一——實體類+實體映射文件

題目:數據庫lianxi有一張a表,要用MyBatis框架使用實體類+實體映射文件,來查詢表中數據

  • 實體類:創建實體類是根據數據庫表字段類確定的。封裝字段如下
private int id;
public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
  • 映射文件(mapper.xml):包含數據庫執行語句。
<mapper namespace="bean.Snippet"><!-- 實體映射文件 -->
  	<!--namespace代表命名空間,
  		它的命名規則是'表對應的實體類的名字的全路徑+Mapper'-->
  		
  		<!--  parameterType:代表是查詢語句中參數的數據類型-->
  		<!-- resultType:代表的是查詢的結果用指定數據類型接收 -->
  	<select id="a1" parameterType="int" resultType="Users">
  		select * from a where id=#{id}
  	</select>
</mapper>

注意:創建文件時要先到入mybatis-3-mapper.dtd的文件,知道的可以點擊:Mybatis

  • Mybatis主配置文件(config):配置基礎環境、事務控制、數據源。
<configuration>
	<!-- 別名 -->
	<typeAliases>
		<typeAlias type="bean.Users" alias="Users"/>
	</typeAliases>
	<!-- 基礎環境配置:包含數據源和事務管理 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="#{driver}"/>
				<property name="url" value="#{url}"/>
				<property name="username" value="root"/>
				<property name="password" value="#{password}"/>
			</dataSource>
		</environment>
	</environments>	
		
		<!-- 映射文件配置 -->
	<mappers>
		<mapper resource="bean/UsersMapper.xml"/><!-- Mapper.xml文件的路徑 -->
	</mappers>
</configuration>

  • 測試類:
public class Snippet {
	public static void main(String[] args) throws IOException {
		//第一步:讀取資源文件,獲得一個字符讀入流對象
		Reader r= Resources.getResourceAsReader("config.xml");
		
		//第二步:創建一個SQLsession工廠對象
		SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(r);
		
		//第三步:用sqlSessin工廠對象打開session回話,獲取session對象
		SqlSession sess= sqls.openSession();
		
		//第四步:session對象調用相應的操作數據庫的方法,並執行
		Users users=(Users) sess.selectOne("bean.Snippet."+"a1",1);
		
		if(users !=null){
			String usersInfo="名字:" + users.getName() + ",年齡:" + users.getArg();
			System.out.println(usersInfo);
		}
	}
}

實踐二——註解+接口:代替實體映射文件

題目:數據庫lianxi有一張c表,要用MyBatis框架但不使用實體類+實體映射文件換成註解+接口,來查詢表中數據

  • 接口+註解:讓代碼更加縝密,安全
//代替實體映射文件
public interface Ic {
	@Select("select * from c where id=#{id}")
	public C getC(int id);
}
  • 測試類
public class Tsxt  {
	public static void main(String[] args) throws IOException{
		//第一步:讀取mybatis的主配置文件
		//通過Resources調用getResourceasreader方法讀取,獲得一個Reader
		Reader r= Resources.getResourceAsReader("config.xml");
		
		//第二步:得到SQLsession工廠對象
		//通過new一個SQLsessionfactorybuild調用build方法獲得一個SQLsessionfactory
		SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(r);
		
		//第三步:通過SQLsessionfactorybuild對象調用getconfiguration方法調用
		//addmapper方法調用反射機制,將接口添加到mapper
		sf.getConfiguration().addMapper(Ic.class);
		
		//第四步:打開session,通過SQLsessionfactorybuild對象調用opensession方法獲取一個session對象
		SqlSession sess=sf.openSession();
		
		//第五步:通過session對象調用getmapper方法得到接口的實例
		Ic ic =sess.getMapper(Ic.class);
		
		//第六步:通過接口對象調用接口裏面的方法
		C as=ic.getC(1);
		
		//第七步:遍歷打印tsxt裏面的數據查看結果
		System.out.println(as.getName());	
	}
}
  • 主配置文件
<configuration>
	<typeAliases>
		<typeAlias type="com.zy.san.bean.C" alias="C"/>
	</typeAliases>
	
	<environments default="development">
		
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/lianxi"/>
				<property name="username" value="root"/>
				<property name="password" value="123"/>
			</dataSource>
		</environment>
	</environments>
</configuration>

實踐三:Mapper映射+接口(增刪改查)

題目:數據庫lianxi有一張c表,要用MyBatis框架把接口+註解和實體映射文件兩者相結合Mapper映射+接口,來查詢表中數據

  • 實體類映射文件——增加增刪改查功能後,能更加的反應出自己對Java的掌握程度、尤其是對Java類概念掌握程度
<mapper namespace="com.zy.san.Dao.ICdaem">
  
    <!-- 查詢 -->
  <select id="select" parameterType="int" resultType="C">
  	select * from c where id=#{id}
  </select>
  
  <!-- 添加數據 -->
  <insert id="add" parameterType="C">
  	insert into c(name,arg) values(#{name},#{arg})
  </insert>
  
    <!--修改 -->
  <update id="update" parameterType="C">
  	update c set name=#{name} , arg=#{arg} where id=#{id}
  </update>
  
    <!--根據id刪除數據-->
  <delete id="delete" parameterType="int">
  	delete from c where id=#{id};
  </delete>
  
  
</mapper>
  • 映射文件對應接口
public interface ICdaem {
	//增
	public int add(C c);
	
	//刪
	public int delete(int id);
	
	//改
	public int update(C c);
	
	//查
	public C select(int id);
}
  • 測試類
public class Text {

	public static void main(String[] args) throws IOException {
		//獲取mybatis的主配置文件
		//通過resources對象的getresourcesAsReader方法獲取,並用Reader接收,放入r對象中
		Reader r= Resources.getResourceAsReader("config.xml");
		
		//獲得SQLsession工廠對象
		//通過new一個SQLsessionFactoryBuilder,調用build方法,獲得SQLSessionfactory的對象
		SqlSessionFactory Sqlsfb=new SqlSessionFactoryBuilder().build(r);
		
		
		
		//通過SQLsession的對象調用openSession方法,打開SQLsession
		SqlSession s=Sqlsfb.openSession();
		 
		//通過SQLsession對象調用getMapper方法,得到接口的實例
		ICdaem I= s.getMapper(ICdaem.class);
		
		//查詢
		//通過接口對象,調用接口中的查詢方法,用法中返回值類型接收
		C c=I.select(1);
		//遍歷輸出
		System.out.println(c.getName());
		
		//插入
		//創建實例類對象
		C c2=new C();
		c2.setName("嗯嗯");
		c2.setArg(18);
		int a=I.add(c2);//給方法傳值
		s.commit();//准許修改
		System.out.println(a);
		
		//修改
		C c3=new C();
		c3.setId(1);
		c3.setName("試試");
		c3.setArg(15);
		int b= I.update(c3);
		
		//刪除
		int d=I.delete(3);
		System.out.println(d);
	}
}
  • 主配置文件
<configuration>
	<typeAliases>
		<typeAlias type="com.zy.san.bean.C" alias="C"/>
	</typeAliases>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"></property>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/lianxi"></property>
				<property name="username" value="root"/>
				<property name="password" value="123"/>
			</dataSource>
		</environment>
		
	</environments>
	
	<mappers>
		<mapper resource="com/zy/san/bean/mapper.xml"/>
	</mappers>
</configuration>

上面我們已經詳細理解了針對一張表進行操作,那兩張表如何操作了

實踐四——通過一條sql語句,把兩張表裏面的數據查詢出來。

我有一張User表和一張Post表

第一:改造我們的實體類

1、給User類加個集合屬性,該集合的數據類型爲Post類類型
2、實體類要實現序列化接口(Serializable)
3、Post實體類多了一個User類類型的屬性

	//user表對應的實體類
	int id;
	String name;
	String phoce;
	//爲了拿到post裏面的數據,套中套,數據裏面有集合,集合裏面數據
	List<Post> post;

	//post表對應的實體類
	int id;
	int nameid;
	String phoce;
	User user;

第二:寫user的實體類映射文件

1、特別注意:以前我們寫的select元素的返回值類型是單個實體類類型,而現在改成了自定義返回值類型,用resultMap表示。resultType改成resultMap。
2、然後再自定義resultMap的內容。
定義resultMap裏面的內容是今天課程的重點,務必掌握

<mapper namespace="com.zy.san.Bean.MapperUser">
	<!--自定義返回值  這裏的type是學生表對應的實體類-->
	<resultMap type="User" id="aaa">
		<!--這裏配置的是學生表中的屬性  property學生表對應實體類的屬性名   column學生表字段名-->
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="phoce" column="phoce"/>
		
		<!--這裏是配置課程表     property="list集合屬性名" ofType="課程表對應的實體類"  column="學生表和課程表關聯的字段"-->
		<collection property="post" ofType="com.zy.san.Bean.Post" column="nameid">
			
			<!--Javatype學生表對應實體類的屬性名類型     jdbctype學生表字段名類型 -->
			<result property="id" column="id" javaType="int" jdbcType="INTEGER"/>
			<result property="nameid" column="nameid" javaType="int" jdbcType="INTEGER"/>
			<result property="phoce" column="phoce" javaType="String" jdbcType="VARCHAR"/>
		</collection>
	</resultMap>
	
	<!--parameterType接收值的類型    resultMap自定義返回值 -->
	<select id="select" parameterType="int" resultMap="aaa">
		select `user`.name,`user`.phoce,post.phoce from user,post where user.id=post.nameid and user.id=#{id};
	</select>
</mapper>

第三:主配置文件裏面多了一項Post實體類的別名配置

第四:編寫測試類,把查詢的結果打印輸出顯示

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