MyBatis 環境搭建及小試
阿新 • • 發佈:2019-02-06
聽說公司很多開發框架都是基於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();
}
}