Mybatis简介
- Mybatis是一个开源免费框架,原名叫做iBatis,2010年在Google code,2013年迁移到GitHub。
- 作用:数据访问层框架,底层是对JDBC的封装。
- 使用Mybatis不需要编写实现类,只需要写需要执行的SQl命令。
Mybatis环境搭建
-
导入jar包
将如下jar包导入lib文件夹中包名 作用 asm-3.3.1.jar Cglib依赖的包 cglib-3.3.1.jar 动态代理包 commons-logging-1.1.1.jar 日志包 javassist-3.17.4-GA.jar 字码解析包,Cglib依赖的包 log4j-1.2.17.jar 日志包 log4j-api-2.0-rc1.jar 日志包 log4j-core-2.0-rc1.jar 日志包 mybatis-3.2.7.jar Mybatis核心包 mybatis-connector-java-5.1.30.jar Mybatis驱动包 slf4j-api-1.7.5.jar 日志包 slf4j-log4j12-1.7.5.jar 日志包 -
新建全局配置文件
- 默认在src下面新建全局配置文件mybatis.xml(编写JDBC四个变量),但其实没有名称和地址要求。
- 为什么放在src下面呢?因为src下面的文件在编译时全会在classes文件夹中,可以通过“classpath:”的方式快速找到文件。
- 在全局配置文件中引入DTD或者schema。
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
- 配置中的所有内容写在
<configuration></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>
<!-- default引用environment的id,是当前使用的环境 -->
<environments default="default">
<environment id="default">
<!--使用原生JDBC事务-->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="lily"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/PeopleMapper.xml"></mapper>
</mappers>
</configuration>
- 建立Mapper包
- 新建Mapper包,在包里新建:实体类+Mapper.xml,用于编写需要执行的SQl命令,可以理解为实现类。其实是Mybatis通过反射和XML解析,转换为实现类。
- 在xml中加入dtd,在mapper.xml中写SQl语句。在xml中的路径都是全路径,因为要通过反射读取。
例子:查找所有的People
<?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="mapper.PeopleMapper">
<!--
id:方法名
parameterType:定义参数类型
resultType:返回值类型
如果方法返回值是list,在resultType中写List泛型。因为
Mybatis对JDBC封装,一行一行读取数据
-->
<select id="selAll" resultType="pojo.People">
select * from people
</select>
</mapper>
- 测试Mybatis
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
//使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//生产SqlSession
SqlSession session=factory.openSession();
List<People> list = session.selectList("mapper.PeopleMapper.selAll");
session.close();
}
全局配置文件详解
- Mapper.xml
- resultType为何是实体类而不是List
因为底层是对JDBC封装,JDBC的rs.ResultSet只能读取一行,而resultType控制的就是这一行是什么类型。 - auto_Mapping
Mybatis是如何知道把哪一列数据和哪个属性对上的呢?- 利用反射,找和列名同名的属性,3.2之前在实体类中找set方法,3.2之后直接找属性。这就是auto_Mapping,自动映射,利用相同的名字自动匹配。
- 如果实体类和数据库不对应,可以在Sql语句中使用别名。
- Mybatis.xml
- 事务管理器
<transactionManager type="JDBC"></transactionManager>
Mybatis只有两种事务管理器类型- JDBC-简单使用了JDBC的提交和回滚,依赖从数据源得到的连接来管理事务范围。
- MANAGED-几乎什么也没做,从不提交或回滚一个连接,会让容器管理事务的整个生命周期,如Spring。
- 数据库连接池
<transactionManager type="JDBC"></transactionManager>- UNPOOLED:不使用数据量连接池,和直接使用JDBC一样
- POOLED:使用数据量连接池
- JNDI:Java命名目录接口,可以调用其他语言写的东西
数据库连接池
数据库连接池就是在内存中开辟一块空间,存放多个数据库连接对象。
JDBC Tomcat Pool,直接由Tomcat产生数据库连接池。
- 连接池对象的状态
- active:当前连接对象被应用程序使用
- Idel:空闲状态,等待应用程序使用
- 数据库连接池的使用
- 在高频访问数据库的时候,使用数据库连接池可以降低服务器系统压力,提升程序运行效率。
- 小型项目不适用数据库连接池。
- 实现JDBC Tomcat Pool的步骤
- 在web项目的META-INF中存放context.xml,然后发布到Tomcat即可
- 变量意义
- auth:管理者,一般为Container(Tomcat)
- maxWait:拿取对象最大等待时间,单位为毫秒
- type:数据源
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ssm"
username="root"
password="smallming"
maxActive="50"
maxIdle="20"
name="test"
auth="Container"
maxWait="10000"
type="javax.sql.DataSource"
/>
</Context>
三种查询方式
- selectList ():返回值为List<resuleType 属性控制>,适用于查询结果都需要遍历的时候
- selectOne:适用于返回值只是变量或者一行数据
- selectMap: 适用于需要在查询结果中通过某列的值取到这行数据
mapper.xml
<mapper namespace="a.b" >
<select id="selAll" resultType="com.bjsxt.pojo.Flower">
select id,name name123,price,production from flower
</select>
<select id="selById" resultType="int">
select count(*) from flower
</select>
<select id="c" resultType="com.bjsxt.pojo.Flower">
select id,name name123,price,production from flower
</select>
</mapper>
Test.java
public class Test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("myabtis.xml");
//使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//生产SqlSession
SqlSession session=factory.openSession();
List<Flower> list = session.selectList("a.b.selAll");//selectList
for (Flower flower : list) {
System.out.println(flower.toString());
}
int count = session.selectOne("a.b.selById");//selectOne
System.out.println(count);
//把数据库中哪个列的值当作map的key
Map<Object, Object> map = session.selectMap("a.b.c", "name123");//selectMap
System.out.println(map);
session.close();
}
}