Mybatis基础学习(一)—— mybatis入门

Mybatis是什么?

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

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

Mybatis框架执行流程:


1、首先,mybatis的配置文件包括mybatis全局配置文件和mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了sql执行相关的信息。

2、mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出sqlSessionFactory,即会话工厂

3、通关过sqlSessionFactory,可以创建SqlSession会话,说明mybatis是通过SqlSession来操作数据库的。

4、SqlSession本身并不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器。

5、Executor执行器要处理的Sql信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、hashMap集合对象、POJO对象类型。


作用域和生命周期:

    SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

    SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理作用域中,比如 Servlet 架构中的 HttpSession。每个线程都应该有它自己的 SqlSession 实例。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

     映射器(MappedStatement)是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域(request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作用域(method scope)内。

简单的Mybaits程序示例:

    1.首先创建一个java工程(普通的工程就好,本示例不需要使用Web动态工程或者Maven)

    2.加入jar包,具体如下,其中junit的jar包,是非必须的。

        mybatis核心包

        

        mybatis依赖包

            

        mybatis驱动包

        

        junit单元测试包

        

    3.先在数据库中创建user表,该表有id,username,birthday,sex,address

    4.编程步骤:

        1、创建PO类

        2、创建全局文件SqlMapConfig.xml

        3、编写映射文件

        4、加载映射文件,在SqlMapConfigxml文件中进行加载

        5、编写测试程序,即编写java代码,链接并操作数据库

            思路:

            a)读取配置文件;

            b)通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。

            c)通过SqlSessionFactory创建SqlSession。

            d)调用SqlSession的操作数据库方法。

            e)关闭SqlSession。

创建PO类(创建的PO类的属性要和数据库中的列名一致,如果表中的列明是带有下划线,那么po类中的对应属性名要有驼峰式命名)

public class User implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int id;
	private String username;
	private Date birthday;
	private char sex;
	private String address;

	public User() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param username the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @return the birthday
	 */
	public Date getBirthday() {
		return birthday;
	}

	/**
	 * @param birthday the birthday to set
	 */
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	/**
	 * @return the sex
	 */
	public char getSex() {
		return sex;
	}

	/**
	 * @param sex the sex to set
	 */
	public void setSex(char sex) {
		this.sex = sex;
	}

	/**
	 * @return the address
	 */
	public String getAddress() {
		return address;
	}

	/**
	 * @param address the address to set
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/**
	 * @param id
	 * @param username
	 * @param birthday
	 * @param sex
	 * @param address
	 */
	public User(int id, String username, Date birthday, char sex, String address) {
		this.id = id;
		this.username = username;
		this.birthday = birthday;
		this.sex = sex;
		this.address = address;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
				+ address + "]";
	}

	/**
	 * @param username
	 * @param birthday
	 * @param sex
	 * @param address
	 */
	public User(String username, Date birthday, char sex, String address) {
		this.username = username;
		this.birthday = birthday;
		this.sex = sex;
		this.address = address;
	}

创建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>
<!-- 	<properties resource=""></properties>
 -->

	<settings>
		<!--开启延迟加载-->
		<setting name="lazyLoadingEnabled" value="true" />
		<!--是否开启积极懒加载,false 按需加载 ,默认是true-->

		<setting name="aggressiveLazyLoading" value="false" />

		<!--开启二级缓存 总开关-->
		<setting name="cacheEnabled" value="true" />
	</settings>

	<typeAliases>
		<!-- <typeAlias type="net.seehope.mybatis.pojo.User" alias="user" /> -->
		<!--批量别名 首字母大小写都行-->
		<package name="net.seehope.mybatis.pojo" />
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<!--配置JDBC事务控制,由mybatis 管理-->
			<transactionManager type="JDBC"></transactionManager>
			<!--默认使用dbcp连接池-->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/spring_jdbc" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
		<!-- <environment id="development1">
			配置JDBC事务控制,由mybatis 管理
			<transactionManager type="JDBC"></transactionManager>
			默认使用dbcp连接池
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/spring_jdbc" />
				<property name="username" value="root" />
				<property name="password" value="qhxj,YRAN941211" />
			</dataSource>
		</environment>
 -->
	</environments>
<!-- 加载映射文件-->
	<mappers>
		<mapper resource="mybatis/mapper/UserMapper.xml" />
		<!-- mapper接口和mapper映射文件名字相同,且要放在同一个目录下 -->
		<!-- <package name="net.seehope.mybatis.mapper" /> -->
	</mappers>
</configuration>

编写映射文件

<?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="net.seehope.mybatis.mapper.UserMapper">


	<!--根据id返回用户 test.queryUserByID
		#{} 基本数据类型,数值类型,直接输出
		 字符类型 '' preparestatment
		 ${} 字符类型原样输出 value 八大基本数据类型 
	-->
	<select id="queryUserByID" parameterType="int" resultType="user">
		SELECT id,username FROM USER WHERE ID = #{ID}
	</select>
	<!--模糊查询 按照name-->
	<select id="queryUserLikeName" parameterType="String"
		resultType="net.seehope.mybatis.pojo.User">
		SELECT * FROM USER WHERE username like '%${value}%'
	</select>

	<insert id="addUser" parameterType="User">
		insert into
		user(username,birthday,sex,address)
		values(#{username},#{birthday},#{sex},#{address})
	</insert>
	

	<delete id="deleteUser" parameterType="int">
		delete from user where id
		= #{id}
	</delete>

</mapper>
编写测试程序

public class MybatisFirst {

	@Test
	publicvoid findUserByIdTest() throws Exception{
		
		//1、读取配置文件
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//2、根据配置文件创建SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);
		//3、SqlSessionFactory创建SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//4、SqlSession执行statement,并返回映射结果
		//第一个参数:statement的id,建议:namespace.statementId(确保唯一)
		//第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
		User user = sqlSession.selectOne("queryUserById", 1);
		
		//打印输出结果集
		System.out.println(user);
		
		//5、关闭SqlSession
		sqlSession.close();
	}
}

当然,实际开发的时候肯定不是这么用的,在实际开发中一般使用mapper代理开发,这将会在后面的文章中详细说明,关于配置文件的标签说明也会在后面的文章中慢慢讲解



猜你喜欢

转载自blog.csdn.net/m0_37673753/article/details/79940999