MyBatis_记录
Posted 小企鹅推雪球!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis_记录相关的知识,希望对你有一定的参考价值。
文章目录
- MyBatis 入门
- 从 XML 中构建 SqlSessionFactory
- 从 SqlSessionFactory 中获取 SqlSession
- Mybatis补充
- Mybatis接口注解
- Mybatis增删改查(CURD)
- XML 映射配置文件
- MyBatis 加载属性的顺序
- mybatis settings设置
- mybatis类型别名(typeAliases)
- Mybatis 插件(plugins)
- Mybatis配置环境(environments)
- Mybatis事务管理器(transactionManager)
- Mybatis 数据源(dataSource)
- MyBatis 第一种内建数据源类型`UNPOOLED`
- MyBatis 第二种内建数据源类型`POOLED`
- ## MyBatis 第二种内建数据源类型`JNDI`
- MyBatis XML映射文件
- Mybatis select , insert, update 和 delete元素属性的配置
- MyBatis resultMap元素
- Mybatis使用Map存储结果集
- Mybatis使用POJO存储结果集
- resultType和resultMap的区别
- MyBatis注解
- MyBatis关联查询
- MyBatis一对一关联查询
- MyBatis 一对一关联查询处理过程
- MyBatis 一对一关联查询的分步查询处理过程
MyBatis 入门
-
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
-
MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。
-
MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
-
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。
-
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
从 XML 中构建 SqlSessionFactory
- 每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。
- SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
- 从 XML 文件中构建 SqlSessionFactory 的实例使用类路径下的资源文件进行配置,也可以使用输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流
- MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- 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>
- XML 头部的声明,它用来验证 XML 文档的正确性。environment 元素体中包含了事务管理和连接池的配置。
- mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
从 SqlSessionFactory 中获取 SqlSession
- 可以从SqlSessionFactory中获得 SqlSession 的实例
- SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
- 可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}
- 上述方式可以执行,但是较为麻烦,现在有了一种更简洁的方式——使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),这种方式的优点在于不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(
BlogMapper.class
);
Blog blog = mapper.selectBlog(101);
}
- 对于像 BlogMapper 这样的映射器类来说,可以不用 XML 来配置,而可以使用 Java 注解来配置。比如,上面的 XML 示例可以被替换成如下的配置:
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
- 使用注解来映射简单语句会是代码显得更加简洁,但是对于复杂的SQL语句最好用 XML 来映射语句。因为使用注解会使得sql语句混乱
Mybatis补充
- 作用域(Scope)和生命周期
- 依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期
- SqlSessionFactoryBuilder的使用
- SqlSessionFactoryBuilder可以被实例化,使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了
- SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)
- 可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
- SqlSession的使用
- 每个线程都应该有它自己的 SqlSession 实例,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以SqlSession 的最佳的作用域是请求或方法作用域
- 不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行
- 不能将 SqlSession 实例的引用放在任何类型的托管作用域中
- 映射器实例的使用
- 映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的
- 映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃
- 映射器实例并不需要被显式地关闭,但是最好将映射器放在方法作用域内
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(
BlogMapper.class
); // 逻辑代码 }
Mybatis接口注解
- 创建一个Java项目,
- 在 src 源码目录下创建一个包:com.yiibai.mybatis.dao,并建立接口类 IUser 及一个方法, 在方法上面,使用SQL注释,内容如下:
package com.yiibai.mybatis.dao;
import org.apache.ibatis.annotations.Select;
import com.yiibai.mybatis.models.User;
/**
* @author yiibai.com
*/
public interface IUser {
@Select("select * from user where id= #{id}")
public User getUserByID(int id);
}
- getUserByID 必须与 User.xml 里面配置的 select 的 id 对应()同名,虽使用注解映射不需要User.xml
- 配置 MyBatis 所需的数据连接文件,这里创建一个文件:
src/config/Configure.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>
<typeAliases>
<typeAlias alias="User" type="com.yiibai.mybatis.models.User" />
</typeAliases>
<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://127.0.0.1:3306/testdb" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- // power by http://www.yiibai.com 注释掉咯...
<mapper resource="com/yiibai/mybatis/models/User.xml" />-->
</mappers>
</configuration>
- 在包:com.yiibai.mybatis.models 下创建一个User.java 类文件
package com.yiibai.mybatis.models;
public class User {
private int id;
private String name;
private String dept;
private String phone;
private String website;
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
- 与 User.java 对应的 XML 配置文件:User.xml 可以少省略
- 在 src 这个目录下创建一个类:Main.java,Main.java 的代码详细内容如下
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.yiibai.mybatis.dao.IUser;
import com.yiibai.mybatis.models.User;
public class Main {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("config/Configure.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSessionFactory.getConfiguration().addMapper(IUser.class);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSession() {
return sqlSessionFactory;
}
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUser iuser = session.getMapper(IUser.class);
User user = iuser.getUserByID(1);
System.out.println("名字:"+user.getName());
System.out.println("所属部门:"+user.getDept());
System.out.println("主页:"+user.getWebsite());
} finally {
session.close();
}
}
}
Mybatis增删改查(CURD)
- 创建一个工程:mybatis,加入所需的 jar 包:mysql-connector 和 mybatis3.jar。配置 src/config/Configure.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>
<typeAliases>
<typeAlias alias="User" type="com.yiibai.mybatis.models.User" />
</typeAliases>
<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://127.0.0.1:3306/testdb" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- // power by http://www.yiibai.com -->
<mapper resource="com/yiibai/mybatis/models/User.xml" />
</mappers>
</configuration>
- 创建一个类和一个接口:User.java类和IUser.java接口,User.java类位于包 com.yiibai.mybatis.models 下,User.java类代码内容
package com.yiibai.mybatis.models;
public class User {
private int id;
private String name;
private String dept;
private String phone;
private String website;
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
- IUser.java接口位于包com.yiibai.mybatis.dao 下,IUser.java接口代码内容如下
package com.yiibai.mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.yiibai.mybatis.models.User;
public interface IUser {
//@Select("select * from user where id= #{id}")
//public User getUserByID(int id);
public List<User> getUserList();
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(int userId);
public User getUser(int id);
}
- User.xml对应了增删改查的操作(每一个操作的 ID 对应于IUser接口的方法),
<?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.yiibai.mybatis.dao.IUser">
<select id="getUser" parameterType="int"
resultType="com.yiibai.mybatis.models.User">
SELECT *
FROM USER
WHERE id = #{userId}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO USER(name,
dept, website,phone)
VALUES(#{name}, #{dept}, #{website}, #{phone})
</insert>
<select id="getUserList" resultType="com.yiibai.mybatis.models.User">
SELECT * FROM USER
</select>
<update id="updateUser" parameterType="User">
UPDATE USER
SET
name=
#{name},
dept = #{dept},
website = #{website},
phone = #{phone}
WHERE
id =
#{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM USER WHERE id = #{id}
</delete>
</mapper>
- main程序内容
import java.io.Reader;
import java.text.MessageFormat;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.yiibai.mybatis.dao.IUser;
import com.yiibai.mybatis.models.User;
public class Main {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader以上是关于MyBatis_记录的主要内容,如果未能解决你的问题,请参考以下文章