编写工具类获取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下