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