一:工具版本
MySQL驱动:5.1.48
MySQL:5
Mybatis:3.4.6
二:Mybatis开发回顾
1:Mybatis概念
Mybatis是一个半自动的ORM框架,解决的数据库的访问问题,是JDBC技术的封装
2:Mybatis搭建开发环境
1):引入依赖
<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.48</version> </dependency>
2):核心配置文件
准备核心配置文件都需要进行如下操作:
1. 数据源的设置 environments
2. 类型别名
3. mapper文件的注册
4. 编写Mapper文件
3):初始化配置
mybatis-config.xml
配置 environment
缩略版如下:
<?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> </plugins> </environments> </mappers> </configuration>
详细版如下:
<?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> <typeAlias type="com.baizhiedu.entity.User" alias="User"/> <typeAlias type="com.baizhiedu.entity.Account" alias="Account"/> </typeAliases> <plugins> <plugin interceptor="com.baizhiedu.plugins.LockInterceptor"/> </plugins> <environments default="default"> <environment id="default"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </dataSource> </environment> </environments> <mappers> <!--<package name=""--> <mapper resource="UserDAOMapper.xml"/> <mapper resource="AccountDAOMapper.xml"/> </mappers> </configuration>
4):开发步骤
- entity
- 类型别名
- table
- DAO接口
- Mapper文件
- Mapper文件的注册
- API编程
- 开发步骤 7步
三:一些细节说明
1:如何访问指定数据库
我们不指定的话,访问的就是默认数据库,指定databaseId就会访问指定数据源库
我们调用dao层中的方法执行对应的SQL语句的时候,到底会访问哪个数据库呢?这个是由决定的,我们把那个搞成默认的,他就访问的是哪个数据库。
<insert id="save" parameterType="Account" databaseId="default"> insert into t_account (accountNo,balance) values(#{accountNo},#{balance}) </insert>
如果在Mybatis当中涉及到多数据源
事务不好控制了。
XXXservice当中涉及到了ADAO.m1() 使用的default数据源,BDAO.m2中使用的是oRABLE数据源,怎么办
2:配置别名的作用
<typeAliases> <typeAlias type="com.baizhiedu.entity.User" alias="User"/> <typeAlias type="com.baizhiedu.entity.Account" alias="Account"/> </typeAliases>
配置别名的作用就是在Mapper文件当中无需再写全限定名
3:Mapper.xml注册
<mappers> <!--<package name=""--> <mapper resource="UserDAOMapper.xml"/> <mapper resource="AccountDAOMapper.xml"/> </mappers>
4:API编写
@Test public void test1() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserDAO userDAO = sqlSession.getMapper(UserDAO.class); List<User> users = userDAO.queryAllUsersByPage(); for (User user : users) { System.out.println("user = " + user); } }
或者像接下来这么写
@Test public void test2() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //namespace+id List<User> users = sqlSession.selectList("com.baizhiedu.dao.UserDAO.queryAllUsers"); /* sqlSession.selectOne() sqlSession.insert() sqlSession.delete() sqlSession.update()*/ //这些方法是重载的,多个参数的是因为SQL当中需要传参。 for (User user : users) { System.out.println("user = " + user); } }
四:核心代码分析
核心代码实例:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); 两种方式功能等价 实现效果 区别 那种方式好?第一种方式好 表达概念更清晰 第一种开发,本质上就是对第二种开发的封装。(代理设计模式) UserDAO userDAO = sqlSession.getMapper(UserDAO.class); List<User> users = userDAO.queryAllUsers(); List<User> users = sqlSession.selectList("com.baizhiedu.dao.UserDAO.queryAllUsers"); String name = "huxz"; public class User{ private String name = "huxz"; } Mybatis刚刚诞生的时候,对于数据库的操作都是第二种,没有第一种,在后续版本更迭的时候, 才有的第一种。第二种,本质上就是将第二种的实现方式进行了封装。通过代理设计模式进行封装的。