MyBatis框架(02)——第一个MyBatis程序


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、Maven项目中使用MyBatis

  项目结构:
在这里插入图片描述
  mybaits的代码由github.com管理,地址: https://github.com/mybatis/mybatis-3/releases。
  我们也可以在创建一个maven项目之后直接在maven项目中下载mybatis的依赖包,pom.xml文件代码如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.com</groupId>
  <artifactId>DemoToBoke2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<!-- 导入mybatis需要的jar包 -->
  	<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.11.1</version>
		</dependency>
  </dependencies>
  <!-- 将maven中的servlet版本改为3.1并将jdk更新为1.8 -->
  <build>
		<finalName>DemoToBoke2</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

  导入依赖包之后我们还需要在classpath下创建log4j.properties,如下:

	# Global logging configuration
	log4j.rootLogger=DEBUG, stdout
	# Console output...
	log4j.appender.stdout=org.apache.log4j.ConsoleAppender
	log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
	log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

  mybatis默认使用log4j作为输出日志信息。最后,在classpath下创建mybatis-config.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>
		<!--和spring整合后,environments配置将废除 -->
		<environments default="development">
			<environment id="development">
				<!-- 使用JDBC事务管理 -->
				<transactionManager type="JDBC" />
				<!-- 数据库连接池 -->
				<dataSource type="POOLED">
					<property name="driver" value="com.mysql.jdbc.Driver" />
					<property name="url"
						value="jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8" />
					<property name="username" value="root" />
					<property name="password" value="root" />
				</dataSource>
			</environment>
		</environments>
	</configuration> 

  mybatis-config.xml是mybatis 核心配置文件,上面文件的配置内容为数据源、事务管理。
  配置好配置文件之后,我们就开始写我们的项目了:
数据库建表: 在数据库中建立user表,代码如下:

-- 如果存在用户表则删除
DROP TABLE IF EXISTS user;
-- 建立数据库表
CREATE TABLE user(
	userId VARCHAR(50) PRIMARY KEY,
	username VARCHAR(50),
	password VARCHAR(50),
	age INT
	
);
-- 插入数据
INSERT INTO user VALUES('S101','jack','123',18);
INSERT INTO user VALUES('S102','lucy','456',18);
INSERT INTO user VALUES('S103','王铁蛋','abc',20);
INSERT INTO user VALUES('S104','mike','789',19);

  创建pojo类: pojo类作为mybatis进行sql映射使用,pojo类通常与数据库表对应,User.java如下:

package cn.com.demo.pojo;
	/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
	*/
public class User {
	private String userId;
	private String username;
	private String password;
	private Integer age;
	public User() {
		super();
	}
	public User(String userId, String username, String password, Integer age) {
		super();
		this.userId = userId;
		this.username = username;
		this.password = password;
		this.age = age;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [userId=" + userId + ", username=" + username + ", password=" + password + ", age=" + age + "]";
	}
}

  映射文件: 在resources下 的mappers目录下创建sql映射文件usermapper.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="test">

</mapper>

  namespace: 命名空间,用于隔离sql语句,还有一层非常重要的作用后面会说到
  mybatis框架需要加载映射文件,创建好usermapper.xml文件之后我们需要将它添加在mybatis-config.xml中,代码如下:

<mappers>
	<mapper resource="mappers/usermapper.xml"/>
</mappers>

  添加好之后我们就可以在usermapper中写需要进行的操作了,例如:

	<!-- 根据id获取用户信息 -->
	<select id="selectUserById" parameterType="java.lang.String" resultType="cn.com.demo.pojo.User">
		select * from user where userId = #{userId}
	</select>
	<!-- 根据username模糊查询用户 -->
	<select id="selectUserByUsername" parameterType="java.lang.String" resultType="cn.com.demo.pojo.User">
		select * from user where username like '%${value}%'
	</select>

  注意: 上面的代码需要写在mapper节点之内,其中:

  • parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设
    置占位符号并将输入变量id传到sql。
  • resultType:定义结果映射类型。

测试代码:

package cn.com.demo.test;
	/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
	*/
import java.io.IOException;
import java.io.InputStream;

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 cn.com.demo.pojo.User;

public class Test {
	public static void main(String[] args) {
		//会话工厂
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession session = null;
		try {
			//配置文件地址
			String resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			//打开会话
			session = sqlSessionFactory.openSession();
//			//通过用户id查询用户信息
//			User user = session.selectOne("test.selectUserById","S102");
//			System.out.println(user);
			
			//通过用户username模糊查询用户
			List<User> list = session.selectList("test.selectUserByUsername", "k");
			System.out.println(list);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭会话
			if(session!=null){
				session.close();
			}
		}
	}
}

运行结果,通过id查找用户:
在这里插入图片描述
通过username模糊查找用户
在这里插入图片描述

二、总结

1、Ognl 表达式#{}和${}

  #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java 类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括 号中可以是value或其它名称。
  ${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

2、parameterType 和resultType

  parameterType:指定输入参数类型,mybatis 通过ognl从输入对象中获取参数值拼接在sql中。
  resultType:指定输出结果类型,mybatis将sql 查询结果的一行记录数据映射为resultType指定类型的对象。

3、selectOne 和selectList

  selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
  selectList可以查询一- 条或多条记录。

4、SqlSessionFactoryBuilder

  SqISessionFactoryBuilder用于创建SqISessionFacoty, SqISessionFacoty 一旦创建完成就不需要SqISessionFactoryBuilder了,因为SqISession 是通过SqISessionFactory生产,所以可以将SqISessionFactoryBuilder当成一一个 工具类使用,最佳使用范围是方法范围即方法体内局部变量。

5、SqlSessionFactory

  SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理Sq|SessionFactory。

6、SqISession

  SqlSession是一-个面向用户的接口,sqlSession 中定义了数据库操作,默认使用DefaultSq|Session实现类。

三、添加、修改和删除

1、添加用户信息

usermapper中的代码:

<!-- 添加用户 -->
	<insert id="insertUser" parameterType="cn.com.demo.pojo.User">
		insert into user(userId,username,password,age) values(#{userId},#{username},#{password},#{age})
	</insert>

测试代码:

package cn.com.demo.test;
	/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
	*/
import java.io.IOException;
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 cn.com.demo.pojo.User;

public class Test {
	public static void main(String[] args) {
		//会话工厂
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession session = null;
		try {
			//配置文件地址
			String resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			//打开会话
			session = sqlSessionFactory.openSession();
			User user = new User("S105", "TOM", "159", 20);
			session.insert("test.insertUser", user);
			//提交事务
			session.commit();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(session!=null){
				session.close();
			}
		}
	}
}

从运行结果中可以看到添加成功:
在这里插入图片描述

2、修改用户信息

usermapper中的代码:

<!-- 修改用户信息 -->
	<update id="updateUser" parameterType="cn.com.demo.pojo.User">
		update user set userId=#{userId},username=#{username},password=#{password},age=#{age} where userId=#{userId}
	</update>

测试类代码:

package cn.com.demo.test;
	/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
	*/
import java.io.IOException;
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 cn.com.demo.pojo.User;

public class Test {
	public static void main(String[] args) {
		//会话工厂
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession session = null;
		try {
			//配置文件地址
			String resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			//打开会话
			session = sqlSessionFactory.openSession();
			User user = new User("S105", "TOM", "XXX", 21);
			session.update("test.updateUser", user);
			//提交事务
			session.commit();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(session!=null){
				session.close();
			}
		}
	}
}

由运行结果即可看出操作成功:
在这里插入图片描述

3、删除用户信息

usermapper中的代码:

<!-- 删除用户信息 -->
	<delete id="deleteUserById" parameterType="java.lang.String">
		delete from user where userId=#{userId}
	</delete>

测试类代码:

package cn.com.demo.test;
	/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
	*/
import java.io.IOException;
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 cn.com.demo.pojo.User;

public class Test {
	public static void main(String[] args) {
		//会话工厂
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession session = null;
		try {
			//配置文件地址
			String resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			//打开会话
			session = sqlSessionFactory.openSession();
			//删除用户
			session.delete("test.deleteUserById", "S105");
			//提交事务
			session.commit();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(session!=null){
				session.close();
			}
		}
	}
}

由运行结果即可看出操作成功:
在这里插入图片描述

4、总结

  下面我们就来总结一下MyBatis是如何解决JDBC编程的问题:
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决: 在mybatis-config.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql 语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql 变动需要改变java代码。
解决: 将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一-定, 可能多也可能少,占位符需要和参数一一-对 应。
解决: Mybatis 自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决: Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定
义输出结果的类型。

  好啦,上面就是我们的第一个mybaits小程序——简单实现用户信息的增删改查,下一篇我们会学习mybatis中的动态代理问题,那么我们下篇再见吧
  好啦,今天的学习就到这里吧!记录学习,记录生活,我还是那个java界的小学生,一起努力吧!!
  如果有什么缺陷欢迎各位看官评论探讨哟 ~ ~ 小生在此谢过了 ~ ~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值