本次實踐是針對實體映射文件、接口、註解的三種不同的實現方式進行實踐和對比
實踐一——實體類+實體映射文件
題目:數據庫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>