Mybatis是基于Java的持久層框架
(支持普通SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架)
作用:
簡(jiǎn)化jdbc操作帚豪,不用專(zhuān)注于怎么寫(xiě)這個(gè)操作,而是專(zhuān)注于業(yè)務(wù)和SQL
MyBatis可以使用簡(jiǎn)單的XML
或注解
用于配置和原始映射,將接口和Java 的POJO(Plain Old Java Objects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄表窘。
ORM
:對(duì)象關(guān)系映射
簡(jiǎn)單概括:更加簡(jiǎn)化jdbc代碼,簡(jiǎn)化持久層甜滨,sql語(yǔ)句從代碼中分離乐严,利用反射,將表中數(shù)據(jù)與java bean 屬性一一映 射即ORM(Object Relational Mapping 對(duì)象關(guān)系映射)
基礎(chǔ)使用:
1衣摩、 依賴(lài)包導(dǎo)入
新建maven項(xiàng)目 ,pom文件添加依賴(lài)jar
<!-- mybatis jar 包依賴(lài) -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
<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文件既琴,并加入配置信息如下(數(shù)據(jù)庫(kù)名mybatis,表 user)
db.properties
#鍵值對(duì),前后不要有空格
#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
#鍵值對(duì)栏渺,前后不要有空格
#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">
<!-- 添加數(shù)據(jù)庫(kù)連接相關(guān)配置信息 -->
<configuration>
<!--引入數(shù)據(jù)庫(kù)配置文件-->
<properties resource="db.properties"/>
<!-- <!–類(lèi)型別名–>
<typeAliases>
<!–單獨(dú)指定別名–>
<!–<typeAlias type="com.nanda.po.Account" alias="account"/>–>
<package name="com.nanda.po"/>
</typeAliases>-->
<environments default="development">
<environment id="development">
<!-- 加入事務(wù)控制 -->
<transactionManager type="jdbc" />
<!-- 配置數(shù)據(jù)庫(kù)連接信息 -->
<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">
<!-- 加入事務(wù)控制 -->
<transactionManager type="jdbc" />
<!-- 配置數(shù)據(jù)庫(kù)連接信息 -->
<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 配置文件指定 文件數(shù)量可配置多個(gè)-->
<mappers>
<!--引入單個(gè)-->
<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編號(hào) 同一命名空間(同一文件)下不可重復(fù)
parameterType 輸入?yún)?shù)即占位符的數(shù)據(jù)類(lèi)型 類(lèi)型可以是 基本數(shù)據(jù)類(lèi)型,字符串,java bean ,map,list等
resultType 輸出結(jié)果 類(lèi)型可以是基本數(shù)據(jù)類(lèi)型,字符串,java bean,map等
statement 描述 即待執(zhí)行的sql
#{id} 占位符 變量名為id/value 均可 ${value} 變量名必須為value 字符串拼接形式 無(wú)法避免sql 注入
-->
<mapper namespace="com.lmw.dao.ISuerDao">
<!-- 查詢(xún)客戶(hù)-->
<select id="findAll" resultType="com.lmw.domain.Suser">
SELECT * FROM suser
</select>
</mapper>
5.實(shí)體類(lèi)Customer添加
需要實(shí)現(xiàn)序列化接口
6.在父類(lèi)工程pom獲取資源
7锐涯、測(cè)試
public static void main(String[] args) throws IOException {
/**
a)磕诊、讀取mybatis的配置文件
b)、加載配置文件創(chuàng)建SqlSessionFactory
c)、根據(jù)SqlSessionFactory創(chuàng)建SqlSession
d)霎终、通過(guò)sqlSession操作數(shù)據(jù)庫(kù)
e)滞磺、處理結(jié)果
f)、關(guān)閉session
*/
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
// 指定數(shù)據(jù)源
//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();
}
<result column="數(shù)據(jù)庫(kù)字段名" property="實(shí)體類(lèi)屬性" jdbcType="數(shù)據(jù)庫(kù)字段類(lèi)型" />
resultMap 標(biāo)簽 手動(dòng)指定數(shù)據(jù)庫(kù)字段和java字段的映射關(guān)系
可以通過(guò)數(shù)據(jù)庫(kù) 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注入
模糊查詢(xún)注意:
uname like '%${uname}%'
aname like CONCAT('%',#{aname},'%')
sql公共抽取
<sql id="defaultSuser">
SELECT * FROM suser
</sql>
<!-- 查詢(xún)客戶(hù)-->
<select id="findAll" resultType="com.lmw.domain.Suser">
<include refid="defaultSuser"></include>
</select>