Mybatis是基于Java的持久层框架
(支持普通SQL查询,存储过程和高级映射的优秀持久层框架)
作用:
简化jdbc操作,不用专注于怎么写这个操作,而是专注于业务和SQL
MyBatis可以使用简单的XML
或注解
用于配置和原始映射,将接口和Java 的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
ORM
:对象关系映射
简单概括:更加简化jdbc代码,简化持久层,sql语句从代码中分离,利用反射,将表中数据与java bean 属性一一映 射即ORM(Object Relational Mapping 对象关系映射)
基础使用:
使用
1、 依赖包导入
新建maven项目 ,pom文件添加依赖jar
<!-- mybatis jar 包依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- log4j日志打印 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
2、log4j 日志添加
在src/main/resources 资源包下添加log4j日志输出properties文件,便于查看日志输出信息
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
#Consoleoutput...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3、resources目录下配置文件添加
新建mybatis.xml文件,并加入配置信息如下(数据库名mybatis,表 user)
db.properties
#键值对,前后不要有空格
#5.x版本,6.x版本之后为 com.mysql.cj.jdbc.Driver
driver=com.mysql.jdbc.Driver
#5.x版本,6.x版本之后为 jdbc:mysql://localhost:3306/ebuy?serverTimezone=GMT%2B8&characterEncoding=utf8&useUnicode=true&useSSL=false
url=jdbc:mysql://localhost:3306/class?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username=root
password=123456
#键值对,前后不要有空格
#5.x版本,6.x版本之后为 com.mysql.cj.jdbc.Driver
driver1=com.mysql.jdbc.Driver
#5.x版本,6.x版本之后为 jdbc:mysql://localhost:3306/ebuy?serverTimezone=GMT%2B8&characterEncoding=utf8&useUnicode=true&useSSL=false
url1=jdbc:mysql://localhost:3306/class?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username1=root
password1=123456
mybatis.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>
<!--引入数据库配置文件-->
<properties resource="db.properties"/>
<!-- <!–类型别名–>
<typeAliases>
<!–单独指定别名–>
<!–<typeAlias type="com.nanda.po.Account" alias="account"/>–>
<package name="com.nanda.po"/>
</typeAliases>-->
<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>
<environment id="test">
<!-- 加入事务控制 -->
<transactionManager type="jdbc" />
<!-- 配置数据库连接信息 -->
<dataSource type="pooled">
<property name="driver" value="${driver1}" />
<property name="url" value="${url1}" />
<property name="username" value="${username1}" />
<property name="password" value="${password1}"/>
</dataSource>
</environment>
</environments>
<!-- mapper 配置文件指定 文件数量可配置多个-->
<mappers>
<!--引入单个-->
<mapper resource="com/lmw/dao/ISuerDao.xml" />
<!--包扫描引入映射文件-->
<!--<package name="com.nanda.mapper"/>-->
</mappers>
</configuration>
4、映射文件添加
<?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">
<!--
1.命名空间配置 全局唯一 包名+文件名
2.配置Mapped Statement
3. statement配置
id 值声明statement编号 同一命名空间(同一文件)下不可重复
parameterType 输入参数即占位符的数据类型 类型可以是 基本数据类型,字符串,java bean ,map,list等
resultType 输出结果 类型可以是基本数据类型,字符串,java bean,map等
statement 描述 即待执行的sql
#{id} 占位符 变量名为id/value 均可 ${value} 变量名必须为value 字符串拼接形式 无法避免sql 注入
-->
<mapper namespace="com.lmw.dao.ISuerDao">
<!-- 查询客户-->
<select id="findAll" resultType="com.lmw.domain.Suser">
SELECT * FROM suser
</select>
</mapper>
5.实体类Customer添加
需要实现序列化接口
6.在父类工程pom获取资源
7、测试
public static void main(String[] args) throws IOException {
/**
a)、读取mybatis的配置文件
b)、加载配置文件创建SqlSessionFactory
c)、根据SqlSessionFactory创建SqlSession
d)、通过sqlSession操作数据库
e)、处理结果
f)、关闭session
*/
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
// 指定数据源
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is,"test");
SqlSession session = sessionFactory.openSession();
/*不使用映射文件包扫描*/
//List<Suser> account = session.selectOne("com.nanda.mapper.AccountMapper.queryAccountById", 1);
ISuerDao userDao = session.getMapper(ISuerDao.class);
List<Suser> users = userDao.findAll();
for (Suser user : users) {
System.out.println(user);
}
List<Suser> accounts = session.selectList("com.lmw.dao.ISuerDao.findAll");
for (Suser user : accounts) {
System.out.println(user);
}
session.close();
is.close();
}
实现的设计模式
自定义Mybatis分析.png
properties:resource
properties:url
typeAliaser和package
<result column="数据库字段名" property="实体类属性" jdbcType="数据库字段类型" />
resultMap 标签 手动指定数据库字段和java字段的映射关系
可以通过数据库 sql as 指定别名
<resultMap id="card_map" type="card">
<id column="id" property="id"></id>
<result column="user_id" property="userId"></result>
<result column="card_num" property="cardNum"></result>
</resultMap>
<select id="queryCardById" parameterType="int" resultMap="card_map">
select id,user_id,card_num from card where id = #{id};
</select>
#{}
安全的 ? '值'
${}
不安全的 ? 值 不能防止sql注入
模糊查询注意:
uname like '%${uname}%'
aname like CONCAT('%',#{aname},'%')
sql公共抽取
<sql id="defaultSuser">
SELECT * FROM suser
</sql>
<!-- 查询客户-->
<select id="findAll" resultType="com.lmw.domain.Suser">
<include refid="defaultSuser"></include>
</select>