mybatis作用
- 【为JDBC提供SQL】mybatis本身用于生成JDBC所需要的各种SQL串。
- 【映射对象、SQL】节省了大量代码,使用户专注于业务实现。
mybatis本身用于生成JDBC所需要的各种SQL串。
Mybatis的基本配置
前期准备: 下载mybatis相应的jar包。
环境搭建流程
- 建立java项目。
- 导入mybatis 及其依赖的jar包,导入JDBC mysql 驱动jar包。
- 在数据库中创建 User表。
- 在java项目中创建 User实体类。
- 在实体类包中,创建 UserMapper.xml(注意格式),用于映射 User表的一些查询结果与User类中字段的关系。
- 在src目录下创建 mybatis.xml(命名可随意),并进行相应的配置:数据库连接,用到的Mapper(如,UserMapper.xml)等。
- 建立工具类,MyBatisUtil,用来与mybatis打交道。(技巧:静态类加载。)
- 测试:基本的连接,查询是否能成功。
细节
创建User表 及实体类
- 数据驱动。
- 为mybatis 准备作用的对象。
- 后面的目的,将利用mybatis将表与实体进行关联。
user表:
CREATE TABLE `user_basic_info` (
`account` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`password` varchar(255) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
java中的User实体类:
public class User {
private String account;
private String name;
private String password;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
配置mybatis
配置说明:
- 【作用:降低代价】使程序员关注于具体业务的实现,减轻操作数据库的代价。
- 【XML配置文件(config)的作用】包含对Mybatis的核心配置(影响范围很大),包括连接数据源、事务作用域、指定映射文件等。(XML解析的入口)
- 【建立映射器关联】通过映射器将 表,sql语句 与 java中的实体建立关联关系。
- 【environments作用】因为程序可能会和多个数据库(如,mysql及oracle),而不同的数据库是需要不同的配置的,所以mabatis定义了环境的概念来对应于不同场景下的数据库连接等,方便用户根据需要进行切换。
- 【environment的结构】包括事务控制、数据源配置等。
- 【映射器mappers】将查询结果映射到java对象。(后面具体介绍)
mybatis-conf.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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="wang/mappers/userMapper.xml"/>
</mappers>
</configuration>
上述配置文件中,db.properties中的内容:
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis
username = root
password = 123456
配置映射 userMapper.xml(任意命名)
配置说明:
- 【映射器作用】沟通SQL查询与 实体之间的桥梁,mybatis自动根据查询的结果自动生成相应的对象。
- 【mapper的namespace属性】用来定义命名空间,如此一来,该mapper下的id便有了更全的全程,形成目录式的树状结构。
- 【字段映射】通过resultMap建立实体类字段与表字段之间的关系。表字段需唯一且出现在SQL的查询结果中,如此一来后面的查询便可根据SQL查询的结果,自动填充相应的java对象。
- 【查询动作】查询动作通常需要使用 select,insert,update,delete这样子的标签。查询动作需要的参数,从外界获得,由相应的java方法传入;而查询动作产生的结果,需要通过 resultXXX 来指定 结果自动封装成何种对象。
userMapper配置示例:
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="wang.entities.userMapper">
<resultMap id="userResultMap" type="wang.entities.User">
<id property="account" column="account" />
<result property="name" column="name"/>
<result property="password" column="password"/>
</resultMap>
<select id="selectUserByAccount" parameterType="int" resultMap="userResultMap">
select * from user where account = #{account}
</select>
</mapper>
在java程序中使用mybatis的功能
- 封装MybatisUtils工具类。
- 使用sqlSession进行数据库操作。
MybatisUtils工具类:
- 负责读取Mybatis相关的配置,加载相应的类。
- sqlSessionFactory 负责生产 sqlSession会话的工厂。sqlSession 负责执行XML中标识的Sql语句,同时向java程序返回相应的对象。
public class MybatisUtils {
private static String mybatisResource = "mybatis-conf.xml";
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory getSqlSessionFactory() {
try {
if (sqlSessionFactory == null) {
InputStream inputStream = Resources.getResourceAsStream(mybatisResource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
return sqlSessionFactory;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
使用mabatis进行sql操作:
方法一:Main1.java代码
public class Main1{
public static void main(String args[]){
SqlSessionFactory sqlSessionFactory = MybatisUtils.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("wang.entities.userMapper.selectUserByAccount", "wang");
} finally {
session.close();
}
}
}
方法二:Main2.java
public class Main2{
public static void main(String args[]){
SqlSessionFactory sqlSessionFactory = MybatisUtils.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
try {
//新的地方:通过接口来规范要求,使得编译时可检查。
UserMapper uMapper = session.getMapper(BlogMapper.class); // 将XML中的sql的ID转化为java中接口的方法。
User user = uMapper.selectUserByAccount("wang");
} finally {
session.close();
}
}
}
UserMapper接口的定义:(接口包名:wang.entities.UserMapper)
public interface UserMapper{
public User selectUserByAccount(String account);
}
mybatis工作流程
- 通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意)
- 通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
- 从当前线程中获取SqlSession对象 (??)
- 事务开始,在mybatis中默认
- 通过SqlSession对象读取StudentMapper.xml映射文件中的操作编号,从而读取sql语句。
- 事务提交,必写。
- 关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收。