MyBatis(一)

·  阅读 118

Mybatis简介

  1. Mybatis是一个开源免费框架,原名叫做iBatis,2010年在Google code,2013年迁移到GitHub。
  2. 作用:数据访问层框架,底层是对JDBC的封装。
  3. 使用Mybatis不需要编写实现类,只需要写需要执行的SQl命令。

Mybatis环境搭建

  1. 导入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 日志包
  2. 新建全局配置文件

  • 默认在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>
复制代码
  1. 建立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>
复制代码
  1. 测试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();
	}
复制代码

全局配置文件详解

  1. Mapper.xml
  • resultType为何是实体类而不是List
    因为底层是对JDBC封装,JDBC的rs.ResultSet只能读取一行,而resultType控制的就是这一行是什么类型。
  • auto_Mapping
    Mybatis是如何知道把哪一列数据和哪个属性对上的呢?
    • 利用反射,找和列名同名的属性,3.2之前在实体类中找set方法,3.2之后直接找属性。这就是auto_Mapping,自动映射,利用相同的名字自动匹配。
    • 如果实体类和数据库不对应,可以在Sql语句中使用别名。
  1. Mybatis.xml
  • 事务管理器
    <transactionManager type="JDBC"></transactionManager>
    Mybatis只有两种事务管理器类型
    • JDBC-简单使用了JDBC的提交和回滚,依赖从数据源得到的连接来管理事务范围。
    • MANAGED-几乎什么也没做,从不提交或回滚一个连接,会让容器管理事务的整个生命周期,如Spring。
  • 数据库连接池
    <transactionManager type="JDBC"></transactionManager>
    • UNPOOLED:不使用数据量连接池,和直接使用JDBC一样
    • POOLED:使用数据量连接池
    • JNDI:Java命名目录接口,可以调用其他语言写的东西

数据库连接池

数据库连接池就是在内存中开辟一块空间,存放多个数据库连接对象。
JDBC Tomcat Pool,直接由Tomcat产生数据库连接池。

  1. 连接池对象的状态
  • active:当前连接对象被应用程序使用
  • Idel:空闲状态,等待应用程序使用
  1. 数据库连接池的使用
  • 在高频访问数据库的时候,使用数据库连接池可以降低服务器系统压力,提升程序运行效率。
  • 小型项目不适用数据库连接池。
  1. 实现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>
复制代码

三种查询方式

  1. selectList ():返回值为List<resuleType 属性控制>,适用于查询结果都需要遍历的时候
  2. selectOne:适用于返回值只是变量或者一行数据
  3. 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();
	}
}

复制代码
分类:
阅读
标签:
分类:
阅读
标签: