1 實驗環境
(1)導入 JAR 包
其中,前2個 jar 包下載地址見 → log4j-1.2.17.jar、 mybatis-3.4.1.jar,將 jar 包放入 lib 目錄下,並選中所有 jar 包,右鍵,選擇【Add to Build Path】。
(2)工作目錄
注意:src 和 conf 目錄下的 com.mapper 包必須同名。
(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>
<package name="com.mapper"/>
</mappers>
</configuration>
jdbc.properties
# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users
jdbc.username=root
jdbc.password=0.
2 案例分析
首先在 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 java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.MapKey;
import com.bean.Student;
public interface StudentMapper {
//獲取一條記錄,並以實體對象返回
public Student getStudentById(Integer sid);
//獲取一條記錄,並以Map返回,key爲屬性名,vakue爲屬性值
public Map<String,Object> getStudentMapById(Integer sid);
//獲取所有記錄,並以列表返回
public List<Student> getStudents();
//獲取所有記錄,並以map返回,key爲主鍵,value爲實體對象
@MapKey("sid")
public Map<Integer,Student> getStudentsMap();
//獲取所有記錄數
public Integer getCount();
}
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">
<!-- public Student getStudentById(Integer sid); -->
<select id="getStudentById" resultType="com.bean.Student">
select sid,sname from students where sid = #{id}
</select>
<!-- public Map<String,Object> getStudentMapById(Integer sid); -->
<select id="getStudentMapById" resultType="java.util.Map">
select sid,sname from students where sid = #{id}
</select>
<!-- public List<Student> getStudents(); -->
<select id="getStudents" resultType="com.bean.Student">
select sid,sname from students
</select>
<!-- public Map<Integer,Student> getStudentsMap(); -->
<select id="getStudentsMap" resultType="com.bean.Student">
select sid,sname from students
</select>
<!-- public Integer getCount(); -->
<select id="getCount" resultType="java.lang.Integer">
select count(*) from students
</select>
</mapper>
注意:namespace 需要指向 StudentMapper.java;<select> 標籤中 id 值需要與 StudentMapper.java 中相應方法名同名,resultType 爲該方法返回值的數據類型,當返回值爲集合類型時,應指定爲實體對象所屬類型,如:com.bean.Student。
Test.java
package com.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
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);
Student student1=mapper.getStudentById(1001); //查詢一條記錄
System.out.println(student1);
Map<String,Object> student2=mapper.getStudentMapById(1002); //查詢一條記錄
System.out.println(student2);
List<Student> students1=mapper.getStudents(); //查詢所有記錄
System.out.println(students1);
Map<Integer,Student> students2=mapper.getStudentsMap(); //查詢所有記錄
System.out.println(students2);
Integer count=mapper.getCount(); //查詢記錄數
System.out.println(count);
}
}
控制檯輸出如下:
Student [sid=1001, sname=張三]
{sname=李四, sid=1002}
[Student [sid=1001, sname=張三], Student [sid=1002, sname=李四]]
{1001=Student [sid=1001, sname=張三], 1002=Student [sid=1002, sname=李四]}
2