day1
项目名 02mybatis_crud
三、深入了解配置文件
1.mybatis.cfg.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>
<!-- environments 指 mybatis可以配置多个环境 默认的是development所在的环境
每个环境都可以创建对应的sqlsesiionfactory
-->
<environments default="development">
<environment id="development">
<!-- 事务分为两种,一种是jdbc,一种是manager
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
-->
<transactionManager type="JDBC"/>
<!-- 数据源类型:
UNPOOLED -这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。(每一次都申请再释放,比较耗费资源)
POOLED这种数据源的实现利用“数据库连接池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 定义sql语句映射文件(可能有多个) -->
<mappers>
<mapper resource="com/mybatis/entity/user.mapper.xml"/>
</mappers>
</configuration>
具体的信息可查看官方源文档
- mapper文件
<?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命名空间(防止sql语句的id重名)
namespace命名 : 包名 + 类名 / 包名 + mapper文件名
parameterType 指sql语句参数类型
resultType 指返回结果的类型
useGeneratedKeys 使用自增主键
-->
<mapper namespace="com.mybatis.entity.UserMapper">
<!-- 查询单个用户
id在该文件中唯一, 根据传入的id来找对应的sql执行语句
-->
<select id="selectUser" resultType="com.mybatis.entity.User">
select * from user where id = #{id}
</select>
<select id="selectAll" resultType="com.mybatis.entity.User">
select * from user
</select>
<insert id="addUser" parameterType="com.mybatis.entity.User" useGeneratedKeys="true">
insert into user(name,pwd) values(#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.mybatis.entity.User">
update user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<delete id="deleteUser">
delete from user where id=#{id}
</delete>
</mapper>
- 工作原理
MyBatisUtil.java
package com.mybatis.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis.cfg.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
public static SqlSession getSession() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}
首先通过读取mybatis.cfg.xml核心配置文件创建sqlSessionFactory,通过sqlSessionFactory的openSession方法获取sqlSession。
然后 sqlSession通过id找到对应的sql语句,执行相关操作。
举一个简单的应用层实例(查询单个信息)
public class UserDao {
public User getById(int id) throws IOException{
SqlSession session = MyBatisUtil.getSession();
User user = (User) session.selectOne("com.mybatis.entity.UserMapper.selectUser",id);
session.close();
return user;
}
}
-
XML配置文件优化
导入properties配置文件a). 在src下加入db.properties文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test?useSSL=false
username = root
password = 123456
b). 在mybatis.cfg.xml中添加properties标签
<configuration>
<!-- environments 指 mybatis可以配置多个环境 默认的是development所在的环境
每个环境都可以创建对应的sqlsesiionfactory
-->
<properties resource="db.properties" />
<environments default="development">
<environment id="development">
<!-- 事务分为两种,一种是jdbc,一种是manager
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
-->
<transactionManager type="JDBC"/>
<!-- 数据源类型:
UNPOOLED -这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。(每一次都申请再释放,比较耗费资源)
POOLED这种数据源的实现利用“数据库连接池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
- 别名的优化
<typeAliases >
<!-- 为指定类型指明别名 使得在mapper映射文件中可以简化引用 -->
<typeAlias type="com.mybatis.entity.User" alias="User"></typeAlias>
</typeAliases>
<typeAliases >
<!-- 为某个包下所有类指定别名 默认别名是对应的类名 -->
<package name="com.mybatis.entity" />
</typeAliases>