編寫工具類獲取sqlsession
使用Mybatis的API來創建一個工具類,通過mybatis配置文件與數據庫的信息,得到Connection對象
public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; //加載配置文件 mybatis.xml static { try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } //禁止外界通過new創建 private MybatisUtil() {} //獲取 SqlSession public static SqlSession getSqlSession() { //從當前線程中獲取 SqlSession 對象 SqlSession sqlSession = threadLocal.get(); // 如果獲取的SqlSession為空,則從已初始化的sqlSessionFactory中獲取 if (sqlSession == null) { sqlSession=sqlSessionFactory.openSession(); //將SqlSession對象與當前線程綁定 threadLocal.set(sqlSession); } return sqlSession; } //關閉 SqlSession,並解除與當前線程綁定 public static void closeSqlSession(){ //從當前線程獲取 SqlSession 對象 SqlSession sqlSession=threadLocal.get(); // 如果獲取到的 SqlSession不為空,則關閉,並解除與當前線程的綁定,讓GC盡早回收 if(sqlSession!=null){ sqlSession.close(); threadLocal.remove(); } } }
創建實體類POJO
@Getter @Setter @AllArgsConstructor @NoArgsConstructor public class Cities { private int id; private String city; private String province; private String country; }
編寫Mapper接口(DAO)
public interface CitiesMapper { void insert(Cities cities) throws Exception; Cities selectById(int id) throws Exception; }
Mybatis配置文件
數據庫屬性文件
在resources下創建數據庫屬性文件db.properties,配置數據庫的地址及賬號密碼
mysql.driver = com.mysql.jdbc.Driver mysql.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 mysql.usercity = root mysql.password = 123456
mybatis配置文件
在resources下創建mybatis的配置文件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> <!-- 加載類路徑下的屬性文件 --> <properties resource="db.properties"/> <!-- 設置一個默認的連接環境信息 --> <environments default="mysql_dev"> <!-- 連接環境信息,設置一個任意唯一的id --> <environment id="mysql_dev"> <!-- mybatis使用jdbc事務管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用連接池方式獲取連接 --> <dataSource type="pooled"> <!-- 配置連接數據庫的4個必要屬性,從db.properties中獲取 --> <property city="driver" value="${mysql.driver}"/> <property city="url" value="${mysql.url}"/> <property city="usercity" value="${mysql.usercity}"/> <property city="password" value="${mysql.password}"/> </dataSource> </environment> </environments> <!-- 關聯 實體類與表的映射文件,resource為映射文件全路徑名稱 --> <mappers> <mapper resource="mappers/CitiesMapper.xml"/> </mappers> </configuration>
實體與表的映射文件Mapper.xml
在resources下創建一個文件夾mappers(所有映射文件統一管理),在mappers下創建實體與表的映射關系文件CitiesMapper.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"> <!-- cityspace是命名空間,為Mapper接口的全限定名--> <mapper cityspace="mybatis_test.CitiesMapper"> <!-- resultMap標簽:映射實體類與表 type屬性:表示實體類全路徑名 id屬性:為實體類與表的映射取一個任意且唯一的名字 --> <resultMap id="citiesMap" type="mybatis_test.Cities"> <!-- id標簽:映射表的主鍵 result標簽:映射表的非主鍵字段 property:實體類的屬性名 column:表的字段名 --> <id column="id" property="id"/> <result column="city" property="city"/> <result column="province" property="province"/> <result column="country" property="country"/> </resultMap> <!-- 在mybatis中使用 #{} 作為占位符,#{} 實際就是調用的get() parameterType為DAO層(Mapper接口)的方法指定傳入參數類型,為實體類全路徑 --> <insert id="insert" parameterType="mybatis_test.Cities"> insert into cities values(#{id},#{city},#{province},#{country}); </insert> </mapper>
通過Mapper接口執行Sql
Mybatis中的事務是默認開啟的,因此我們在完成操作以后,需要我們手動去提交事務!
public class CitiesTest { @Test public void testInsert(){ Cities cities=new Cities(2,"mianyang","chengdu","cn"); //得到連接對象 SqlSession sqlSession= MybatisUtil.getSqlSession(); //傳入 Mapper接口類,獲取Mapper接口的代理對象 CitiesMapper citiesMapper=sqlSession.getMapper(CitiesMapper.class); try { //執行Mapper接口的方法,實際為調用xml映射文件對應的sql(Mapper.xml的命令空間.SQL執行動作的id 調用對應的映射文件中的SQL)
(實際為調用sqlSession.insert()) citiesMapper.insert(cities); //Mybatis中的事務默認開啟,需要手動commit sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); //出現異常回滾 sqlSession.rollback(); }finally { //關閉sqlSession MybatisUtil.closeSqlSession(); } } }
文件結構
-
實體類POJO
Cities
和 Mapper接口類(DAO)CitiesMapper
在同一包下 -
數據庫配置文件
db.properties
和mybatis配置文件mybatis.xml
都放在resources下