一:MyBatis的体系结构
MyBatis的持久化解决方案将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无需关注底层的JDBC操作,就可以以面向对象的方式进行持久化操作。底层数据库连接的获取、数据库访问的实现、事务控制等都无需用户关心。
MyBatis常用的两个对象:SqlSessionFactory和SqlSession。
SqlSessionFactory:单个数据库映射关系经过编译后的内存镜像。线程安全,是SqlSession的工厂。
SqlSession:执行持久化操作的对象,应用程序与持久存储层之间交互操作的一个单线程对象,SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,底层封装了JDBC连接,可以使用SqlSession实例直接执行以映射的SQL语句。
二:实例
1、 测试select、insert、update、delete操作:
一:配置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>
<!--指定mybatis所用日志的具体实现-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--设置别名-->
<typeAliases>
<typeAlias type="com.jiaotong.pojo.User" alias="user"/>
</typeAliases>
<!--环境配置 连接的数据库-->
<environments default="mysql">
<environment id="mysql">
<!--指定事务管理类型 type=JDBC 使用JDBC的提交和回滚设置-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource 指数据源配置 POOLED 是JDBC连接对象的数据源连接池的实现 -->
<dataSource type="POOLED">
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="12345" />
<property name="driver" value="com.mysql.jdbc.Driver" />
</dataSource>
</environment>
</environments>
<!--mappers告诉Mybatis去哪里找持久化类的映射文件-->
<mappers>
<mapper resource="com/jiaotong/mapper/UserMapper.xml"/>
<mapper resource="com/jiaotong/mapper/ItemList.xml"/>
</mappers>
</configuration>
二:编写mapper
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jiaotong.mapper.UserMapper">
<insert id="saveUser" parameterType="user" useGeneratedKeys="true">
INSERT INTO TB_USER(NAME ,SEX,AGE) VALUES(#{name},#{sex},#{age})
</insert>
<select id="selectUser" parameterType="int" resultType="user">
SELECT * FROM TB_USER WHERE id = #{id}
</select>
<update id="modifyUser" parameterType="user">
UPDATE TB_USER
SET name =#{name}, sex=#{sex},age=#{age}
where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM TB_USER WHERE id=#{id}
</delete>
</mapper>
三:测试
1、插入测试
public class InsertTest {
public static void main(String args[]){
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
User user = new User("Tim","男",2);
sqlSession.insert("com.jiaotong.mapper.UserMapper.saveUser",user);
sqlSession.commit();
sqlSession.close();
}
}
2、查询测试
public class SelectTest {
public static void main(String args[]){
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
User user = sqlSession.selectOne("com.jiaotong.mapper.UserMapper.selectUser",3);
sqlSession.commit();
System.out.println(user.getName()+" "+user.getId());
sqlSession.close();
}
}
3、更新测试
public class UpdateTest {
public static void main(String args[]){
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
/**1 将对象查到*/
User user = sqlSession.selectOne("com.jiaotong.mapper.UserMapper.selectUser",3);
user.setAge(18);
user.setName("大王");
/**2 更新*/
sqlSession.update("com.jiaotong.mapper.UserMapper.modifyUser",user);
sqlSession.commit();
sqlSession.close();
}
}
4、删除测试
public class DeleteTest {
public static void main(String args[]){
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
sqlSession.delete("com.jiaotong.mapper.UserMapper.deleteUser",3);
sqlSession.commit();
sqlSession.close();
}
}
为了方便的获得SqlSession对象,写了一个工具类:
public class FKSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try{
InputStream inputStream = Resources.getResourceAsStream("mybatis/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
2、实例 测试ResultMaps
resultMap元素是mybatis最重要的元素,告诉mybatis将从结果集中取出的数据转换成开发者所需要的对象。
1、建立班级和学生表
CREATE TABLE TB_CLAZZ(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE varchar(18)
);
INSERT into TB_CLAZZ(CODE) VALUES('J1601');
INSERT into TB_CLAZZ(CODE) VALUES('J1602');
CREATE TABLE TB_STUDENT(
id int PRIMARY key AUTO_INCREMENT,
NAME VARCHAR(18),
sex CHAR(18),
age INT,
clazz_id int,
FOREIGN KEY(clazz_id) REFERENCES TB_CLAZZ(id)
);
INSERT INTO TB_STUDENT(NAME,sex,age,clazz_id) VALUES('jack','男',22,1);
INSERT INTO TB_STUDENT(NAME,sex,age,clazz_id) VALUES('Tom','女',22,1);
INSERT INTO TB_STUDENT(NAME,sex,age,clazz_id) VALUES('Lucy','女',22,2);
INSERT INTO TB_STUDENT(NAME,sex,age,clazz_id) VALUES('Nacy','男',22,2);
2、建立pojo对象
public class Clazz {
private Integer id;
private String code;
//省略get set
}
public class Student {
private Integer id;
private String name;
private String sex;
private Integer age;
private Clazz clazz;}
3、写mapper映射文件
查询所有学生信息
<!--映射学生对象的ResultMap-->
<resultMap id="studentResultMap" type="com.jiaotong.pojo.Student">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<!--关联映射-->
<association property="clazz" column="clazz_id" javaType="com.jiaotong.pojo.Clazz" select="selectClazzWithId"/>
</resultMap>
<!--根据id查询班级-->
<select id="selectClazzWithId" resultType="com.jiaotong.pojo.Clazz">
SELECT * FROM TB_CLAZZ where id =#{id}
</select>
<!--查询学生的所有信息-->
<select id="selectStudent" resultMap="studentResultMap">
SELECT * FROM TB_STUDENT
</select>
查询所有的班级信息
public class Clazz {
private Integer id;
private String code;
private List<Student> students;
}
<!--映射班级对象的ResultMap-->
<resultMap id="clazzResultMap" type="com.jiaotong.pojo.Clazz">
<id property="id" column="id"></id>
<result property="code" column="code"></result>
<collection property="students" javaType="ArrayList" column="id" ofType="com.jiaotong.pojo.Student"
select="selectStudentWithId"></collection>
</resultMap>
<select id="selectStudentWithId" resultType="com.jiaotong.pojo.Student">
SELECT * FROM TB_STUDENT WHERE clazz_id =#{id}
</select>
<!--查询所有的班级信息-->
<select id="selectClazz" resultMap="clazzResultMap">
SELECT * FROM TB_CLAZZ
</select>
4、测试
public class SelectStudentTest {
public static void main(String[] args) throws Exception {
// 获得Session实例
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 查询TB_USER表所有数据返回List集合,集合中的每个元素都是一个Student对象
List<Student> student_list
= session.selectList("com.jiaotong.mapper.UserMapper.selectStudent");
// 遍历List集合,打印每一个Student对象,该对象包含关联的Clazz对象
for(Student stu : student_list){
System.out.println(stu);
}
// 提交事务
session.commit();
// 关闭Session
session.close();
}
}
public class SelectClazzTest {
public static void main(String[] args) throws Exception {
// 获得Session实例
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 查询TB_CLAZZ表所有数据返回List集合,集合中的每个元素都是一个Clazz对象
List<Clazz> clazz_list
= session.selectList("com.jiaotong.mapper.UserMapper.selectClazz");
// 遍历List集合,打印每一个Clazz对象和该Clazz关联的所有Student对象
for(Clazz clazz : clazz_list){
System.out.println(clazz);
List<Student> student_list = clazz.getStudents();
for(Student stu : student_list){
System.out.println(stu.getId() + " " + stu.getName() + " " + stu.getSex() + " " + stu.getAge());
}
}
// 提交事务
session.commit();
// 关闭Session
session.close();
}
}