mybatis教程1【基本使用】
阿新 • • 發佈:2019-04-29
什麼是MyBatis?
MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
mybatis和hibernate的比較
|mybatis| hibernate | |--|--| | 半自動ORM框架 | 全自動ORM框架 | |必須寫sql |可以不寫sql | | 事務處理 | 事務處理 | |快取都支援 | 快取都支援,二級快取比mybatis更好 |
入門案例
建立maven工程,新增對應jar包
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> </dependencies>
建立全域性配置檔案
該配置檔案包含了對MyBatis系統的核心設定,包含獲取資料庫連線例項的資料來源,和決定事務作用域和控制方式的事務功能。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> <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/pms?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
定義User對像
建立對映檔案
<?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="dpb">
<insert id="addUser" parameterType="com.sxt.dao.User">
insert into t_user(name,age)values(#{name},#{age})
</insert>
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from t_user where id=#{id}
</delete>
<update id="updateUserById" parameterType="com.sxt.dao.User">
update t_user set name = #{name} where id=#{id}
</update>
<select id="getUserById" parameterType="java.lang.Integer" resultType="com.sxt.dao.User">
select * from t_user where id=#{id}
</select>
</mapper>
將配置檔案新增到主配置檔案中
測試查詢
@Test
public void add() throws IOException {
// 1.通過Resources物件載入配置檔案
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2.獲取SqlSessionFactory物件
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
// 3.通過SqlSessionFactory物件獲取SQLSession物件
SqlSession session = factory.openSession();
User user = new User();
user.setName("dpb");
user.setAge(22);
// dpb.addUser 是對映檔案中 namespace的內容加 id的內容,定位要執行的SQL
int count = session.insert("dpb.addUser", user);
System.out.println("影響的行數:"+count);
// 需要顯示的提交
session.commit();
session.close();
}
}
查詢,修改,刪除操作
public class Test02 {
private SqlSession sqlSession;
@Before
public void before() throws IOException {
// 1. 載入配置檔案
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2. 根據配置檔案獲取一個SqlSessionFactory物件,這個物件相當於連線工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 3. 獲取一個sqlsession,sqlsession類似於之前學過的Connection
sqlSession = sqlSessionFactory.openSession();
}
@After
public void after() {
sqlSession.commit();
sqlSession.close();
}
@Test
public void test1() {
User user = new User();
user.setId(7);
user.setName("里斯1");
int update = sqlSession.update("dpb.updateUserById", user);
System.out.println(update);
}
@Test
public void test2() {
int delete = sqlSession.delete("dpb.deleteUserById", 7);
System.out.println(delete);
}
@Test
public void test3() {
User user = (User) sqlSession.selectOne("dpb.getUserById", 8);
System.out.println(user);
}
}
案例優化
獲取SqlSessionFactory
SqlSessionFactory在一個服務中只需要有一個例項就可以了,此時可以通過單例的模式獲取
/**
* 工具類 對外提供SqlSessionFactory的單例物件
* @author dengp
*
*/
public class DbUtils {
private static SqlSessionFactory factory ;
public static SqlSessionFactory getInstace(){
if(factory ==null){
InputStream in = null;
try{
in = Resources.getResourceAsStream("mybatis-config.xml");
}catch(Exception e){
e.printStackTrace();
}
synchronized (DbUtils.class) {
if(factory ==null){
factory = new SqlSessionFactoryBuilder().build(in);
}
}
}
return factory;
}
}
整理CRUD操作
public interface UserMapper {
public int addUser(User user);
public int updateById(User user);
public int deleteById(int id);
public User queryById(int id);
}
public class UserDao implements UserMapper {
@Override
public int addUser(User user) {
return DBUtils.getInstall().openSession().insert("com.sxt.dao.UserMapper.addUser", user);
}
@Override
public int updateById(User user) {
// TODO Auto-generated method stub
return DBUtils.getInstall().openSession().update("com.sxt.dao.UserMapper.updateById", user);
}
@Override
public int deleteById(int id) {
// TODO Auto-generated method stub
return DBUtils.getInstall().openSession().delete("com.sxt.dao.UserMapper.deleteById", id);
}
@Override
public User queryById(int id) {
// TODO Auto-generated method stub
return DBUtils.getInstall().openSession().selectOne("com.sxt.dao.UserMapper.queryById", id);
}
}
<?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.sxt.dao.UserMapper">
<insert id="addUser" parameterType="com.sxt.bean.User">
insert into t_user(name,age)values(#{name},#{age})
</insert>
<delete id="deleteById" parameterType="java.lang.Integer">
delete from t_user where id=#{id}
</delete>
<update id="updateById" parameterType="com.sxt.bean.User">
update t_user
set name=#{name},age=#{age}
where id=#{id}
</update>
<select id="queryById" parameterType="java.lang.Integer"
resultType="com.sxt.bean.User">
select * from t_user where id=#{id}
</select>
</mapper>
/**
* 代理方式
*/
@Test
public void test(){
UserMapper mapper = (UserMapper) Proxy.newProxyInstance(UserMapper.class.getClassLoader()
, new Class[]{UserMapper.class},new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(UserMapper.class.getName()+"."+method.getName());
Object id = null;
for (Object object : args) {
System.out.println(object);
id = object;
}
// 實現邏輯
return DBUtils.getInstall().openSession().selectOne(UserMapper.class.getName()+"."+method.getName(), id);
}
} );
System.out.println(mapper.queryById(5));
}
mybatis介面的使用方式
通過前面UserDao的設計,可以發現,UserDao中的程式碼都是模板化程式碼,都可以通過配置自動生成,因此,在實際開發中,Mapper可以按照如下方式設計
定義Mapper介面
Mapper介面中,只需要宣告方法名,方法引數、方法返回等資訊
public interface UserMapper {
public int addUser(User user);
}
定義對映檔案
<?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 namespace="com.sxt.dao.UserMapper">
<!-- id必須和介面宣告的方法一致 -->
<insert id="addUser" parameterType="com.sxt.bean.User">
insert into t_user(name,age)values(#{name},#{age})
</insert>
</mapper>
測試
@Test
public void add() throws IOException {
// 1.通過Resources物件載入配置檔案
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2.獲取SqlSessionFactory物件
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
// 3.通過SqlSessionFactory物件獲取SQLSession物件
SqlSession session = factory.openSession();
User user = new User();
user.setName("dpb");
user.setAge(22);
//通過Java動態代理自動提供了UserMapper的實現類
UserMapper mapper = session.getMapper(UserMapper.class);
int count = mapper.addUser(user);
System.out.println("影響的行數:"+count);
session.commit();
}
注意: 使用mapper介面方式必須滿足: |序號 | 注意點 | |--|--| | 1 | 對映檔案的namespace的值必須是介面的全路徑名稱 比如:com.dpb.dao.UserMapper | | 2 | 介面中的方法名在對映檔案中必須有一個id值與之對應。 | | 3 | 對映檔案的名稱必須和