1. 程式人生 > >MyBatis框架入門小案例(關於用mybatis框架對數據庫的增刪改查)

MyBatis框架入門小案例(關於用mybatis框架對數據庫的增刪改查)

throw gets ioe ssa 靜態代碼塊 文件 boolean 實現 where

1.新建一個maven項目,建好相對應的包,在https://mvnrepository.com中導入MyBatis需要的依賴,復制到配置文件中

技術分享圖片

2.在resources文件下添加mybatis-config.xml文件和mapper文件夾,mybatis-config.xml是連接mysql的主要配置,mapper文件夾存放的是對數據庫增刪改查的映射

mybatis-config.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>
<!--typeAliases用於給類型指定別名-->
<typeAliases>
<!--方式一:type屬性是使用完整的類名,alias屬性是別名-->
<!--<typeAlias type="edu.nf.mybatis.entity.Users" alias="Users"/>-->
<!-- 方式二:直接給整個實體包定義別名,name屬性指定實體類所在的包名,這樣會為每一個實體類自動
生成一個別名,而這個 別名就是實體類的類名並且首字母小寫-->
<package name="edu.nf.mybatis.entity"/>
</typeAliases>

<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--將所有的mapper映射配置文件加入到mapper配置中-->
<mappers>
<mapper resource="mapper/UsersMapper.xml"/>
</mappers>
</configuration>

實體類:Users
package edu.nf.mybatis.entity;

/**
* 描述:
* 用戶實體類
*
* @author lance
* @create 2018-09-10 14:10
*/
public class Users {
/**
* 主鍵
*/
private String uid;
/**
* 名字
*/
private String userName;
/**
*
*/
public String getUid() {
return uid;
}

public void setUid(String uid) {
this.uid = uid;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}
}
實體類建好後,就可以配置對應的mapper類,
UserMapper.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指定Dao接口的完整類名
mybatis會依據這個接口動態創建一個實現類去實現這個接口
而這個實現類是一個Mapper對象-->
<mapper namespace="edu.nf.mybatis.dao.UserDaoInf">
<!--在mapper裏面就可以配置基於mybatis的增刪查改的sql映射配置-->
<!--插入操作,id指定UserDao接口中的方法名,
parameterType為指定方法參數的類型,。也可以定義為TypeAlias中定義的別名
useGeneratedKeys屬性設置為true表示使用主鍵自增長
keyProperty屬性指定實體中需要自增長的字段名稱

sql設置參數的時候使用#{},#{}是一個ognl表達式,(對象圖導航語言)
而這裏的#{}中指定的實體中的字段名
-->
<insert id="saveUser" parameterType="users" >
insert into user_info(u_id,u_name) values(#{uid},#{userName})
</insert>
<update id="updateUser" parameterType="users">
update user_info set u_name=#{userName} where u_id=#{uid}
</update>
<delete id="deleteUser" parameterType="java.lang.String">
delete from user_info where u_id=#{uid}
</delete>

<!--根據ID來查詢某條用戶的信息-->
<select id="findUsersById" parameterType="java.lang.String" resultType="users">
select u_id as uid, u_name as userName from user_info where u_id=#{uid}
</select>
<!--查詢所有的用戶信息-->
<select id="findAll" parameterType="users" resultType="users">
select u_id as uid ,u_name as userName from user_info
</select>
</mapper>

我們還需要一個mybatis的工具類,這個工具類主要 是解析mybatis-config.xml,
 並初始化一個SqlSessionFactory工廠,然後通過這個工廠來創建SqlSession實例。
一個SqlSessionr實例其實就是一個變相的Connection對象
package edu.nf.mybatis.tools;

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 java.io.IOException;
import java.io.InputStream;

/**
* 描述:
* mybatis工具類,這個工具類主要 是解析mybatis-config.xml,
* 並初始化一個SqlSessionFactory工廠,然後通過這個工廠來創建SqlSession實例。
* 一個SqlSessionr實例其實就是一個變相的Connection對象
* @author lance
* @create 2018-09-10 10:38
*/
public class MyBatisUtil {
/**聲明ggwhSqlSessionFactory*/
private static SqlSessionFactory sqlSessionFactory;
/* 在靜態代碼塊中初始化SqlSessionFactory*/
static{
//找到mybatis-config.xml配置文件,並構建一個輸入流
//由於配置文件放在resources目錄中,編譯後會存放在classpath中
try {
//通過Resources類從classpath中找到xml文件並讀取,返回一個InputStream的對象
InputStream is =Resources.getResourceAsStream("mybatis-config.xml");
//通過這個輸入流來構建一個SqlSessionFactory對象
//通過上面的輸入流傳遞給builder對象進行解析
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}

/**
* 提供一個獲取SqlSession的方法
*
* */
public static SqlSession getSqlSession(){
//openSession方法構建一個sqlSession對象
return sqlSessionFactory.openSession();
}
public static SqlSession getSqlSession(Boolean falg){
//openSession方法構建一個sqlSession對象
return sqlSessionFactory.openSession(falg);
}

}
3.在傳統的方法中,我們都是用dao方法來實現對數據庫的增刪改查的,而mybatis中通常我們會將dao類變成一個接口類,接口中聲明對數據庫的操作的抽象方法,用一個子類來繼承並實現dao類接口所有的方法

技術分享圖片

接口類:UserDaoInf

package edu.nf.mybatis.dao;

import edu.nf.mybatis.entity.Users;

import java.util.List;

/**
* @Author lance
* */
public interface UserDaoInf {
/**
* 添加用戶
*/
void saveUser(Users users);

/**
* 修改用戶
*/
void updateUser(Users users);

/**
* 刪除用戶
*/
void deleteUser(String uid);

/**
* 根據ID查詢某條用戶數據
*/
Users findUsersById(String uid);

/**
* 查詢所有的用戶信息,保存在一個集合中
*/
List<Users> findAll();
}

接口實現類:UserDaoImpl
package edu.nf.mybatis.dao.impl;

import edu.nf.mybatis.dao.UserDaoInf;
import edu.nf.mybatis.entity.Users;
import edu.nf.mybatis.tools.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

/**
* 描述:
* 接口實現類
* @author lance
* @create 2018-09-10 14:13
*/
public class UserDaoImpl implements UserDaoInf {

@Override
public void saveUser(Users user) {
//獲取SqlSession實例
SqlSession session = MyBatisUtil.getSqlSession();
try {
//方式一:
//獲取相應的Mapper,getMapper方法需要傳遞一個接口的對象
//並且返回的這個Mapper對象同樣是實現了UserDao接口
//這個Mapper對象最核心的作用就是和mybatis的mapper映射配置文件進行關聯
UserDaoInf dao = session.getMapper(UserDaoInf.class);
//調用這個實現類的saveUser方法將數據保存在數據庫中
dao.saveUser(user);
//方式二:
//bint row = session.insert("edu.nf.mybatis.entity.saveUser",user);
//手動提交事務
session.commit();
} catch (Exception e) {
e.printStackTrace();
//在異常加回滾事務
session.rollback();
}finally {
session.close();
}
}

@Override
public void updateUser(Users users) {
SqlSession session = MyBatisUtil.getSqlSession();
try{
UserDaoInf dao = session.getMapper(UserDaoInf.class);
dao.updateUser(users);
session.commit();
}catch (Exception e){
e.printStackTrace();
session.rollback();
}finally {
session.close();
}
}

@Override
public void deleteUser(String uid) {
SqlSession session = MyBatisUtil.getSqlSession();
try{
UserDaoInf dao = session.getMapper(UserDaoInf.class);
dao.deleteUser(uid);
session.commit();
}catch (Exception e){
e.printStackTrace();
session.rollback();
}finally {
session.close();
}
}

@Override
public Users findUsersById(String uid) {
SqlSession session = MyBatisUtil.getSqlSession();
Users user=null;
try {
UserDaoInf dao = session.getMapper(UserDaoInf.class);
user = dao.findUsersById(uid);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}finally {
session.close();
}
return user;
}

@Override
public List<Users> findAll() {
List<Users> list = null;
SqlSession session = MyBatisUtil.getSqlSession();
try {
UserDaoInf dao = session.getMapper(UserDaoInf.class);
list = dao.findAll();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return list;
}
}

測試類,以下方法都經過測試,沒有問題

package eud.nf.mybatis.dao.test;

import edu.nf.mybatis.dao.UserDaoInf;
import edu.nf.mybatis.dao.impl.UserDaoImpl;
import edu.nf.mybatis.entity.Users;
import org.junit.Test;

import java.util.List;

/**
* 描述:
*
* @author lance
* @create 2018-09-10 15:15
*/
public class UserDaoImplTest {
@Test
public void testSaveUsers(){
Users users = new Users();
users.setUid("1010");
users.setUserName("test6");
UserDaoInf dao = new UserDaoImpl();
dao.saveUser(users);
}
@Test
public void testUpdateUsers(){
Users users = new Users();
users.setUid("1006");
users.setUserName("admin");
UserDaoInf dao = new UserDaoImpl();
dao.updateUser(users);
}
@Test
public void testDeleteUsers(){
UserDaoInf dao = new UserDaoImpl();
dao.deleteUser("1010");
}
@Test
public void testFindUsersById(){
UserDaoInf dao = new UserDaoImpl();
Users user = dao.findUsersById("1001");
System.out.println(user.getUid());
System.out.println(user.getUserName());
}
@Test
public void testFindAll(){
UserDaoInf dao = new UserDaoImpl();
List<Users> list = dao.findAll();
for (Users users : list) {
System.out.println(users);
}
}

}
好啦,這就是mybatis的一個簡單使用教程啦

MyBatis框架入門小案例(關於用mybatis框架對數據庫的增刪改查)