1. 程式人生 > >MyBatis 環境搭建及小試

MyBatis 環境搭建及小試

聽說公司很多開發框架都是基於SpringMVC+MyBatis來開發,也是時候學習這個了,為後面出來工作加快融進開發環境做鋪墊。這裡初始下MyBatis,前面又說到SpringMVC的,後面再將兩者結合起來。

MyBatis的今生前世這裡就不多說,直接說說怎麼搭建,以及最基本的CURD操作。

先下載MyBatis的jar包,MyBatis的核心包就一個,我這裡用的是這個mybatis-3.2.8.jar,如果跟spring結合的話還有一個jar包,這個後面再說。導進jar包這個就不用說了,然後再配上log4j.properties,當然相關的jar也要記得導進去才行。

MyBatis的核心配置檔案


<?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>

  <!-- 這裡寫的是類的別名,type指明的是具體的類位置,alias指明類的別名,
  		別名是為了在sql的對映檔案中方便書寫類名
   -->
  <typeAliases>
	<typeAlias type="lxs.pojo.User" alias="user"/>
  </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://localhost:3306/jikebook"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>

  <!-- sql對映檔案 -->
  <mappers>
	    <mapper resource="lxs/map/user.xml"/>
  </mappers>
  

</configuration>

MyBatis推崇的是一種sql與程式碼相分離的思想,也就是sql都會寫在xml檔案中,然後程式碼在根據sql的id去呼叫執行資料庫操作,這個有點像hibernate的命名查詢getNamedQuery()。

sql對映檔案

<?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="/">
   <!--id標識sql,parameterType指傳入的引數型別,resultType指返回的引數型別,#{id}指變數值-->
  <select id="findById"  parameterType="int"  resultType="user">
  	  select * from User where id=#{id}
  </select>
  <!-- keyProperty通常跟useGeneratedKeys在一起,表明id自增長-->
  <insert id="addUser" parameterType="user" statementType="PREPARED" keyProperty="id" useGeneratedKeys="true">
  	<!-- insert into user (userName,password) values (#{userName},#{password}) -->
  	insert into User
		(userName,password) values
		(#{userName},#{password})
  </insert>
  
  <update id="updateUser" parameterType="user">
  	update User set userName=#{userName},password=#{password} where id=#{id}
  </update>
  <!-- parameterType="hashmap"表明傳入的引數是一個hashmap,也是鍵值對的形式傳入-->
  <select id="loginSelect" resultType="user" parameterType="hashmap">
		select * from User where userName=#{userName} and password=#{password}
  </select>
  <!--返回的是一個List<User>集合-->
  <select id="selectUserList" resultType="user">
  	select * from User
  </select>
  <!--自定義一個返回型別,解決聯合sql查詢再進行物件封裝-->
  <resultMap id="UserMap" type="User"> 
	<id property="id" column="id" /> 
	<result property="userName" column="userName"/> 
	<result property="password" column="password"/> 
  </resultMap>	                                     													    <select id="selectUserMap" resultMap="UserMap">
      select * from User
   </select>
   
   <select id="deleteUser" parameterType="int">
	delete from User where id=#{id}	
   </select>
	


</mapper>

這裡補充下resultMap的用法,像上面id=selectUserMap的select,返回的是resultMap=UserMap,剛開始感覺直接返回resultType=User不就行了嗎,幹嘛還要多次一舉。原來resultMap是為了解決當pojo與表字段不一致的使用,因為如果一致的話,select查詢得到的欄位值是會自動封裝進pojo物件,但此時如果pojo屬性不一致,那麼set方法可能就會不一樣,那麼封裝就會出錯,所以需要resultMap來統一。

測試類
public class TestHello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String resource = "lxs/map/MyBatisConfig.xml";
		Reader reader = null;
		SqlSession session;
		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder()
				.build(reader);
		session = sqlMapper.openSession();
		/*User temp = session.selectOne("findById", 4);
		System.out.println(temp.getUserName());*/
		/*User user=new User();
		user.setUserName("lxiaosg");
		user.setPassword("123456");
		session.insert("addUser", user);*/
		/*User user=new User();
		user.setId(1);
		user.setUserName("like");
		user.setPassword("123456");
		session.update("updateUser", user);*/
		/*HashMap<String,String> hm=new HashMap();
		hm.put("userName", "like");
		hm.put("password","123456");
		User temp=session.selectOne("loginSelect",hm);
		if(temp!=null)
		{
			System.out.println(temp.toString());
			System.out.println("登陸成功!");
		}*/
		
		/*List<User> ap=session.selectList("selectUserList");
		for(int i=0;i<ap.size();i++){
			System.out.println(ap.get(i).toString());
		}*/
		/*List<User> ap=session.selectList("selectUsers");
		for(JiKeUser temp:ap) {
			System.out.println("使用者名稱="+temp.getUserName()); 
		}*/
		//session.delete("deleteUser", new Integer(1));
		
		List<User> ap=session.selectList("selectUserMap");
		for(User temp:ap) {
			System.out.println("使用者名稱="+temp.getUserName()); 
		}
		session.commit();
		session.close();
	}

}