MyBatis——第一个案例

1 前言

MyBatis 是 Apache 开发的基于 Java 的持久层框架,包括 SQL Maps 和 Data Access Objects(DAO),其前称为 iBatis(源于internet 和 abatis 的组合),在 iBatis 3.x 版本之后,更名为MyBatis。

2 实验环境

(1)导入 JAR 包

其中,前2个 jar 包下载地址见 → log4j-1.2.17.jar、 mybatis-3.4.1.jar

(2)工作目录

(3)配置文件

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<param name="Encoding" value="UTF-8" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L)\n" />
		</layout>
	</appender>

	<logger name="java.sql">
		<level value="debug" />
	</logger>

	<logger name="org.apache.ibatis">
		<level value="info" />
	</logger>

	<root>
		<priority value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

注意:log4j.xml文件名不能随意更改。 

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>
	<!-- 设置或引入资源文件 -->
	<properties resource="jdbc.properties"></properties>
	
	<!-- 设置连接数据库的环境,default用于设置默认使用的数据库环境 -->
	<environments default="mysql">
		<!-- 设置某个具体的数据库环境 -->
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 引入映射文件 -->
	<mappers>
		<mapper resource="StudentMapper.xml"/>
	</mappers>
</configuration>

注意:mybatis-config.xml 为核心配置文件,其内配置了连接数据库的环境,并加载一些映射文件。

jdbc.properties

# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users
jdbc.username=root
jdbc.password=0.

3 案例分析

首先在 MySQL 中创建数据库:users,再在此数据库中创建表:students,包含sid(int)、sname(varchar) 2个字段,其中,sid 设置了自增,students 表中数据如下:

Student.java

package com.bean;

public class Student {
	private Integer sid;
	private String sname;
	
	public Integer getId() {
		return sid;
	}
	
	public void setId(Integer sid) {
		this.sid = sid;
	}
	
	public String getName() {
		return sname;
	}
	
	public void setName(String sname) {
		this.sname = sname;
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}
}

注意:尽量保持 Student 类中属性名与数据库中 students 表格的属性名同名,如果不同名,在查询时需要使用别名,使得别名与 Student 类中对应属性名同名。

StudentMapper.java

package com.mapper;

import com.bean.Student;

public interface StudentMapper {
    
	public Student getStudentById(Integer sid);
}

StudentMapper.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="com.mapper.StudentMapper">
	<select id="getStudentById" resultType="com.bean.Student">
		select sid,sname from students where sid = #{id}
	</select>
</mapper>

注意:namespace 需要指向 StudentMapper.java;<select> 标签中 id 值需要与 StudentMapper.java 中相应方法名同名,resultType 为该方法返回值的数据类型;查询语句按如下写法:

select sid,sname from students where sid = ${value}

Test.java

package com.test;

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 com.bean.Student;
import com.mapper.StudentMapper;

public class Test {
	
	public static void main(String[] args) throws IOException {
		InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
		SqlSession sqlSession=sqlSessionFactory.openSession();
		//getMapper:会通过动态代理动态生成StudentMapper的代理实现类
		StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
		System.out.println(mapper.getClass().getName()); //输出:com.sun.proxy.$Proxy0
        
		Student student=mapper.getStudentById(1001);
		System.out.println(student);
	}
}

控制台输出如下:

com.sun.proxy.$Proxy0
DEBUG 06-11 17:20:03,073 ==>  Preparing: select sid,sname from students where sid = ?  (BaseJdbcLogger.java:145)
DEBUG 06-11 17:20:03,099 ==> Parameters: 1001(Integer) (BaseJdbcLogger.java:145)
DEBUG 06-11 17:20:03,110 <==      Total: 1 (BaseJdbcLogger.java:145)
Student [sid=1001, sname=张三]

3 拓展延伸

在核心配置文件(mybatis-config.xml)文件中,还可以配置用户的一些偏好属性,如:变量的驼峰风格(变量中每个单词首字母大写,第一个单词除外)和类的别名等。

(1)变量的驼峰风格设置

将 <setting> 标签的 mapUnderscoreToCamelCase 属性设置为 true。若数据库中含有 user_name 属性,在访问时会自动转换为 userName。

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>
	<settings>
		<!-- 将数据库中下划线风格的属性转换成驼峰风格的变量,如将user_name转换为userName -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
</configuration>

(2)类型别名设置

 使用 <typeAlias> 标签为一个类指定别名,在映射文件(如:StudentMapper.xml)中就可以直接使用此别名。

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>
	<typeAliases>
		<!-- 为类型设置类型别名,若省略alias,默认为Student,且不区分大小写 -->
		<typeAlias type="com.bean.Student" alias="Stu"/>
		<!-- 包下的所有类都自动使用默认别名 -->
		<!-- <package name="com.bean"/> -->
	</typeAliases>
</configuration>

 注意:在 <typeAliases> 标签内可以通过 <package> 子标签指定某包下所有类使用默认别名。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章