传统JDBC的弊端
- jdbc 底层没有用连接池、操作数据库需要频繁的创建和关联链接。消耗很大的资源
- 写原生的 jdbc 代码在 java 中,一旦我们要修改 sql 的话,java 需要整体编译,不利于系 统维护
- 使用 PreparedStatement 预编译的话对变量进行设置 123 数字,这样的序号不利于维护
- 返回 result 结果集也需要硬编码。
Mybatis
MyBatis介绍
中文官网:http://www.mybatis.org/mybatis-3/zh/index.html
Mybatis 是一个ORM框架 (Object relation mapping 对象关系映射 )
MyBatis快速开始
1、maven
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2、mybatis-config.xml
XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3、mapper.xml
<?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="com.pratise.mybatis.UserMapper">
<select id="selectUser" resultType="com.pratise.mybatis.pojo.User">
select * from cf_user AS user where id = #{id}
</select>
<insert id="insertUser">
insert into cf_user(name,age,tel) value (#{name},#{age},#{tel})
</insert>
</mapper>
Mybatis 全局配置详解
1、概述
(1)SqlMapConfig.xml的配置内容和顺序如下(顺序不能乱):
- Properties(属性)
- Settings(全局参数设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境信息集合)
- environment(单个环境信息)
- transactionManager(事物)
- dataSource(数据源)
- environment(单个环境信息)
- mappers(映射器)
(2)具体参数解释与使用可参考 这儿,
2、Mybatis 之 annotation:
public interface UserMapper {
@Select("select * from user where id=#{id}")
public User selectUser(Integer id);
}
<mapper class="com.jiagouedu.mybatis.mapper.UserMapper"></mapper>
3、问题收集
Mybatis 之注解和 xml 优缺点:
- Xml:增加 xml 文件、麻烦、条件不确定、容易出错,特殊字符转义
- 注释:不适合复杂 sql,收集 sql 不方便,重新编译
Mybatis 之#与$区别:
- 都是参数标记符号
- #预编译,防止 sql 注入(推荐)
- $可以 sql 注入,代替作用
Mybatis 之 parameterType 与 parameterMap 区别:
- 通过 parameterType 指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型
- parameterMap通常应用于mapper中有多个参数要传进来时,表示将查询结果集中列值的类型一一映射到java对象属性的类型上,在开发过程中不推荐这种方式。
Mybatis 之 resultType 与 resultMap 区别:
- 使用 resultType 进行输出映射,只有查询出来的列名和 pojo 中的属性名一致,该列才可以 映射成功。
- mybatis 中使用 resultMap 完成高级输出结果映射。
Mybatis 逆向工程
官方网址:http://www.mybatis.org/generator/configreference/javaClientGenerator.html
什么是逆向工程:
MyBatis 的一个主要的特点就是需要程序员自己编写 sql,那么如果表太多的话,难免会很 麻烦,所以 mybatis 官方提供了一个逆向工程,可以针对单表自动生成 mybatis 执行所需要 的代码(包括 mapper.xml、mapper.java、po…)。一般在开发中,常用的逆向工程方式是 通过数据库的表生成代码
1、在maven中添加插件 引入 jar
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
</dependencies>
<configuration>
<!-- 打印执行过程 -->
<verbose>true</verbose>
<!-- 允许覆盖生成的文件 -->
<overwrite>true</overwrite>
<!-- 配置文件路径 -->
<configurationFile>${basedir}/src/main/resources/mybatis/generatorConfig.xml</configurationFile>
<!-- 生成部分mapper,指定table名字 -->
<tableNames>
tb_user
</tableNames>
</configuration>
</plugin>
2、配置 mybatis-genrtator.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 引入配置文件,非必须 -->
<properties resource="mybatis/db.properties"/>
<!-- 指定数据库驱动jar地址,可以pom.xml中设置 -->
<!--<classPathEntry location="${user.home}/.m2/repository/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar"/>-->
<!-- 配置环境
defaultModelType:指定生成模型类型策略
1.conditional:这是默认值,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个
表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
2.flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。
3.hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然
后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。 -->
<context id="mysql" defaultModelType="flat">
<!-- 是否取消注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection driverClass="${jdbc.driverClassName}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}" password="${jdbc.password}"/>
<!-- 生成实体类 -->
<javaModelGenerator targetPackage="com.learn.spring.server.model"
targetProject="src/main/java"/>
<!-- 生成maper.xml文件 -->
<sqlMapGenerator targetPackage="mybatis/mapper"
targetProject="src/main/resources"/>
<!-- 生成dao接口 -->
<javaClientGenerator targetPackage="com.learn.spring.server.dao"
targetProject="src/main/java" type="XMLMAPPER"/>
<!-- 配置表信息,不生成帮助类examples-->
<table schema="" tableName="tb_user" domainObjectName="UserDO"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false"/>
</context>
</generatorConfiguration>
3、执行验证
执行mvn mybatis-generator:generate,生成UserDOMapper.java、UserDO.java、UserDOMapper.xml,插件执行成功。