mybatis配置与使用
一:Mybatis简介
1.名称由来
Mybatis原名叫ibatis.Mybatis一开始属于Apache,2010年从Apache转移到了GoogleCode这个组织中.
2.Mybatis概念
Mybatis是一种基于ORM模式的,作用于Dao层的轻量级框架.和Hibernate类似,也支持各种SQL语句,也支持存储过程和高级映射等操作.
3.Mybatis优点
Mybatis比Hibernate更为轻量级;
Mybatis几乎消除了所有的JDBC代码和参数的手工设置.
4.Mybatis特点
Mybatis具有比较强大的动态语句功能.而且Mybatis在JavaBean和表之间的映射关系建立方面,也更加的便捷灵活.
5.Mybatis的核心API
①.SqlSessionFactoryBuilder:
SqlSessionFactoryBuilder是整个Mybatis框架的入口,提供了一个build()方法,用来创建SqlSessionFactory对象. SqlSessionFactoryBuilder对象一般是在xml文件中通过configuration节点来进行配置.
②.SqlSessionFactory:
用来创建SqlSession.注意:该对象一般只用创建一个对象就可以,也就是不要重复创建该对象!
③.SqlSession:
SqlSession用来实现数据库的各种增删改查操作.
注意:
因为SqlSession对象不是线程安全的,所以在使用该对象的时候,要确保该对象不能被多个方法所共享,当用完该对象之后,就要把该对象close()掉.
6.Mybatis和Hibernate对比
Hibernate相对来说较重,使用和配置起来较麻烦,内存占用和资源消耗较多;Hibernate的查询效率并不突出;Hibernate的入门门槛较高.Hibernate里面的API方法及功能较多.
Mybatis相对来说较轻,.......;Mybatis学习成本较低.
Mybatis相对于Hibernate来说API较少,比较单薄.
二:Mybatis的基本使用
1.利用maven工厂导入所需要的jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
2:创建db.properties.xml文件
该文件用来简化数据库的连接配置,以后数据库有更改,直接在这个文件里面修改即可,可以添加多种不同的数据库。我的如下
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/sql05
mysql.username=root
mysql.password=123 orcl.driver=oracle.jdbc.driver.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123
3.创建mybatis.xml配置文件
首先引用db.properties.xml文件,
就可以引用db.properties的配置文件了。
如果是mysql的数据库的话,就加载mysql_conn
管理数据源的时候
<property name="driver" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
mysql.driver一些分别对应着之前写db.properties配置文件。
接着加载映射文件,加载的映射文件用于配置数据库链接的一些操作
<!-- 加载映射文件 -->
<mappers>
<mapper resource="PersonMapper.xml"/>
</mappers>
4.创建PersonMapper.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">
<!-- namespace:这里的值,可以随便写!但是要保证它的值唯一.一般开发过程中,都是JavaBean的全路径. -->
<mapper namespace="com.syc.dao.domain.Person"> <!-- type:要操作的JavaBean的全路径 -->
<!-- resultMap:建立起JavaBean和表的映射关系 -->
<!-- 直接引用别名 -->
<resultMap type="person" id="personMap">
<!-- id:表示主键 -->
<id column="pid" property="pid" />
<!-- result:普通列 -->
<result column="name" property="name" />
<result column="nickname" property="nickname" />
</resultMap> <!-- insert:添加操作的标签,id:用来引用该标签 -->
<insert id="insertPerson">
insert into person (name,nickname)
values('王小二','店小二')
</insert> <!-- 带参数的标签 -->
<insert id="insertPersonWithParams" parameterType="person">
insert into
person (name,nickname)
values(#{name},#{nickname})
</insert> <!-- 查询标签 -->
<!-- resultMap:集合的泛型类 -->
<select id="findAll" resultMap="personMap">
select * from person
</select> <select id="findById" resultType="person" parameterType="int">
select *
from person
where pid=#{pid}
</select> <!-- 修改 -->
<update id="updateById" parameterType="person">
update person set
name=#{name},nickname=#{nickname}
where pid=#{pid}
</update> <!-- 删除 -->
<delete id="deleteById" parameterType="person">
delete from person
where pid=#{pid}
</delete> <!-- 注意:除了查询之外,其他的操作,增删改操作的,起始和标签名称没有关系! -->
<delete id="insertWithDeleteTag" parameterType="person">
insert into
person (name,nickname)
values(#{name},#{nickname})
</delete> </mapper>
5.创建MybatisUtil工具类,加载配置文件
package com.syc.dao.utils; import java.io.IOException;
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; public class MybatisUtil { private static SqlSessionFactory factory;
// 解决资源争抢问题.
private static ThreadLocal<SqlSession> localSessions = new ThreadLocal<SqlSession>(); static {
Reader reader = null;
try {
// 加载Mybatis的配置文件
reader = Resources.getResourceAsReader("mybatis.xml");
// 创建SqlSessionFactory对象.
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} // 获取Session对象
public static SqlSession getSession() {
SqlSession session = localSessions.get();
if (session == null) {
session = factory.openSession();
localSessions.set(session);
}
return session;
} // 关闭session的方法
public static void closeSession() {
SqlSession session = localSessions.get();
if (session != null) {
session.close();
localSessions.remove();
}
}
}
创建session对象:
6.创建Person类。
private Integer pid; //id
private String name; //姓名
private String nickname; //称呼
7.创建PersonDao类,执行具体的CRUD操作
三: Mybatis配置简化改造
1. 简化数据库连接配置
前面提到了,就是创建一个db.properties.xml配置文件,因为做项目后东西太多,需要一个特定的配置文件去管理,而且数据库使用可能会运用到多个,修改项目时候,在特定的配置文件中修改会更加便捷。mysql和orcal的配置如下,如果当你要调用什么数据库的时候,就加载哪个
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/sql05
mysql.username=root
mysql.password=123 orcl.driver=oracle.jdbc.driver.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123
2.设置类型别名
3.简化id的引用
因为做项目的时候,有时候包名过多,可能自己填写的时候难免字母会填写错误,给调试出问题带来不必要的麻烦。
四.Mybatis利用标签使用CRUD
1.动态添加
2. 查询操作
<!-- 查询标签 -->
<!-- resultMap:集合的泛型类 -->
<select id="findAll" resultMap="personMap">
select * from person
</select> <select id="findById" resultType="person" parameterType="int">
select *
from person
where pid=#{pid}
</select>
3.修改操作
<!-- 修改 -->
<update id="updateById" parameterType="person">
update person set
name=#{name},nickname=#{nickname}
where pid=#{pid}
</update>
4.删除操作
<!-- 删除 -->
<delete id="deleteById" parameterType="person">
delete from person
where pid=#{pid}
</delete>
5.注意:
真正的增删改和标签名没有关系!只和里面的sql语句有关!
<!-- 注意:除了查询之外,其他的操作,增删改操作的,起始和标签名称没有关系! -->
<delete id="insertWithDeleteTag" parameterType="person">
insert into
person (name,nickname)
values(#{name},#{nickname})
</delete>
五:运行测试结果
1.测试数据库链接成功与否
@Test
public void test1() {
SqlSession session = MybatisUtil.getSession();
Connection conn = session.getConnection();
// Mybatis中可以执行原生的SQL语句!
if (conn != null) {
System.out.println("数据库已建立连接!");
} else {
System.out.println("数据库未建立连接!");
}
}
2.添加数据
@Test
public void test2(){
PersonDao dao = new PersonDao();
int result = dao.insertPerson();
if (result>0) {
System.out.println("添加成功");
}
}
PersonMapper.xml对应配置:
<!-- insert:添加操作的标签,id:用来引用该标签 -->
<insert id="insertPerson">
insert into person (name,nickname)
values('王小二','店小二')
</insert>
查询数据库后多了这条数据:
还有一种带参数的标签添加数据
@Test
public void test3(){
PersonDao dao = new PersonDao();
Person p = new Person();
p.setName("林冲");
p.setNickname("豹子头");
int result = dao.insertPersonWithParams(p);
if (result>0) {
System.out.println("添加成功");
}
}
测试很多就不一一测试了,DaoTest源码如下
package com.syc.dao.test; import java.sql.Connection;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import com.syc.dao.dao.PersonDao;
import com.syc.dao.domain.Person;
import com.syc.dao.utils.MybatisUtil; public class DaoTest {
@Test
public void test1() {
SqlSession session = MybatisUtil.getSession();
Connection conn = session.getConnection();
// Mybatis中可以执行原生的SQL语句!
if (conn != null) {
System.out.println("数据库已建立连接!");
} else {
System.out.println("数据库未建立连接!");
}
}
@Test
public void test2(){
PersonDao dao = new PersonDao();
int result = dao.insertPerson();
if (result>0) {
System.out.println("添加成功");
}
}
@Test
public void test3() {
PersonDao dao = new PersonDao();
Person p = new Person();
p.setName("林冲");
p.setNickname("豹子头");
int result = dao.insertPersonWithParams(p);
if (result > 0) {
System.out.println("添加成功!");
}
}
@Test
public void test4(){
PersonDao dao = new PersonDao();
List<Person> persons =dao.findAll();
for (Person p : persons) {
System.out.println("name="+p.getName());
}
}
@Test
public void test5() {
PersonDao dao = new PersonDao();
Person person = dao.findById(2);
System.out.println("name=" + person.getName());
}
@Test
public void test6(){
PersonDao dao = new PersonDao();
Person person = new Person();
person.setPid(6);
person.setName("时迁");
person.setNickname("鼓上蚤");
int result = dao.updateById(person);
if (result>0) {
System.out.println("修改成功");
}
}
@Test
public void test7(){
PersonDao dao = new PersonDao();
Person p = new Person();
p.setPid(6);
int result= dao.deleteById(p);
if (result>0) {
System.out.println("删除成功");
}
}
@Test
public void test8(){
PersonDao dao = new PersonDao();
Person p = new Person();
p.setName("宋江");
p.setNickname("及时雨");
int result = dao.insertWithDeleteTag(p);
if (result>0) {
System.out.println("添加成功");
}
}
}
PersonDao的CURD操作的代码如下
package com.syc.dao.dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.syc.dao.domain.Person;
import com.syc.dao.utils.MybatisUtil; public class PersonDao {
public int insertPerson(){
SqlSession session = null;
try {
session = MybatisUtil.getSession();
//Mybatis中默认自动开启了事务.
//命名空间+某个标签的id!
//return session.insert("com.syc.dao.domain.Person.insertPerson") //简化id的引用
return session.insert(Person.class.getName()+".insertPerson");
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return 0;
} //带参数的添加操作
public int insertPersonWithParams(Person person){
SqlSession session =null;
try {
session =MybatisUtil.getSession();
//简化id的引用
return session.insert(Person.class.getName()+".insertPersonWithParams",person);
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return 0;
}
//查询全部
public List<Person> findAll(){
SqlSession session =null;
try {
session = MybatisUtil.getSession();
//简化id的引用
return session.selectList(Person.class.getName()+".findAll");
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return null;
}
public Person findById(int pid){
SqlSession session = null;
try {
session = MybatisUtil.getSession();
//简化id的引用
return session.selectOne(Person.class.getName()+".findById",pid);
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return null; }
public int updateById(Person person){
SqlSession session =null;
try {
session = MybatisUtil.getSession();
//简化id的引用
return session.update(Person.class.getName()+".updateById",person); } catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return 0;
}
public int deleteById(Person person){
SqlSession session =null;
try {
session = MybatisUtil.getSession(); //简化id的引用
return session.delete(Person.class.getName()+".deleteById",person); } catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return 0; }
public int insertWithDeleteTag(Person person){
SqlSession session=null;
try {
session = MybatisUtil.getSession(); //简化id的引用
return session.insert(Person.class.getName()+"insertWithDeleteTag",person);
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
//提交事务
session.commit();
MybatisUtil.closeSession();
}
return 0;
}
}
mybatis配置与使用的更多相关文章
- spring MVC、mybatis配置读写分离
spring MVC.mybatis配置读写分离 1.环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现的目标: ①使数据写入到master ②读数 ...
- Mybatis配置
首先导入mybatis-3.2.3.jar包 还有连接数据库的驱动包 工程中必须导入的三个包(对应的包附件中可以下载): mybatis-3.2.3.jar sqljdbc.jar log ...
- Spring+Mybatis配置
Spring+Mybatis配置 之前做项目的时候用到了spring+mybatis框架,一直想抽空整理一下 Mybatis: mybatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架 ...
- 2 将mybatis配置到springmvc中
为了更方便的连接数据库,将mybatis配置到springMVC中 1). 首先是jar包 多了3个jar druid 这个是阿里的数据库连接包 mybatis和 mybatis- ...
- 项目总结2——mybatis配置的理解
之前的项目基本上都是用mongodb,以至于mysql相关的知识异常薄弱,这次连续一个半月的加班,总算是实际用到了mysql,也使自己对mysql了解的更多,对mybatis了解的更多,这里就说一说经 ...
- mybatis 配置 log4j 日志
mybatis 配置 log4j 日志 使用Mybatis的时候,可能需要输出(主要是指sql,参数,结果)日志,查看执行的SQL语句,以便调试,查找问题. 测试Java类中需要加入代码: stati ...
- spring+myBatis 配置多数据源,切换数据源
注:本文来源于 tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...
- Mybatis配置信息浅析 MyBatis简介(二)
官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...
- SpringBoot+Mybatis配置Pagehelper分页插件实现自动分页
SpringBoot+Mybatis配置Pagehelper分页插件实现自动分页 **SpringBoot+Mybatis使用Pagehelper分页插件自动分页,非常好用,不用在自己去计算和组装了. ...
随机推荐
- kafka手动开启监听
项目集成spring-kafka,在项目启动后需要做些初始化资源的任务,kafka消费会依赖这些所以需要配置kafka手动启动. 类似这样,设置autoStartup为false 然后代码里面调用这个 ...
- Tkinter 项目-屏保
参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...
- Spring Boot Thmeleaf的语法 day04
一.Thmeleaf语法的使用 html格式的页面放在classpath:/templates/就会自动渲染. 1.在pom.xml导入 <dependency> <groupId& ...
- 写一个方法,用于解读 url 后面的请求参数,最终得到 {"a":2,"b":3,"c":4};
function getUrlParams(url){ let searchParam = url.split("?")[1]; let searchItemParams = se ...
- SQL使用之关联更新、批量插入
使用场景 某个字段数据异常,利用另外一张表同步修改该表异常字段的数据; 关联更新 UPDATE tableName1 AS t1 LEFT JOIN tableName12 AS t2 ON t1.x ...
- vs code代码对齐快捷键
vscode缩进快捷键: 选中文本: Ctrl + [ 和 Ctrl + ] 实现文本的向左移动或者向右移动: vscode代码对齐快捷键: 选中文本: Shift + ...
- 001-zookeeper 简介-paxos算法,zk简介,特点
一.概述 大数据体系概述 1.1.什么是zookeeper 是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务 它包含一个简单的原语集,分布式应用程序可以基于他实现同步服务,配 ...
- angular4脚手架搭建
Angular4.X安装,创建 1.安装最新的nodejs(node -v ,npm -v) 2.新建文件夹(右键git bash here)npm install -g @angular/cli 3 ...
- 与图论的邂逅03:Lengauer-Tarjan
回想一下,当我们在肝无向图连通性时,我们会遇到一个神奇的点——它叫割点.假设现在有一个无向图,它有一个割点,也就是说把割点删了之后图会分成两个联通块A,B.设点u∈A,v∈B,在原图中他们能够互相到达 ...
- VS调试SQL Server存储过程
1.打开VS,视图-->SQL Server对象资源管理器.(我用的是VS2012) 2.添加链接,连接到数据库. 3.选择要调试的存储过程,右键,选择调试过程或者执行过程. 4.填写存储过程所 ...