Mybatis入門文件
Mybatis
1. Mybatis入門
從一個jdbc程式開始
Publicstaticvoid main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//載入資料庫驅動
Class.forName("com.mysql.jdbc.Driver");
//通過驅動管理類獲取資料庫連結
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"
//定義sql語句 ?表示佔位符
String sql = "select * from user where username = ?";
//獲取預處理statement
preparedStatement = connection.prepareStatement(sql);
//設定引數,第一個引數為sql語句中引數的序號(從1開始),第二個引數為設定的引數值
preparedStatement.setString(1, "王五");
//向資料庫發出sql執行查詢,查詢出結果集
resultSet = preparedStatement.executeQuery();
//遍歷查詢結果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//釋放資源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
上邊使用jdbc的原始方法(未經封裝)實現了查詢資料庫表記錄的操作。
jdbc操作步驟總結如下:
1、 載入資料庫驅動
2、 建立並獲取資料庫連結
3、 建立jdbc statement物件
4、 設定sql語句
5、 設定sql語句中的引數(使用preparedStatement)
6、 通過statement執行sql並獲取結果
7、 對sql執行結果進行解析處理
8、 釋放資源(resultSet、preparedstatement、connection)
jdbc問題總結如下:
1、 資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連結池可解決此問題。
2、 Sql語句寫在程式碼中造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。
3、 向sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應。
4、 對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo物件解析比較方便。
MyBatis介紹
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis。
MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼。
Mybatis通過xml或註解的方式將要執行的statement配置起來,並通過java物件和statement中的sql進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回。
Mybatis架構
1、 mybatis配置
SqlMapConfig.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊。
mapper.xml檔案即sql對映檔案,檔案中配置了操作資料庫的sql語句。此檔案需要在SqlMapConfig.xml中載入。
2、 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠
3、 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。
4、 mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器、一個是快取執行器。
5、 Mapped Statement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個Mapped Statement物件,sql的id即是Mapped statement的id。
6、 Mapped Statement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是jdbc程式設計中對preparedStatement設定引數。
7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql後將輸出結果對映至java物件中,輸出結果對映過程相當於jdbc程式設計中對結果的解析處理過程。
Mybatis第一個程式
第一步:建立java工程
使用eclipse建立java工程,jdk使用1.6。
第二步:加入jar包
加入mybatis核心包、依賴包、資料驅動包。
第三步:log4j.properties
在classpath下建立log4j.properties如下:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis預設使用log4j作為輸出日誌資訊。
第四步:SqlMapConfig.xml
在classpath下建立SqlMapConfig.xml,如下:
<?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>
<!-- 和spring整合後 environments配置將廢除-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="mysql" />
</dataSource>
</environment>
</environments>
</configuration>
SqlMapConfig.xml是mybatis核心配置檔案,上邊檔案的配置內容為資料來源、事務管理。
第五步:po類
Po類作為mybatis進行sql對映使用,po類通常與資料庫表對應,User.java如下:
Publicclass User {
Privateintid;
private String username;// 使用者姓名
private String sex;// 性別
private Date birthday;// 出生日期
private String address;// 地址
private String detail;// 詳細資訊
private Float score;// 成績
get/set……
第六步:sql對映檔案
在classpath下的sqlmap目錄下建立sql對映檔案User.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">
<mappernamespace="test">
<!-- 根據id獲取使用者資訊 -->
<selectid="selectUserById"parameterType="int"resultType="cn.itcast.mybatis.po.User">
select * from user where id = #{id}
</select>
<selectid="selectUserList"resultType="cn.itcast.mybatis.po.User">
select * from user
</select>
<!-- 獲取使用者列表 -->
<selectid="selectUserList"resultType="cn.itcast.mybatis.po.User">
select * from user
</select>
<!-- 新增使用者 -->
<insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">
insert into user(username,birthday,sex,address,detail,score)
values(#{username},#{birthday},#{sex},#{address},#{detail},#{score});
</insert>
<!-- 更新使用者 -->
<update id="updateUser"parameterType="cn.itcast.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address},detail=#{detail},score=#{score}
where id=#{id}
</update>
<!-- 刪除使用者 -->
<delete id="deleteUser"parameterType="cn.itcast.mybatis.po.User">
delete from user where id=#{id}
</delete>
</mapper>
namespace :名稱空間,用於隔離sql語句,後面會講另一層非常重要的作用。
parameterType:定義輸入到sql中的對映型別,#{id}表示使用preparedstatement設定佔位符號並將輸入變數id傳到sql。
resultType:定義結果對映型別。
第七步:將User.xml新增在SqlMapConfig.xmls
在SqlMapConfig.xml中新增mappers如下:
<mappers>
<mapperresource="sqlmap/user.xml"/>
</mappers>
這裡即告訴mybatis Sql對映檔案在哪裡。
第八步:程式編寫
查詢
/**
* 第一個mybatis程式
*
* @authorThinkpad
*
*/
Publicclass Mybatis_select {
Publicstaticvoid main(String[] args) throws IOException {
//mybatis配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder建立sessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
//通過session工廠獲取一個Sqlsession,sqlsession中包括了對資料庫操作的sql方法
SqlSession session = sqlSessionFactory.openSession();
try {
//通過sqlsession呼叫selectOne方法獲取一條結果集
//引數1:指定定義的statement的id,引數2:指定向statement中傳遞的引數
User user = session.selectOne("test.selectUserById", 1);
System.out.println(user);
//呼叫selectList查詢資料列表
List<User> list = session.selectList("test.selectUserList");
} finally{
session.close();
}
}
}
新增
Publicclass Mybatis_insert {
Publicstaticvoid main(String[] args) throws IOException {
//mybatis配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder建立sessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
//通過session工廠獲取一個Sqlsession,sqlsession中包括了對資料庫操作的sql方法
SqlSession session = sqlSessionFactory.openSession();
try {
User user = new User();
user.setUsername("張三");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("北京市");
user.setDetail("好同志");
user.setScore(99.8f);
session.insert("test.insertUser", user);
session.commit();
} finally{
session.close();
}
}
}
mysql自增主鍵返回
通過修改sql對映檔案,可以將mysql自增主鍵返回:
<insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">
<!-- selectKey將主鍵返回,需要再返回 -->
<selectKeykeyProperty="id"order="AFTER"resultType="java.lang.Integer">
</selectKey>
insert into user(username,birthday,sex,address,detail,score)
values(#{username},#{birthday},#{sex},#{address},#{detail},#{score});
</insert>
新增selectKey實現將主鍵返回
keyProperty:返回的主鍵儲存在pojo中的哪個屬性
order:selectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成,所以這裡selectKey的執行順序為after
resultType:返回的主鍵是什麼型別
LAST_INSERT_ID():是mysql的函式
Mysql使用 uuid實現主鍵
需要增加通過select uuid()得到uuid值
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey resultType="java.lang.String" order="BEFORE"
keyProperty="id">
select uuid()
</selectKey>
insert into user(id,username,birthday,sex,address,detail,score)
values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})
</insert>
注意這裡使用的order是“BEFORE”
Oracle使用序列生成主鍵
首先自定義一個序列且用於生成主鍵,selectKey使用如下:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey resultType="java.lang.Integer" order="BEFORE"
keyProperty="id">
SELECT 自定義序列.NEXTVAL FROM DUAL
</selectKey>
insert into user(id,username,birthday,sex,address,detail,score)
values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})
</insert>
注意這裡使用的order是“BEFORE”
刪除
Publicclass Mybatis_delete {
Publicstaticvoid main(String[] args) throws IOException {
//mybatis配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder建立sessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
//通過session工廠獲取一個Sqlsession,sqlsession中包括了對資料庫操作的sql方法
SqlSession session = sqlSessionFactory.openSession();
try {
session.delete("test.deleteUser", 4);
session.commit();
} finally{
session.close();
}
}
}
修改
Publicclass Mybatis_update {
Publicstaticvoid main(String[] args) throws IOException {
//mybatis配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder建立sessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
//通過session工廠獲取一個Sqlsession,sqlsession中包括了對資料庫操作的sql方法
SqlSession session = sqlSessionFactory.openSession();
try {
User user = new User();
user.setId(4);
user.setUsername("李四");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("北京市");
user.setDetail("好同志");
user.setScore(99.8f);
session.update("test.updateUser", user);
session.commit();
} finally{
session.close();
}
}
}
步驟總結:
1、 建立SqlSessionFactory
2、 通過SqlSessionFactory建立SqlSession
3、 通過sqlsession執行資料庫操作
4、 呼叫session.commit()提交事務
5、