1. 程式人生 > >Mybatis入門文件

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"

"root""mysql");

//定義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、 釋放資源(resultSetpreparedstatementconnection)

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物件,sqlid即是Mapped statementid

6、 Mapped Statementsql執行輸入引數進行定義,包括HashMap、基本型別、pojoExecutor通過Mapped Statement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是jdbc程式設計中對preparedStatement設定引數。

7、 Mapped Statementsql執行輸出結果進行定義,包括HashMap、基本型別、pojoExecutor通過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.xmlmybatis核心配置檔案,上邊檔案的配置內容為資料來源、事務管理。

第五步: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工廠獲取一個Sqlsessionsqlsession中包括了對資料庫操作的sql方法

SqlSession session = sqlSessionFactory.openSession();

try {

//通過sqlsession呼叫selectOne方法獲取一條結果集

//引數1:指定定義的statementid,引數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工廠獲取一個Sqlsessionsqlsession中包括了對資料庫操作的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中的哪個屬性

orderselectKey的執行順序,是相對與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工廠獲取一個Sqlsessionsqlsession中包括了對資料庫操作的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工廠獲取一個Sqlsessionsqlsession中包括了對資料庫操作的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、