MyBatis学习(一)

对原生态jdbc程序中问题总结

    在我们开始学习mybatis之前,让我们先来回顾一下之前采用jdbc开发的时候以及当时使用jdbc开发时有哪些弊端吧。

public class JdbcTest {
	
	public static void main(String[] args) {
		
		//数据库连接
		Connection connection = null;
		//预编译的Statement,使用预编译的Statement提高数据库性能
		PreparedStatement preparedStatement = null;
		//结果 集
		ResultSet resultSet = null;
		
		try {
			//加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			//通过驱动管理类获取数据库链接
			connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
			//定义sql语句 ?表示占位符
			String sql = "select * from user where username = ?";
			//获取预处理statement
			preparedStatement = connection.prepareStatement(sql);
			//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
			preparedStatement.setString(1, "王五");
			//向数据库发出sql执行查询,查询出结果集
			resultSet =  preparedStatement.executeQuery();
			//遍历查询结果集
			while(resultSet.next()){
				System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//释放资源
			if(resultSet!=null){
				try {
					resultSet.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(preparedStatement!=null){
				try {
					preparedStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}


	}
}

jdbc编程步骤

1、 加载数据库驱动

2、 创建并获取数据库链接

3、 创建jdbc statement对象

4、 设置sql语句

5、 设置sql语句中的参数(使用preparedStatement)

6、 通过statement执行sql并获取结果

7、 sql执行结果进行解析处理

扫描二维码关注公众号,回复: 194503 查看本文章

8、 释放资源(resultSetpreparedstatementconnection)


问题总结

1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。

    设想:使用数据库连接池管理数据库连接。


 2、将sql语句硬编码java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。

    设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。


  3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

    设想:将sql语句及占位符号和参数全部配置在xml中。


 4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。

    设想:将查询的结果集,自动映射成java对象。


2,mybatis框架

2.1 mybatis框架是什么

   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

2.2 框架执行流程图


1、 mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sqlid即是Mapped statementid

6、 Mapped Statementsql执行输入参数进行定义,包括HashMap、基本类型、pojoExecutor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、 Mapped Statementsql执行输出结果进行定义,包括HashMap、基本类型、pojoExecutor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。


2.3 案例驱动mybatis快速入门

需求:使用mybatis框架完成 :

                1,根据用户id(主键)查询用户信息

                2,根据用户名模糊查询用户信息

                3,添加用户

2.3.1 环境准备

从网上下载运行环境:

mybatis运行环境(jar包):从https://github.com/mybatis/mybatis-3/releases

lib下:依赖包

mybatis-3.2.7.jar:核心 包

mybatis-3.2.7.pdf,操作指南

2.3.2 创建数据库

创建mysql数据库并导入测试模拟数据


2.3.3 创建javaweb工程并导mybatis核心包、依赖包、数据驱动包。


2.3.4 在classpath下创建log4j.properties配置文件,如下:

# Global logging configuration
#在开发环境下日志级别要设置成DEBUG,生成环境设置成info或eroor
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作为输出日志信息。

2.3.5 在classpath下创建SqlMapConfig.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/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="mysql" />
			</dataSource>
		</environment>
	</environments>
	
</configuration>

SqlMapConfig.xmlmybatis核心配置文件,上边文件的配置内容为数据源、事务管理。

2.3.6 创建po类

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

Public class User {
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
由于占用篇幅,这里省略get/set方法……  

2.3.7 编写映射文件

映射文件命名:

User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml(这个将在后面文章讲解),比如:UserMapper.xmlItemsMapper.xml,在映射文件中配置sql语句。

classpath下的sqlmap目录下创建sql映射文件Users.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语句,作用就是对sql进行分类化管理。

注意:使用mapper代理方法开发,namespace有特殊重要的作用。

SqlMapConfig.xml中添加:

<!-- 根据id获取用户信息 -->
	<select id="findUserById" parameterType="int" resultType="cn.itcast.travelsky.po.User">
		select * from user where id = #{id}
	</select>
	<!-- 自定义条件查询用户列表 -->
	<select id="findUserByUsername" parameterType="java.lang.String" 
			resultType="cn.travelsky.mybatis.po.User">
	   select * from user where username like '%${value}%' 
	</select>

id:表示映射文件中的sql,将sql语句封装到mappedStatement对象中,所以将id称为statement的id

parameterType:指定输入参数的类型,这里指定int类型

#{ }:表示一个占位符号

#{id}:其中的id表示接收输入的参数,参数名称就是id,如果输入参数是简单类型,#{ }中的参数名可以任意。

resultType:指定sql的输出结果所映射的java类型,select指定的resultType表示将单条记录映射成的java对象。

2.3.8 在核心配置文件SqlMapConfig.xml中加载User.xml映射文件

<mappers>
		<mapper resource="sqlmap/User.xml"/>
</mappers>

2.3.9 测试程序编写


到目前为止,对于Mybatis框架我们算是有了个大概模糊的认识,案例驱动中的第一个案例: 1,根据用户id(主键)查询用户信息 就已经实现,关于mybatis的学习后面文章将继续讲解。




猜你喜欢

转载自blog.csdn.net/huangyuhuangyu/article/details/80011683