1. 程式人生 > >javaEE核心框架之 Mybatis ( 三 ) 必備開發技能

javaEE核心框架之 Mybatis ( 三 ) 必備開發技能

使用getMapper面向介面程式設計

  前面的程式碼都是使用如下對資料庫進行操作:

        對方法insert 、delete 、update 和selectList 傳入sqlId 來達到呼叫SQL 語句而對資料庫的操作

        sqlSession.insert("insertUserinfo","xxx");
        sqlSession.delete("deleteById","xxx");
        sqlSession.update("updateById","xxx") ;

        sqlSession.selectList("selectUserinfo","xxx");I

        這種程式碼是不規範的,規範的寫法不是面向sqlld 程式設計,而是面向介面程式設計,比sqlid 的方式,使用“介面- SQL 對映”在程式碼規範上更好。

介面-SQL 對映的對應關係

        SQL 對映檔案userinfoMapper.xml 中的 namespace 屬性值 sqlmapping.UserinfoMapper 代表
        該對映對應的就是 mapping 包中的UserinfoMapper介面,

     而<insert>標籤的 id 屬性值 insertUserinfo 就是 UserinfoMapper介面中的public void insertUserinfo (     Userinfouserinfo )方法,<insert> 標籤的 parameterType 屬性值mapping.Userinfo 就是public void            insertUserinfo(Userinfo userinfo)的方法引數型別.

建立Userinfo實體類

public class Userinfo {

	private long id;
	private String username;
	private String password;
	private long age;
	private Date createTime;

	public Userinfo() {
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public long getAge() {
		return age;
	}

	public void setAge(long age) {
		this.age = age;
	}

	public Date getInsertdate() {
		return createTime;
	}

	public void setInsertdate(Date createTime) {
		this.createTime = createTime;
	}

}

建立UserinfoMapper 介面

public interface UserinfoMapper {
	public void insertUserinfo(Userinfo userinfo);

	public List<Userinfo> selectAll();

	public Userinfo selectById(long userId);

	public void deleteById(long userId);

	public void updateById(Userinfo userinfo);
}

SQL 對映檔案UserinfoMapper.xml 中的程式碼和前面章節中的程式碼大體一樣.

<?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="mapping.UserinfoMapper">
    <insert id="insertUserinfo" parameterType="entity.Userinfo">
        insert into userinfo(username,password,age,createTime)
        values(#{username},#{password},#{age},#{createTime})
    </insert>

    <select id="getAllUserinfo" resultType="entity.Userinfo">
        select * from userinfo order
        by id asc
    </select>

    <select id="getUserinfoById" parameterType="long" resultType="entity.Userinfo">
        select *
        from userinfo where id=#{id}
    </select>

    <delete id="deleteUserinfoById" parameterType="long">
        delete
        from userinfo where
        id=#{id}
    </delete>

    <update id="updateUserinfoById" parameterType="entity.Userinfo">
        update userinfo set
        username=#{username},
        password=#{password},
        age=#{age},
        createTime=#{createTime}
        where id=#{id}
    </update>
</mapper>
SQL 與介面的對映對應關係一定要配置成功,不然程式就會出現異常。

    增加記錄insertUserinfo的程式碼

    public class InsertUserinfo {
	public static void main(String[] args) {
		try{
			Userinfo userinfo = new Userinfo();
			userinfo.setUsername("渡西湖");
			userinfo.setPassword("duxihu");
			userinfo.setAge(18);

			string resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceasStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			SqlSession sqlSession = sqlSessionFactory.openSession();

			UserinfoMapper userinfoMapper = sqlSession.getMapper(UserinfoMapper.class);
			userinfoMapper.insertUserinfo(userinfo);

			sqlSession.commit();
			sqlSession.close();

			System.out.println("createId=" + userinfo.getId());
		}catch (IOException e){
			e.printStackTrace();
		}
	}
}
介面UserinfoMapper並不能直接使用, 必須得有介面UserinfoMapper的實現類才可以執行任務。MyBatis 動態地創建出了介面UserinfoMapper的實現類,所以才可以對UserinfoMapper 物件進行賦值, 屬於多型關係。
UserinfoMapper userinfoMapper = sqlSession.getMapper(UserinfoMapper.class);

使用tvpeAliases 配置別名

  在執行se lect 查詢或insert新增的SQL 語句時,都要在parameterType 或resultType 屬性中寫上完整的實體類路徑,路徑中需要包含完整的包名 ,這時可以在mybatis-config.xml配置檔案中使用<typeAliases>標籤來簡化

        <typeAliases>
		<typeAlias type="entity.Userinfo" alias="userinfo" />
	</typeAliases>

其中type就是完整名稱,alias就是別名,這個別名可以在SQL 對映檔案中進行使用,從而簡化了配置程式碼

使用package 批量配置別名

  如果實體類的數量較多,可以通過使用<package>標籤來解決,在<typeAliases>標籤中使用<package>子標籤來掃描包中的類而自動創建出類的別名

        <typeAliases>
		<package name="entity" />
	</typeAliases>

如果在不同的包中出現相同實體類名的情況下, 在MyBatis 解析XML 配置檔案時就會出現異常資訊

使用properties 檔案儲存資料庫資訊

        可以將連線資料庫的資訊轉移到properties 屬性檔案中,這樣也便於程式碼的後期維護與管理

        更改mybatis-config.xml 配置檔案的部分程式碼如下:

<configuration>
	<properties resource="db.properties"></properties>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="mapping/UserinfoMapper.xml" />
	</mappers>
</configuration>

添加了配置程式碼<properties resource="db.properties"></properties>來使用db.properties

  src 中建立db.properties 屬性檔案

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=UTC&useSSL=false&characterEncoding=utf8
username=test
password=test	

與資料來源Datasource 有關的操作

1. 配置多個environment 環境

<configuration>
	<properties resource="db.properties"></properties>
	<environments default="oracle2">
		<environment id="oracle1">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${oracle1.driver}" />
				<property name="url" value="${oracle1.url}" />
				<property name="username" value="${oracle1.username}" />
				<property name="password" value="${oracle1.password}" />
			</dataSource>
		</environment>

		<environment id="oracle2">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${oracle2.driver}" />
				<property name="url" value="${oracle2.url}" />
				<property name="username" value="${oracle2.username}" />
				<property name="password" value="${oracle2.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="mapping/UserinfoMapper.xml" />
	</mappers>
</configuration>

配置<environments default=”oracle2”>程式碼中的default 屬性值是oracle2 ,代表要連線的是oracle2 中的配置資訊

db.properties程式碼

oracle1.driver=oracle.jdbc.OracleDriver
oracle1.url=jdbc:oracle:thin:@localhost:1521:orcl
oracle1.username=test
oracle1.password=test

oracle2.driver=oracle.jdbc.OracleDriver
oracle2.url=jdbc:oracle:thin:@localhost:1521:orcl
oracle2.username=test
oracle2.password=errorpassword