1.为什么使用mybatis
在用传统JDBC开发的代码如下:
我们可以看出,在JDBC开发中我们需要自己连接数据库,获取链接,编写sql语句,对sql语句进行预编译,之后去数据库查询返回一个ResultSer结果集,之后手动关闭各种连接…可以看出极其的麻烦。
而mybatis就是简化了这一切操作,我们只需要编写sql语句就行了,剩下的操作交给mybatis去处理。
2.怎么使用mybatis
!!!!!开始之前导入mybatis的jar包和mysql连接的jar包
①编写mybatis连接数据库等的配置文件SqlMapConfig.xml
environment标签:
properties标签
<!--指定使用的properties文件-->
<properties resource="jdbc.properties"></properties>
typeAlias标签
<!--别名配置-->
<typeAliases>
<!--typeAlias需要指定类以及对应的别名-->
<!--type表示类名, alisa表示别名-->
<!--<typeAlias type="com.lepeng.pojo.User" alias="user"></typeAlias>-->
<!--指定当前包下的所有的实体类设置别名 默认别名:简单类名(不包含包名)-->
<package name="com.lepeng.pojo"></package>
</typeAliases>
目的是在映射文件直接使用别名:
<!--根据id查询-->
<select id="findById" parameterType="int" resultType="user">
SELECT * FROM user WHERE id=#{id}
</select>
mappers标签
1. 使用相对于类路径的资源引用,例如:
<mapper resource="com/lepeng/dao/Usermapper.xml"/>
2. 扫描接口方式,例如:
<mapper class="com.lepeng.dao.Usermapper"/>
3. 将包下的接口,例如:
<package name="com.lepeng.dao"/>
②再看一下mybatis的API:
1)Resources
//专门用于加载mybatis核心配置文件,他的作用和类加载器一致,从类路径下获取。
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
2)SqlSessionFactoryBuilder
//SqlSessionFactoryBuilder工厂的构建者,里面的build方法可以创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
3)SqlSessionFactory
sqlSessionFactory是工厂对象,用来生产SqlSession对象,以项目应该只有一个SqlSession工厂
获取SqlSession的方法
获取一个SessionSql,该方式获取的SqlSession执行完sql后需要手动提交事务。
SqlSession openSession();【推荐】
如果想要自动提交,可以使用下面的
SqlSession openSession(boolean autoCommit);
参数为true:表示会自动提交事务
参数为false(默认值):需要手动提交
4)SqlSession
* 是mybatis核心对象,用来执行sql语句
每一个线程独有,每次用使用打开,使用完毕归还
* 方法
<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);删除
参数statement:执行映射文件中的哪个sql语句。格式命名空间.id组成的唯一表示。
参数parameter:执行sql语句时传递的参数。也可以不传递参数。
* 事务
void commit(); 提交事务
void rollback(); 回滚事务
③映射配置文件
3.传统mybatis的开发
①创建UserMapper类
/*
Dao层
*/
public class UserMapper {
/*
定义查询所有用户的方法
*/
public List<User> findAll() throws IOException {
//加载核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List<User> list = sqlSession.selectList("userMapper.findAll");
//释放资源
sqlSession.close();
//返回结果
return list;
}
}
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">
<!--namespace是命名空间,可以看成是这个文件的标识-->
<mapper namespace="userMapper">
<!--查询所有-->
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
</mapper>
模拟service层
public class UserMapperTest extends BaseMapperTest{
@Test
public void testFindAll() throws IOException {
//创建UserMapper对象
UserMapper userMapper = new UserMapper();
//调用findAll方法进行查询
List<User> list = userMapper.findAll();
//输出
for (User user : list) {
System.out.println(user);
}
}
}
可以看出我们需要根据映射文件的命名空间+查询语句标识ID才能够执行,所以开发了基于接口的方式进行dao层的开发
4.基于接口的dao层开发
如果想要使用这种方式去开发,必须要遵循mybatis定义的规范。
- 接口的全限定类名必须和映射文件中的namespace一致。
- 接口的方法名必须和映射文件中标签的id属性保持一致。
- 接口中方法的参数要和statement的parameterType保持一致
- 接口中方法的返回值要和statement的resultType一致。
statement指的是select,insert,update,delete标签
创建UserMapper接口
public interface UserMapper {
//定义方法,用来查询所有用户(方法名必须和statement的id保持一致)
List<User> findAll();
}
编写UserMapper.xml映射文件
<!--namespace是命名空间,可以看成是这个文件的标识-->
<mapper namespace="com.lepeng.dao.UserMapper">
<!--查询所有-->
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
</mapper>
模拟service层
public class UserMapperTest{
//查询所有
@Test
public void testFindAll() {
//加载核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用SqlSession中的getMapper方法,里面传递接口的Class,程序可以直接帮我们以动态代理的方式创建该接口的实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用findAll查询所有
List<User> list = userMapper.findAll();
for (User user : list) {
System.out.println(user);
}
}
}