MyBatis


JDBC=》DButils(QueryRunner)=》JdbcTemplate:工具
框架:整体解决方案

MyBatis介绍

Web工程:

Class.forName("com.mysql.jdbc.Driver").newInstance();  
		
String url = "jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=UTF-8";
String user = "root";
String password = "root";

Connection conn = DriverManager.getConnection(url, user,password);   
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);   

String sql = "select * from users_c";   
ResultSet rs = stmt.executeQuery(sql); 

jdbc
优点:简单易学,上手快,非常灵活构建sql,效率高。
缺点:代码繁琐,难以写出高质量的代码(资源的释放,SQL注入安全性等),开发者关注多,又要写业务逻辑,又要关注对象的创建和销毁。

Hibernate ORM实体关系映射,
好处:不用写sql语句。可以以面向对象的方式设计和访问,方便理解。其实hibernate底层也是调用的jdbc,它只是对jdbc进行了轻量级的封装。
缺点:处理复杂业务时,灵活度差,复杂的hql难写。

现今大多数业务系统都和数据库打交道,而且通常业务都很复杂,需要关联多个表查询,找到需要的数据。用Hibernate当业务复杂,关联多张表时,hql极其难写,效率也低。用jdbc吧,又不能以面向对象方式思考和使用,开发的代码质量也难以保证。那能否在这两者间找到一个平衡点呢?结合它们的优点,摒弃它们的缺点。
  
有,这就是myBatis。现今myBatis被广泛的企业所采用,大有超过hibernate的势头。
What is MyBatis?
MyBatis is a first class persistence framework(持久化框架) with support for custom SQL, stored procedures(自定义SQL,存储过程) and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration(使用简单的XML或Annotations进行配置) and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
在这里插入图片描述
MyBatis 世界上流行最广泛的SQL 映射框架,由Clinton Begin 在2002 年创建,其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis。

资料:
mybatis-3.2.2.zip

mybatis-3.2.2.jar 核心包
mybatis-3.2.2.pdf 手册

Lib目录 依赖jar包

mybatis-spring-1.2.0.zip 与spring整合包
下载地址:http://code.google.com/p/mybatis/

MyBatis实例及基础知识

开发步骤:

创建java工程
加入jar包(依赖包、驱动包)
创建sqlMapConfig.xml
创建数据库,数据库表USER_C,插入测试记录
创建PO对象 user.java
创建映射文件 User.xml
创建测试类

占位符:
iBatis #id#
myBatis #{id}

第一个例子

1、创建web工程
在这里插入图片描述
2、导入jar包:
mybatis-3.2.2.jar

asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar

mysql-connector-java-5.1.10-bin.jar
junit-4.9.jar
如果你用的是mysql8.0版本那么你的mysql-connector-java-5.1.10-bin.jar包应该加入8.0jar包(至于原因还在研究)

配置文件 log4j.properties :

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.rootLogger=error, stdout

log4j.logger.com.springframework=DEBUG
log4j.logger.com.ibatis=DEBUG  
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG  
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG  
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG  

log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG  
log4j.logger.java.sql.ResultSet=DEBUG

配置文件 sqlMapConfig.xml :

事务:JDBC/MANAGED
数据源:UNPOOLED/POOLED/JNDI

<?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="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="12345"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="cn/itcast/mybatis/domain/User.xml"/>
	</mappers>
</configuration>

创建数据库:

创建mybatisdb数据库
在这里插入图片描述

创建User表

create table USER_C
(
   ID                   varchar(40) not null,
   NAME                 varchar(30),
   AGE                  int,
   ADDRESS              varchar(200),
   primary key (ID)
);

加入测试数据

insert  into `user_c`(`id`,`name`,`age`,`address`) 
values ('1','夏言',73,'桂州村'),
('2','严嵩',87,'分宜县城介桥村'),
('3','徐阶',80,'明松江府华亭县'),
('4','高拱',66,'河南省新郑市高老庄村'),
('5','张居正',58,'江陵');

映射文件 cn.itcast.mybatis.domain.User.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="cn.itcast.mybatis.domain.User">
	<!-- 查询所有记录 -->
	<select id="listAll" resultType="cn.itcast.mybatis.domain.User">
		SELECT * FROM user_c
	</select>
</mapper>

PO对象 User.java :

package cn.itcast.mybatis.domain;

/**
 * @Description: TODO
 * @Title:  User.java
 * @author: Matthew
 * @date: 2019年3月11日 下午7:08:49
 * @version V1.0
 */

public class User {
	private String id;
	private String name;
	private Integer age;
	private String address;
	
	public String getId() {
		return id;
	}
	
	public void setId(String id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Integer getAge() {
		return age;
	}
	
	public void setAge(Integer age) {
		this.age = age;
	}
	
	public String getAddress() {
		return address;
	}
	
	public void setAddress(String address) {
		this.address = address;
	}
	
}

测试类:

package test;

import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;

import cn.itcast.mybatis.domain.User;


public class TestMybatis {
	SqlSessionFactory sqlSessionFactory;

	@Before
	public void initFactory() throws Exception{
		String resource = "sqlMapConfig.xml";

		InputStream inputStream = Resources.getResourceAsStream(resource);

		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test //查询所有
	public void testListAll(){
		SqlSession session = sqlSessionFactory.openSession();
		List<User> users = session.selectList("cn.itcast.mybatis.domain.User.listAll");
		
		System.out.println(users.size());
	}
}

结果是:
5

mybatis核心:如何实现数据的增删改查?

User.xml 参数: #{parameterName}
参数类型:parameterType=“string | User | hashmap"
结果类型:resultType=“User | hashmap"

查询所有
查询一条
新增记录 string|map 所有实体类的地方都可以改成map。
修改记录
删除记录

SqlSession session = sqlSessionFactory.openSession();
查询所有 session.selectList
查询一条 session.selectOne
新增记录 session.insert
修改记录 session.update
删除记录 session.delete

手动提交:
session.commit();

查询所有:

上面的例子就是查询所有

User.xml	
	<!-- 方便下面select字段调用,同时方便设置别名 -->
	<sql id="cols">
		id,name,age,address
	</sql>

	<!-- 查询所有 -->
	<select id="listAll" resultType="cn.itcast.mybatis.domain.User">
		select <include refid="cols"/> from user_c
	</select>


TestUser.java
	
	@Test	//查询所有
	public void testListAll(){
		SqlSession session = sqlSessionFactory.openSession();
		
		List<User>  users = session.selectList("cn.itcast.mybatis.domain.User.listAll");
		System.out.println("记录数: "+users.size());
	}

查询一个:

User.xml	
	<!-- 查询一个 -->
	<select id="get" parameterType="string" resultType="cn.itcast.mybatis.domain.User">
		select id,name,age,address from user_c where id=#{id}
	</select>

TestUser.java
	@Test	//查询一个
	public void testGet(){
		SqlSession session = sqlSessionFactory.openSession();
		
		User u = session.selectOne("cn.itcast.mybatis.domain.User.get", "1");
		System.out.println(u);
	}

新增:

在这里插入图片描述

修改

User.xml	
	<!-- 修改 -->
	<update id="update" parameterType="cn.itcast.mybatis.domain.User">
		update user_c set name = #{name},age = #{age},address = #{address}
		where id = #{id}
	</update>
TestUser.java
	@Test	//修改
	public void testUpdate(){
		SqlSession session = sqlSessionFactory.openSession();
		
		User u = new User();
		u.setId("1");
		u.setName("高拱");
		u.setAge(66);
		u.setAddress("志不尽舒,才不尽酬");
		
		int i = session.update("cn.itcast.mybatis.domain.User.update", u);
		session.commit();		//手动提交
		
		System.out.println("影响记录数: "+i);
	}

删除一个

User.xml	
	<!-- 删除byId -->
	<update id="deleteById" parameterType="string">
		delete from user_c 
		where id = #{id}
	</update>

TestUser.java
	
	@Test	//删除
	public void testDeleteById(){
		SqlSession session = sqlSessionFactory.openSession();
		
		int i = session.delete("cn.itcast.mybatis.domain.User.deleteById", "1");
		session.commit();		//手动提交
		
		System.out.println("影响记录数: "+i);
	}

简化:

对象别名

在sqlMapConfig.xml增加

	<typeAliases>
		<typeAlias type="cn.itcast.mybatis.domain.User" alias="User"/>
	</typeAliases>
查询字段串别名

在user.xml中增加

	<sql id=“cols">
		id,name as userName ,age,address 
	</sql>

	<select id="selectUserByName" parameterType="string" resultType="User">
		select 
			<include refid="cols"/>
		 from user where name = #{name}
	</select>
命名空间
<mapper namespace="cn.itcast.mybatis.domain.User">
<mapper namespace=“sysmanage">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值