MyBatis:是一個支持普通sql查詢和存儲過程以及高級映射的優秀持久層框架,其主要思想是將代碼中大量的SQL語句剝離出來,配置到配置文件中,以實現SQL的靈活配置.
mybatis架構:
1.核心配置文件mybatis-config.xml
配置一些共用的全局配置東西
數據源,緩存,日志,配置mapper文件路徑,等等
2.映射文件XXXMapper.xml
配置sql語句,輸入參數類型 返回結果集類型
3.SqlSessinoFactory(會話工廠)
通過加載核心配置文件的內容來創建會話(sqlSession)
4.sqlSession(會話)
通過會話中的方法來調用映射文件中的sql語句,就相當於可以執行sql語句
5.Executor執行器(MyBatis框架內部的東西,框架會自動調用)
分基本執行器和緩沖執行器
當我們執行SqlSession的時候,框架內部就會自動調用Executor
6.MapperStatement:
內部封裝對象
抽取映射文件xml中的內容(原本是string字符串)
抽取當中的sql語句,參數 返回集 轉換成相對應的java對象
使用步驟:
入門案例:查詢表中的某條數據
1.導入jar包
2.配置核心配置文件
3.編寫pojo類
對應關系:
表------------類
字段----------屬性
記錄----------對象
當然類中有屬性相對應的get/set方法
4.配置映射文件
5.測試使用
1.導入jar包:
主要有:
java連接數據庫的jar包 mybatis的包其依賴包(可以去mybaits官網下載)


2.編寫核心配置文件(mybatis-config.xml)
一般放置在src路徑下

<?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>
<!--<!–指定日志的具體實現–>-->
<!--<settings>-->
<!--<setting name="logImp1" value="LOG4J"/>-->
<!--</settings>-->
<!--環境配置 連接的數據庫-->
<environments default="mysql">
<environment id="mysql">
<!--指定事務管理類型 type="JDBC"指直接簡單使用了JDBC的提交和回滾設置-->
<transactionManager type="JDBC"/>
<!--數據源配置,POOLED是JDBC連接對象的數據源連接池的實現-->
<!--企業開發中不能這個連接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisday01"/>
<property name="username" value="root"/>
<property name="password" value="123456789+0"/>
</dataSource>
</environment>
</environments>
<!--mappers標簽用於告訴mybatis框架去哪里找持久化類的映射文件-->
<mappers>
<mapper resource="com/kylin/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.編寫pojo類
對應關系:
表------------類
字段----------屬性
記錄----------對象
當然類中有屬性相對應的get/set方法
package com.kylin.Pojo; import java.util.Date; public class User { private String id; //在樣例中時而是String,時而是int,記得根據需求改變
private String username; private Date birthday; private String sex; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
4.配置映射文件

<?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">
<!--namespace是命名空間,是一個mapper映射文件的唯一標識符,為了更好的定位 命名方式:包名+sql映射文件名 -->
<mapper namespace="com.kylin.mapper.UserMapper">
<!-- id:該sql語句唯一標識符 parameterType:指定傳入參數類型 resuletType:返回結果集類型 #{} 占位符 相當於jdbc中的? ~~如果傳入的是基本類型(long double int boolean.....)~~里面的參數名可以隨便取 但是比較合適的化,就是是什么參數就寫什么名 如果傳入的是String的花 里面的取值應該是_parameter 比如下面的 id=${_parameter} -->
<!--查詢單條記錄-->
<!--注意: id屬性是String類型 -->
<select id="findUserById" parameterType="java.lang.String" resultType="com.kylin.Pojo.User"> SELECT * FROM user WHERE id=${_parameter} </select>
<!--select * from user where username like '%王%';-->
<!--查詢符合條件的多個用戶 如果是返回的是集合,resultType中的類型是集合的反泛型具體指代的類型 ${} 拼接符 會有sql注入的風險 慎重使用 總結: = 用占位符#{} like 用拼接符${} 里面參數名一定要用value -->
<!--查詢多條記錄-->
<select id="findUserByUsername" parameterType="java.lang.String" resultType="com.kylin.Pojo.User"> select * from user where username like '%${value}%'; </select>
<!--插入單條記錄-->
<!--insert into user(id,username,birthday,sex,address)values("2","kengken",'2009-06-08 23:53:17',"男","廣州");-->
<!-- 如果傳入的是javabean類型(pojo類型) 那么占位符#{}中的變量名必須對應 javabean中對應的屬性名 有時候需要返回數據庫自增主鍵,可以使用mysql的函數:select LAST_INSERT_ID() -->
<!--id屬性是int類型並且主鍵使用了auto_increment自增,使用mysql的LAST_INSERT_ID()-->
<insert id="insertIntoUser" parameterType="com.kylin.Pojo.User">
<!-- keyProperty 將返回的自增主鍵放到傳入參數的id中保存 order 相當於insert語句的執行順序 在INSERT語句執行之前是before,在INSERT語句執行之后執行是after resultType: 就是keyProperty中屬性的類型 在這里就是id類型 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
<!--id屬性是string類型 使用mysql自帶的函數uuid();來返回一個隨即的字符串 注意:這里在插入數據的時候需要id字段,它的流程是:先查詢了之后返回到user對象的id屬性中, 就相當於是幫我們做了 setId部分的操作 -->
<insert id="insertIntoUser2" parameterType="com.kylin.Pojo.User">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> INSERT INTO user(id,username,birthday,sex,address) VALUES (#{id},#{username},#{birthday},#{sex},#{address}) </insert>
<!--刪除單行記錄-->
<!--delete from user where id=?-->
<delete id="deleteUserById" parameterType="java.lang.String"> delete from user where id=#{id} </delete>
<!--更新某行記錄-->
<!--update user set username=${username} where id=${id}-->
<update id="updateUserById" parameterType="com.kylin.Pojo.User"> update user set username=#{username} where id=#{id} </update>
<!--關於參數的類型的選擇方式 如果傳的是一個參數的話,那么就直接寫其類型 但是如果是多個參數的話,那么傳的參數就是javabean類型,注意這時候占位符里面的參數要和javabean對象的屬性相匹配 -->
</mapper>
5.測試使用
package com.kylin.Test; import com.kylin.Pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class Tone { @Test //查詢單條記錄
public void f1() throws IOException { //讀取核心配置文件 //這里面的resources是mybatis框架里面的類
String resource="config/mybatis-config.xml"; InputStream inputStream= Resources.getResourceAsStream(resource); //創建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //開啟會話
SqlSession sqlSession=sqlSessionFactory.openSession(); //所調用的sql語句:namespace.myqsl的id //2個參數 第一個是sql語句 第二個是參數 可以是各種類型 int double String ...等等
User user=sqlSession.selectOne("com.kylin.mapper.UserMapper.findUserById","150620004"); System.out.println(user.getId()); System.out.println(user.getUsername()); } @Test //查詢多條記錄
public void f2() throws IOException { String resource="config/mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); List<User> userList=sqlSession.selectList("com.kylin.mapper.UserMapper.findUserByUsername","王"); // System.out.println(userList);
for (User u:userList){ System.out.println(u.getUsername()); } } @Test //插入單條記錄--主鍵為int類型,插入后返回自增主鍵
public void f3() throws IOException { String resource="config/mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); //2個參數,第一個參數對應相匹配的映射文件中的sql語句,第二個參數對應插入的javabean對象
User user=new User(); System.out.println(user.getId()); user.setUsername("kylin"); user.setAddress("廣州大學"); user.setBirthday(new Date()); user.setSex("男"); sqlSession.insert("com.kylin.mapper.UserMapper.insertIntoUser",user); //提交事務 沒有提交事務的化 數據庫那邊並不會更新 //mybatis會自動開啟事務,但是並不會幫我們提交事務;所以需要我們手動提交事務
sqlSession.commit(); //查看是否會返回自增的主鍵
System.out.println(user.getId()); sqlSession.close(); } @Test //插入單條記錄,使用mysql自帶的uuid()函數來插入id屬性
public void f4() throws IOException { String resource="config/mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); User user=new User(); user.setUsername("xxx"); user.setBirthday(new Date()); user.setAddress("gzhu"); user.setSex("男"); System.out.println(user.getId()); sqlSession.insert("com.kylin.mapper.UserMapper.insertIntoUser2",user); System.out.println(user.getId()); sqlSession.commit(); sqlSession.close(); } @Test //通過id刪除某行記錄
public void f5() throws IOException { String resource="config/mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); sqlSession.delete("com.kylin.mapper.UserMapper.deleteUserById","1"); sqlSession.commit(); sqlSession.close(); } @Test
//通過id修改某行記錄 public void f6() throws IOException { String resource="config/mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); User user=new User(); user.setUsername("zhuoqilin"); user.setId("2"); sqlSession.update("com.kylin.mapper.UserMapper.updateUserById",user); sqlSession.commit(); sqlSession.close(); } }
總結:
本篇文章主要介紹了使用mybatis框架來實現基本的增刪改查操作,需要注意的是映射文件中的parameterType的設置以及resultType的設置,具體的設置都在映射文件中以注解的方式寫出,另外需要關注的就是主鍵的自增還有uuid()函數的使用.
