MyBatis對資料庫的增刪改查操作,簡單示例
阿新 • • 發佈:2019-01-09
之前一直實用Hibernate進行開發,最近公司在使用Mybatis,根據網上的示例,做了一個簡單的Demo,以便日後複習
使用XMl方式對映sql語句
總體結構如下圖
首先是建立一個工程,然後匯入兩個jar包,然後編寫mybatis的jdbc配置檔案Configuration.xml
Configuration.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> <!-- 為sql對映檔案中的型別指定別名,如果不加alias,則整個包下的別名都是類名 --> <typeAliases> <typeAlias type="com.demo.bean.User" alias="User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" /> <property name="username" value="scott" /> <property name="password" value="scott" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/demo/bean/User.xml" /> </mappers> </configuration>
User類,文章中省略getter和setter方法
package com.demo.bean;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date birthday;
private String address;
}
然後是建立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"> <mapper namespace="com.demo.bean.User"> <!-- 查詢所有使用者, resultType代表返回型別(一般寫全限定類名,也可以在mybatis配置檔案中指定別名),parameterType代表引數型別 --> <select id="selectAllUsers" resultType="User"> select * from valid_user </select> <!-- 根據id查詢使用者 --> <select id="findUserById" parameterType="int" resultType="User"> select * from valid_user where id=#{id} </select> <!-- 根據id更新使用者 --> <update id="updateUserById" parameterType="User"> update valid_user set name=#{name},address=#{address} where id=#{id} </update> <!-- 新增新使用者 --> <insert id="addUser" parameterType="User"> insert into valid_user(id,name,password,address) values(seq_valid_user.nextval,#{name},#{password},#{address}) </insert> <!-- 根據id刪除使用者 --> <delete id="deleteUserById" parameterType="int"> delete from valid_user where id=#{id} </delete> </mapper>
package com.demo.Test; import java.io.Reader; import java.util.List; 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 com.demo.bean.User; public class TestConnection { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; static { try { reader = Resources.getResourceAsReader("Configuration.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) { e.printStackTrace(); } } /** * 查詢所有User物件 * @param id */ public static void selectAllUsers() { SqlSession session = sqlSessionFactory.openSession(); try { List<User> listUsers = session.selectList("com.demo.bean.User.selectAllUsers"); for (User user:listUsers) { System.out.println("ID:" + user.getId() + ",姓名:" + user.getName() + ",密碼:" + user.getPassword() + ",住址:" + user.getAddress()); } } finally { session.close(); } } /** * 根據id查詢User物件 * @param id */ public static void findUserById(String id) { SqlSession session = sqlSessionFactory.openSession(); try { User user = (User) session.selectOne("com.demo.bean.User.findUserById", id); System.out.println("ID:" + user.getId() + ",姓名:" + user.getName() + ",密碼:" + user.getPassword() + ",住址:" + user.getAddress()); } finally { session.close(); } } /** * 根據id更新User物件 * @param id */ public static void updateUserById(String id,User user) { SqlSession session = sqlSessionFactory.openSession(); try { session.update("com.demo.bean.User.updateUserById",user); session.commit(); } finally { session.close(); } } /** * 新增一條User物件 */ public static void addUser(User user) { SqlSession session = sqlSessionFactory.openSession(); try { session.insert("com.demo.bean.User.addUser",user); session.commit(); } finally { session.close(); } } /** * 刪除一條User物件 */ public static void deleteUserById(String id) { SqlSession session = sqlSessionFactory.openSession(); try { session.delete("com.demo.bean.User.deleteUserById",id); session.commit(); } finally { session.close(); } } public static void main(String[] args) { selectAllUsers(); // findUserById("1"); // 根據id查詢User物件 // User user=new User(); // user.setId("2"); // user.setName("Zams"); // user.setAddress("河南、鄭州"); // updateUserById("2",user); // 根據id更新User物件 // User add_user=new User(); // add_user.setName("古力娜扎"); // add_user.setPassword("3412312"); // add_user.setAddress("河南、鄭州、開封"); // addUser(add_user); // 根據id更新User物件 // deleteUserById("4"); } }
執行效果如下;
ID:1,姓名:X-rapido,密碼:rapido,住址:北京朝陽、海淀
ID:2,姓名:Zams,密碼:gril,住址:河南、鄭州
ID:3,姓名:蓋爾加朵,密碼:3412312,住址:河南、鄭州
ID:5,姓名:古力娜扎,密碼:3412312,住址:河南、鄭州、開封
其他內容:
- SqlSession session = sqlSessionFactory.openSession(); 可以設定事務的自動提交。
- 配置檔案中的jdbc聯接可以寫在properties檔案中。
- Mybatis的sql對映可以使用xml的形式,如上面內容,也可以使用java註解方式。
- 對映檔案中可以配置多表連線方式。參考其他文件,未做示例
- 另外mybatis可以配置動態sql語句形式、呼叫儲存過程、為sql語句欄位指定別名(一般資料庫欄位與java類欄位不同時需要指定)
- Mybatis的sql列印並不像Hibernate那樣有設定sql列印的引數,它需要與log4j.jar包進行配合才能列印
使用Java註解方式對映sql語句
使用註解方式的示例結構如下總體結構內容不變,主要修改java註解配置類(Service類)、配置檔案、測試類3個地方即可
UserMapper類
package com.demo.bean;
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;
/**
* 使用註解對映,不需要寫實現類,但要在Mybatis配置檔案中將此類進行註冊
*/
public interface UserMapper {
@Select("select * from valid_user")
List<User> selectAllUsers();
@Select("select * from valid_user where id=#{id}")
User findUserById(String id);
@Update("update valid_user set name=#{name},address=#{address} where id=#{id}")
int updateUserById(User user);
@Insert("insert into valid_user(id,name,password,address) values(seq_valid_user.nextval,#{name},#{password},#{address})")
int addUser(User user);
@Delete("delete from valid_user where id=#{id}")
int deleteUserById(String id);
}
Mybatis配置檔案中 configuration.xml修改 mapper內容
<mappers>
<mapper class="com.demo.bean.UserMapper" />
</mappers>
將測試類中的如查詢所有程式碼的com.demo.bean.User.selectAllUsers修改為com.demo.bean.UserMapper.selectAllUsers即可。
測試效果同xml的配置效果一樣。
在實際應用中,有時候需要對Mybatis進行多引數傳值,這時候可以使用Map物件進行查詢
比如在登入時,傳入賬戶名和密碼,在xml在將 parameterType設定為map引數型別, parameterType="map"
Map<String, String> map = new HashMap<String, String>();
map.put("name", userName);
map.put("password", password);
return sqlSession.selectOne("com.demo.bean.User.loginUser", map);
設定log4j,列印SQL執行語句
log4j的配置檔案可以是xml形式,也可以是.properties檔案形式
log4j.properties(方式一)
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="debug" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>