Mybatis可以简化JDBC操作,实现数据的持久化
ORM:Object Relational Mapping 建立对象与表的映射关系(对象名与表名;对象属性与表中字段 一 一映射)
ORM:是一个概念,Mybatis是ORM的一个实现/Hibernate
ORM可以使得开发人员像操作对象一样操作数据库表
为什么要使用MyBatis?
• MyBatis是一个半自动化的持久化层框架。
• JDBC – SQL夹在Java代码块里,耦合度高导致硬编码内伤 – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
• Hibernate和JPA – 长难复杂SQL,对于Hibernate而言处理也不容易 – 内部自动生产的SQL,不容易做特殊优化。 – 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
• 对开发人员而言,核心sql还是需要自己优化 • sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
MyBatis开发步骤:
配置Mybatis
conf.xml:配置数据库信息,和 需要加载的映射文件
<environments 中的default属性: 决定配置文件使用的是那一个配置信息(配置信息可以有多个)
1.创建MyBatis全局配置文件(conf.xml)
– MyBatis 的全局配置文件包含了影响 MyBatis 行为甚深 的设置(settings)和属性(properties)信息、如数据 库连接池信息等。指导着MyBatis进行工作。可以 参照官方文件的配置示例。
<?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的default值和environment的id来指定MyBatis运行时的数据库环境-->
<properties resource="db.properties"></properties>
<settings>
<!--开启日志,并指定使用的具体日志-->
<setting name="logImpl" value="LOG4J"/>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭立即加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--设置别名-->
<typeAliases>
<!--设置单个别名(大小写不所谓)-->
<typeAlias type="entity.Person" alias="Person"></typeAlias>
<!--批量设置别名(会将包下的所有类的名字定义为它的别名 即别名就是类名)-->
<package name="entity"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="convertor.BooleanAndIntConvertor" javaType="Boolean" jdbcType="INTEGER"></typeHandler>
</typeHandlers>
<environments default="development">
<!--本台计算机上的环境配置-->
<environment id="development">
<!--事务提交方式:
JDBC:利用JDBC方式处理事务(commit,rollback,close)
MANAGED:将事务交由其他组件去托管(Spring,jobss)默认会关闭连接
-->
<transactionManager type="JDBC"/>
<!--数据库类型
UNPOOLED:传统的JDBC模式(每次访问数据库都需要打开,关闭数据库资源)
POOLED:使用数据库连接池
JNDI:从tomcat中获取一个内置的数据库连接池(数据库连接池)
-->
<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>
<!--部署的项目的计算机的环境配置-->
<environment id="deploy">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--配置数据库信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/person"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<!--测试项目的计算机的环境配置-->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--配置数据库信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/person"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载映射文件-->
<mapper resource="mapper/PersonMapper.xml"/>
<mapper resource="mapper/PersonMapper2.xml"/>
<mapper resource="mapper/PersonMapper3.xml"/>
</mappers>
</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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--配置数据库信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/person"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载映射文件-->
<mapper resource="entity/PersonMapper.xml"/>
</mappers>
</configuration>
2.创建SQL映射文件(xxxMapper.xml)
– 映射文件的作用就相当于是定义Dao接口的实现类如何 工作。这也是我们使用MyBatis时编写的最多的文件。
<?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.xml映射文件的唯一标识-->
<mapper namespace="entity.PersonMapper">
<!--唯一标识符+id定位sql语句
parameterType:参数类型:
resultType: 查询返回类型
参数类型和返回类型,mybatis约定在形式上都只能有一个,多参数可以使用数组
如果输入参数:是简单类型(8个基本类型+String) 是可以使用任何占位符#{xxx}
如果输入参数是对象类型,则必须是对象的属性#{属性名}
输出参数: 如果返回值类型是一个对象,则无论返回一个还是多个,resultType只要写其全类名即可
//事务方式是JDBC,事务要手动提交 sqlSession.commit();
-->
<select id="queryPersonById" resultType="entity.Person" parameterType="int">
SELECT * FROM person WHERE id = #{id}
</select>
<insert id="PersonInsert" parameterType="entity.Person">
INSERT INTO person(name,age) VALUES(#{name},#{age})
</insert>
<delete id="PersonDelete" parameterType="int">
DELETE FROM person WHERE id = #{id}
</delete>
<update id="PersonUpdate" parameterType="entity.Person">
UPDATE person SET name=#{name},age=#{age} WHERE id = #{id}
</update>
<select id="queryAll" resultType="entity.Person">
SELECT * FROM person WHERE id > 0
</select>
</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">
<mapper namespace="entity.PersonMapper">
<select id="queryPersonById" resultType="entity.Person" parameterType="int">
SELECT * FROM person WHERE id = #{id}
</select>
</mapper>
简单示例
一个 SqlSession对象代表和数据库的一次会话。
使用SqlSession根据方法id进行操作
如果是插入修改操作,要手动提交!
public void test() throws IOException {
//加载Mybatis配置文件(为了访问数据库)
Reader reader = Resources.getResourceAsReader("conf.xml");
//SqlSessionFactory,可以通过built的第二个属性指定id值
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//session - 相当于JDBC中的Connection
SqlSession session = sessionFactory.openSession();
String statement = "entity.PersonMapper.queryPersonById";
Person person = session.selectOne(statement,1);
session.close();
System.out.println(person);
}