mybatis如何實現了對數據庫的操作:
1.通過Resources.getResourceAsReader()或者 Resources.getResourceAsStream()加載mybatis.cfg.xml文件為InputStream 或者reader。
2.通過new SqlSessionFactoryBuilder.build()方法來創建一個SQLSessionFactory實例----工作過程是:通過調用build(InputStream or reader)方法---------此時,會通過一個XMLConfigBuilder的類中的parse()方法來獲得一個Configuration的對象傳遞給build--------------build方法變成build(Configration)-----創建出一個sqlSessionFactory對象
3.再通過SQLSessionFactory.open()方法來創建一個SqlSession對象,這個SqlSession就類似於我們JDBC中的Connection,通過這個才能跟數據庫交互。
下面來演示整個myBatis項目的創建過程(鏈接的是mysql數據庫):
創建maven項目,引入mybatis、mysql-Connector、log4j
為了提高代碼的可讀性,作者通常會分別建立beans(存放 成員與我們的數據庫字段一致的類),mapper(存放 接口方法和映射關系文件),tools(對外提供獲得SqlSession的方法)和service包(存放我們的測試類),下面是項目結構圖。
下面是作者的數據庫表結構:
准備工作完成,下面正式開始:
第一步:先創建一個與該數據庫字段對應的java對象:
package com.cj.mybatis.beans; public class UserBean { private int id; private String username; private String password; private double account; //構造函數 public UserBean( String username, String password, double account) { super(); this.username = username; this.password = password; this.account = account; } public UserBean() { } //getter setter public int getId() { return id; } public void setId(int 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 double getAccount() { return account; } public void setAccount(double account) { this.account = account; } //toString @Override public String toString() { return "UserBean [id=" + id + ", username=" + username + ", password=" + password + ", account=" + account + "]"; } }
第二步:創建我們的接口方法和映射配關系文件
下面是接口:
package com.cj.mybatis.mapper; import java.security.PublicKey; import java.util.List; import org.apache.ibatis.annotations.Param; import com.cj.mybatis.beans.UserBean; public interface UserMapper { /** *增加用戶 * @param user * @return * @throws Exception */ public int insertUser(UserBean user) throws Exception; /** * 根據id來更新某用戶信息 * @param user * @return * @throws Exception */ public int updateUser(UserBean user) throws Exception; /** * 根據id來刪除數據 * @param id * @return * @throws Exception */ public int deleteUser(int id) throws Exception; /** * 根據id查詢用戶信息 * @param id * @return * @throws Exception */ public UserBean selectUserById(int id) throws Exception; /** * 查詢所有用戶信息 * @return * @throws Exception */ public List<UserBean> selectAllUser() throws Exception; }
下面是映射關系文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cj.mybatis.mapper.UserMapper"> <!-- 自定義結果集,自定義結果集是select語句返回時用的,下面的select語句 中必須指明對應的結果集id--> <resultMap id="userMap1" type="UserBean"> <!-- 這里的id對應表的主鍵字段 --> <!-- <id property="id" column="id" javaType="java.lang.Integer"></id> --> <!-- 下面是對應表的其他字段--> <!-- <result property="username" column="username" javaType="java.lang.String"></result> <result property="password" column="password" javaType="java.lang.String"></result> <result property="account" column="account" javaType="java.lang.Double"></result> --> </resultMap> <!-- 在各種標簽中的id屬性必須和接口中的方法名相對應 , id屬性值必須是唯一的,不能夠重復使用。parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型 --> <!-- useGeneratedKeys:( 僅 對 insert 有 用 ) 這 會 告 訴 MyBatis 使 用 JDBC 的getGeneratedKeys 方法來取出由數據(比如:像 MySQL 和 SQLServer 這樣的數據庫管理系統的自動遞增字段)內部生成的主鍵。默認值: false。 --> <!--keyProperty: (僅對 insert有用)標記一個屬性, MyBatis 會通過 getGeneratedKeys或者通過 insert 語句的 selectKey 子元素設置它的值。默認:不設置。 --> <!--#{}中的內容,為占位符,當參數為某個JavaBean時,表示放置該Bean對象的屬性值 --> <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> insert into user (username,password,account) values (#{username},#{password},#{account}) </insert>
<!--下面使用的是動態sql,判斷字段是否為null,不為空才去賦值--> <update id="updateUser" parameterType="com.cj.mybatis.beans.UserBean"> update user set <if test="username != null"> username=#{username} </if> <if test="password != null"> ,password=#{password} </if> <if test="account != 0.0"> ,account=#{account} </if> where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <select id="selectUserById" parameterType="int" resultMap="userMap1"> select * from user where id=#{id} </select> <select id="selectAllUser" resultMap="userMap1"> select * from user </select> </mapper>
第三步:將我們的映射文件告知到mybatis的配置文件中,並給類取個全名:
<?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> <!-- 引入外部配置文件 --> <properties resource="mysql.properties"></properties> <!-- 為JAVA Bean起類別名 --> <typeAliases> <!-- 別名方式1,一個一個的配置 type中放置的是類的全路徑,alias中放置的是類別名 <typeAliase type="com.cy.mybatis.beans.UserBean" alias="UserBean"/> --> <!-- 別名方式2,自動掃描,將JAVA類的類名作為類的類別名 --> <package name="com.cj.mybatis.beans" /> </typeAliases> <!-- 配置mybatis運行環境 --> <environments default="cjbatis-claire2"> <environment id="cjbatis-claire2"> <!-- type=jdbc 代表使用JDBC的提交和回滾來管理事物 --> <transactionManager type="JDBC" /> <!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI --> <!-- POOLED 表示支持JDBC數據源連接池 --> <!-- UNPOOLED 表示不支持數據 源連接池 --> <!-- JNDI表示支持外部數據源連接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <mappers> <!-- 當自己使用的是接口方法和Mapper.xml的方式時 ,這里是告知的是.xml的映射文件 --> <!-- 告知映射文件方式1,一個一個的配置 --> <!-- <mapper resource="com/cj/mybatis/mapper/UserMapper.xml"/> --> <mapper class="com.cj.mybatis2.mapper.UserInterfaceFunction"/> <!-- 告知映射文件方式2,直接將包地址寫上,會自動去包里找 。如果要使用這種方式,必須要求接口名稱和映射文件名稱必須完全一樣才可以,否則報Invalid bound statement--> <package name="com/cj/mybatis/mapper"/> </mappers> </configuration>
上面配置文件中引入了mysql的配置文件,將mysql的配置文件准備好:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://XXX.XXX.XXX.XXX:3306/game?autoReconnect=true&failOverReadOnly=false jdbc.username=yourusername jdbc.password=youpassword
為了方便打印日志信息,還需要配置log4j.properties
###根logger設置###
log4j.rootLogger = INFO,console,file
### 輸出信息到控制台###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.Threshold = warn
log4j.appender.console.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss} method: %l----%m%n
###輸出INFO 級別以上的日志文件設置###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = E:/log/web.log
log4j.appender.file.Append = true
log4j.appender.file.Threshold = warn
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} method: %l - [ %p ]----%m%n
第四步:准備一個DBtools類,來對外提供一個獲取SqlSession的方法:
package com.cj.mybatis.tools; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class DBTools { public static SqlSessionFactory SessionFactory; static { try { //加載mybatis的配置文件 Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml"); //構建sqlSession的工廠 SessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); } } //對外提供可以獲得sqlSession的方法 public static SqlSession getSqlSession() { return SessionFactory.openSession(); } }
第五步:提供測試類,去執行增刪改查:
package com.cj.mybatis.service; import java.util.Date; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.cj.mybatis.beans.ProductBean; import com.cj.mybatis.beans.UserBean; import com.cj.mybatis.mapper.ProductMapper; import com.cj.mybatis.mapper.UserMapper; import com.cj.mybatis.tools.DBTools; public class UserService { public static void main(String[] args) throws Exception { SqlSession session = DBTools.getSqlSession(); UserMapper usermapper = session.getMapper(UserMapper.class); System.out.println("----------------"); UserBean user3 = new UserBean(); user3.setUsername("Claire6");//修改name字段 //user3.setPassword("iiiiii"); user3.setAccount(20.9); user3.setId(36); usermapper.updateUser(user3);// 修改的某條id值為36的數據 session.commit(); UserBean userBean = usermapper.selectUserById(36); System.out.println(userBean); } }
總結:
上面使用的是依賴映射實現的,在映射文件中修改sql來完成自己的測試。
其中的updateUser的sql使用 if實現了動態生成。在平時的測試當中,大多數時候並不會更新整條數據庫信息,所以建議掌握這一種。
下面介紹通過注解的方式,來使用mybatis(不需要映射文件的方式):
其他都是一樣的,只是不需要創建映射文件,接口方法中直接使用注解即可:
package com.cj.mybatis2.mapper; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.cj.mybatis.beans.UserBean; public interface UserInterfaceFunction { @Insert("INSERT INTO t_user(username,`password`,account) VALUES(#{username},#{password},#{account})") public int add(UserBean user); @Delete("DELETE from t_user where id = #{id}") public int delete(int id); @Update("UPDATE t_user SET username=#{username},password=#{password},account=#{account} WHERE id =#{id}") public int update(UserBean user); @Select("SELECT * FROM t_user") public List<UserBean> select(); @Select("SELECT * FROM t_user WHERE id=#{id}") public UserBean selectOne(int id); }
注意:這種方式需要在mybatis的配置文件添加下面的語句:
<!-- 接口類的類全名 -->
<mapper class="com.cj.mybatis2.mapper.UserInterfaceFunction"/>