3.1 快速⼊⻔
MyBatis
官⽹地址:
http://www.mybatis.org/mybatis-3/
3.1.1
开发步骤:
①添加
MyBatis
的坐标
②创建
user
数据表
③编写
User
实体类
④编写映射⽂件
UserMapper.xml
⑤编写核⼼⽂件
SqlMapConfig.xml
⑥编写测试类
3.1.1
环境搭建:
1)
导⼊
MyBatis
的坐标和其他相关坐标
<properties><project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding><maven.compiler.encoding> UTF-8 </maven.compiler.encoding><java.version> 1.8 </java.version><maven.compiler.source> 1.8 </maven.compiler.source><maven.compiler.target> 1.8 </maven.compiler.target></properties><!--mybatis 坐标 --><dependency><groupId> org.mybatis </groupId><artifactId> mybatis </artifactId><version> 3.4.5 </version></dependency><!--mysql 驱动坐标 --><dependency><groupId> mysql </groupId><artifactId> mysql-connector-java </artifactId><version> 5.1.6 </version><scope> runtime </scope></dependency><!-- 单元测试坐标 --><dependency><groupId> junit </groupId><artifactId> junit </artifactId><version> 4.12 </version><scope> test </scope></dependency><!-- ⽇志坐标 --><dependency><groupId> log4j </groupId><artifactId> log4j </artifactId><version> 1.2.12 </version></dependency>
创建数据库表,使用原来zdy_mybatis的user表
3)
编写
User
实体
package com.ch.pojo; public class User { private Integer id; private String username; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; } }
4)编写UserMapper映射⽂件
<?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="user"> <!--namespace:命名空间,与id组成sql的唯一标识 resultType:表明返回值类型 --> <select id="findAll" resultType="com.ch.pojo.User"> select * from user </select> </mapper>
5) 编写MyBatis核⼼⽂件
<?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:运行环境,配置开发,测试,生产环境--> <environments default="development"> <environment id="development"> <!--transactionManager:当前事务交由jdbc管理--> <transactionManager type="JDBC"></transactionManager> <!-- POOLED:当前使用mybatis提供的连接池 UNPOOLED:不使用连接池,每一次都新建一个连接--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///zdy_mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 引入映射配置文件--> <mappers> <mapper resource="UserMapper.xml"></mapper> </mappers> </configuration>
6) 编写测试代码
package com.ch.test; import com.ch.pojo.User; 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 org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MybatisTest { @Test public void test() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> userList = sqlSession.selectList("user.findAll"); for (User user:userList) { System.out.println("用户数据"+user); } } }
运行结果
用户数据User{id=1, username='zhangsan'}
用户数据User{id=2, username='lisi'}
3.1.4 MyBatis
的增删改查操作
MyBatis
的插⼊数据操作
1)
编写
UserMapper
映射⽂件
<insert id="saveUser" parameterType="com.ch.pojo.User"> insert into user values(#{id},#{username}) </insert>
2)
编写插⼊实体
User
的代码
@Test public void testInsert() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(4); user.setUsername("test"); sqlSession.insert("user.saveUser",user); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close(); }
执行成功
3)
插⼊操作注意问题
•
插⼊语句使⽤
insert
标签
•
在映射⽂件中使⽤
parameterType
属性指定要插⼊的数据类型
•Sql
语句中使⽤
#{
实体属性名
}
⽅式引⽤实体中的属性值
•
插⼊操作使⽤的
API
是
sqlSession.insert(“
命名空间
.id”,
实体对象
);
•
插⼊操作涉及数据库数据变化,所以要使⽤
sqlSession
对象显示的提交事务,即
sqlSession.commit()
3.1.5 MyBatis
的修改数据操作
1)
编写
UserMapper
映射⽂件
<!-- 修改--> <update id="updateUser" parameterType="com.ch.pojo.User"> update user set username=#{username} where id=#{id} </update>
2)
编写修改实体
User
的代码
@Test public void testUpdate() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(2); user.setUsername("修改"); sqlSession.update("user.updateUser",user); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close(); }
测试结果
3)
修改操作注意问题
•
修改语句使⽤
update
标签
•
修改操作使⽤的
API
是
sqlSession.update(“
命名空间
.id”,
实体对象
);
3.1.6 MyBatis
的删除数据操作
1)
编写
UserMapper
映射⽂件
<delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{abc} </delete>
2)
编写删除数据的代码
@Test public void testDelete() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("user.deleteUser",1); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close(); }
测试结果
3)
删除操作注意问题
•
删除语句使⽤
delete
标签
•Sql
语句中使⽤
#{
任意字符串
}
⽅式引⽤传递的单个参数
•
删除操作使⽤的
API
是
sqlSession.delete(“
命名空间
.id”,Object);
3.1.5 MyBatis
的映射⽂件概述
![](https://i-blog.csdnimg.cn/blog_migrate/b61f0c864018576772ef408f3d5d9147.png)
3.1.6
⼊⻔核⼼配置⽂件分析:
MyBatis
核⼼配置⽂件层级关系
![](https://i-blog.csdnimg.cn/blog_migrate/2973b2781ec0b20cd78b6388534e0340.png)
MyBatis
常⽤配置解析
1)environments
标签
数据库环境的配置,⽀持多环境配置
![](https://i-blog.csdnimg.cn/blog_migrate/44a1909d20fca525b32593a9cf50e012.png)
其中,事务管理器(
transactionManager
)类型有两种:
•JDBC
:这个配置就是直接使⽤了
JDBC
的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作
⽤域。
•MANAGED
:这个配置⼏乎没做什么。它从来不提交或回滚⼀个连接,⽽是让容器来管理事务的整个⽣
命周期(⽐如
JEE
应⽤服务器的上下⽂)。 默认情况下它会关闭连接,然⽽⼀些容器并不希望这样,因
此需要将
closeConnection
属性设置为
false
来阻⽌它默认的关闭⾏为。
其中,数据源(
dataSource
)类型有三种:
•UNPOOLED
:这个数据源的实现只是每次被请求时打开和关闭连接。
•POOLED
:这种数据源的实现利⽤
“
池
”
的概念将
JDBC
连接对象组织起来。
•JNDI
:这个数据源的实现是为了能在如
EJB
或应⽤服务器这类容器中使⽤,容器可以集中或在外部配
置数据源,然后放置⼀个
JNDI
上下⽂的引⽤。
2)mapper
标签
该标签的作⽤是加载映射的,加载⽅式有如下⼏种
• 使⽤相对于类路径的资源引⽤,例如:<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>• 使⽤完全限定资源定位符( URL ),存在磁盘的哪个位置,用的很少,例如:<mapper url="file:///var/mappers/AuthorMapper.xml"/>• 使⽤映射器接⼝实现类的完全限定类名,例如:<mapper class="org.mybatis.builder.AuthorMapper"/>• 将包内的映射器接⼝实现全部注册为映射器,例如:<package name="org.mybatis.builder"/>
3.1.7 Mybatis
相应
API
介绍
SqlSession
⼯⼚构建器
SqlSessionFactoryBuilder
常⽤
API
:
SqlSessionFactory build(InputStream inputStream)
通过加载
mybatis
的核⼼⽂件的输⼊流的形式构建⼀个
SqlSessionFactory
对象
//Resource:工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //解析配置文件,创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //生产了sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();//默认开启了一个事务,但是不会自动提交 //在增删改时要手动提交事务,传入参数为true的时候会自动提交事务 //4.sqlSession调用方法:查询所有调用selectList,查询单个调用selectOne,添加:insert 修改调用update,删除调用delete List<User> userList = sqlSession.selectList("user.findAll");
其中,
Resources
⼯具类,这个类在
org.apache.ibatis.io
包中。
Resources
类帮助你从类路径下、⽂
件系统或⼀个
web URL
中加载资源⽂件。
SqlSession
⼯⼚对象
SqlSessionFactory
SqlSessionFactory
有多个个⽅法创建
SqlSession
实例。常⽤的有如下两个:
![](https://i-blog.csdnimg.cn/blog_migrate/c8b2eba2a062bb99694d0ce200446b92.png)
SqlSession
会话对象
SqlSession
实例在
MyBatis
中是⾮常强⼤的⼀个类。在这⾥你会看到所有执⾏语句、提交或回滚事务
和获取映射器实例的⽅法。
执⾏语句的⽅法主要有:
< T > T selectOne ( String statement , Object parameter )< E > List < E > selectList ( String statement , Object parameter )int insert ( String statement , Object parameter )int update ( String statement , Object parameter )int delete ( String statement , Object parameter )
操作事务的⽅法主要有:
void commit ()void rollback ()
3.2 Mybatis
的
Dao
层实现
3.2.1
传统开发⽅式
编写
UserDao
接⼝
public interface IUserDao { //查询所有用户 public List<User> findAll(); }
编写
UserDaoImpl
实现
package com.ch.dao; import com.ch.pojo.User; 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; import java.util.List; public class UserDaoImpl implements IUserDao{ @Override public List<User> findAll() throws IOException { //Resource:工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //解析配置文件,创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //生产了sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();//默认开启了一个事务,但是不会自动提交 //在增删改时要手动提交事务,传入参数为true的时候会自动提交事务 //4.sqlSession调用方法:查询所有调用selectList,查询单个调用selectOne,添加:insert 修改调用update,删除调用delete List<User> userList = sqlSession.selectList("user.findAll"); for (User user:userList) { System.out.println("用户数据"+user); } return userList; } }
测试传统方式
@Test public void test5() throws IOException { IUserDao userDao=new UserDaoImpl(); List<User> all = userDao.findAll(); System.out.println("查询全部数据"+all); }
测试结果锅
查询全部数据[User{id=2, username='修改'}, User{id=4, username='test'}]
3.2.2
代理开发⽅式
代理开发⽅式介绍
采⽤
Mybatis
的代理开发⽅式实现
DAO
层的开发,这种⽅式是我们后⾯进⼊企业的主流。
Mapper
接⼝开发⽅法只需要程序员编写
Mapper
接⼝(相当于
Dao
接⼝),由
Mybatis
框架根据接⼝
定义创建接⼝的动态代理对象,代理对象的⽅法体同上边
Dao
接⼝实现类⽅法。
Mapper
接⼝开发需要遵循以下规范:
1) Mapper.xml
⽂件中的
namespace
与
mapper
接⼝的全限定名相同
2) Mapper
接⼝⽅法名和
Mapper.xml
中定义的每个
statement
的
id
相同
3) Mapper
接⼝⽅法的输⼊参数类型和
mapper.xml
中定义的每个
sql
的
parameterType
的类型相同
4) Mapper
接⼝⽅法的输出参数类型和
mapper.xml
中定义的每个
sql
的
resultType
的类型相同
编写
UserMapper
接
![](https://i-blog.csdnimg.cn/blog_migrate/a675969834a75bc723c9e0b9a53389bb.png)
将原来的映射文件修改成如下,namespace修改成DAO的全路径
![](https://i-blog.csdnimg.cn/blog_migrate/6e145b19e4d83761f7fc0d36c3d610ae.png)
代理方式测试
@Test public void test5() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); IUserDao userDao=sqlSession.getMapper(IUserDao.class); List<User> all = userDao.findAll(); System.out.println("用户信息"+all); sqlSession.close(); }