Mybatis
开源的ORM(持久层)框架,之前为apahce旗下顶级开源项目,后转到google,变为myBatis,目前代码库:https://github.com/mybatis/mybatis-3/releases
mybatis主要让软件工程师的精力放在sql,通过mybatis提供的映射方式,可以自由的将数据映射为javaBean对象。
mybatis主要让软件工程师的精力放在sql,通过mybatis提供的映射方式,可以自由的将数据映射为javaBean对象。
传统Dao层代码需求
1、在Dao层实现类中,存在大量的模板方法,能否提取模板方法,减少我们的工作量。
2、将statementId硬编码到了Dao层实现类。
采用mapper代理的方式进行Dao层的开发,需要有几个约定(约定大于配置)
1、XXXMapper.xml中namespace的值需要与Dao接口中的全类名相同。 (确定哪一个XXXMapper.xml文件)
2、XXXMapper.java 接口中的方法名与XXXMapper.xml中的statementId相同(确定使用哪个sql);
3、XXXMapper.java 接口中的方法输入参数需要与XXXMapper.xml中ParameterType定义的类型相同;
4、XXXMapper.java 接口中的方法返回值类型需要与XXXMapper.xml中resultType定义的类型相同;
1、在Dao层实现类中,存在大量的模板方法,能否提取模板方法,减少我们的工作量。
2、将statementId硬编码到了Dao层实现类。
采用mapper代理的方式进行Dao层的开发,需要有几个约定(约定大于配置)
1、XXXMapper.xml中namespace的值需要与Dao接口中的全类名相同。 (确定哪一个XXXMapper.xml文件)
2、XXXMapper.java 接口中的方法名与XXXMapper.xml中的statementId相同(确定使用哪个sql);
3、XXXMapper.java 接口中的方法输入参数需要与XXXMapper.xml中ParameterType定义的类型相同;
4、XXXMapper.java 接口中的方法返回值类型需要与XXXMapper.xml中resultType定义的类型相同;
Mybatis基本的开发步骤
1.引入jar包(Maven创建工程,此处是pom.xml配置文件)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xt</groupId>
<artifactId>mybatis.hi</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis.hi Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<build>
<finalName>mybatis.hi</finalName>
</build>
</project>
2.创建mybatis配置文件,文件名:mybatis-config.xml,配置了数据库连接池,以及<mappers> </mappers>
<?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>
<environments default="xtDevelopment">
<environment id="xtDevelopment">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xtdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mapper/userMapper.xml"/>
</mappers>
</configuration>
3.写mapper配置文件,例如userMapper.xml,将sql语句以配置文件的形式写出,并在mybatis-config.xml中配置好 userMapper.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.xt.mybatis">
<!--
select 标签,用作数据查询操作
属性ID:标识映射文件中的sql的唯一性,ID被称为statmentId
属性: parameterType 入参参数类型
属性: resultType 输出结果类型,表示单条数据记录映射成的javaBean
statementId = namespace + queryUserInfoById
#{value} 此种方式表示预处理,代表占位符
${value} 表示sql字符串的拼接,将接收到的数据不加任何修饰拼装到sql中
-->
<select id="queryUserInfoById" parameterType="int" resultType="com.xt.mybatis.hi.user.entity.UserInfo">
select user_id userId, user_name userName, passwd, tel_no telNo, email, memo from user_info where user_id = #{userId}
</select>
<select id="queryUserInfo" parameterType="string" resultType="com.xt.mybatis.hi.user.entity.UserInfo">
select user_id userId, user_name userName, passwd, tel_no telNo, email, memo from user_info where user_name like '%${value}%'
</select>
<!--
insert标签 添加数据
-->
<insert id="insertUserInfo" parameterType="com.xt.mybatis.hi.user.entity.UserInfo">
insert into user_info values (#{userId}, #{userName}, password(#{passwd}), #{telNo}, #{email}, #{gender}, #{memo}, null, null)
</insert>
<!--
delete 删除数据
-->
<delete id="deleteUserInfoById" parameterType="int">
delete from user_info where user_id = #{value}
</delete>
<update id="updateUserInfo" parameterType="com.xt.mybatis.hi.user.entity.UserInfo">
update user_info set user_name = #{userName}, tel_no = #{telNo}, email = #{email}, gender = #{gender}, memo = #{memo} where user_id = #{userId}
</update>
</mapper>
4.创建SqlSessionFactory,通过它来生产出SqlSession,并执行Sql语句
4.1 首先创建一个UserInfo,对应数据库里的一个表
package com.xt.mybatis.hi.user.entity;
public class UserInfo {
private int userId;
private String userName;
private String passwd;
private String telNo;
private String email;
private String gender;
private String memo;
/**
* @return the userId
*/
public int getUserId() {
return userId;
}
/**
* @param userId the userId to set
*/
public void setUserId(int userId) {
this.userId = userId;
}
/**
* @return the userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* @return the passwd
*/
public String getPasswd() {
return passwd;
}
/**
* @param passwd the passwd to set
*/
public void setPasswd(String passwd) {
this.passwd = passwd;
}
/**
* @return the telNo
*/
public String getTelNo() {
return telNo;
}
/**
* @param telNo the telNo to set
*/
public void setTelNo(String telNo) {
this.telNo = telNo;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
/**
* @param email the email to set
*/
public void setEmail(String email) {
this.email = email;
}
/**
* @return the gender
*/
public String getGender() {
return gender;
}
/**
* @param gender the gender to set
*/
public void setGender(String gender) {
this.gender = gender;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @param memo the memo to set
*/
public void setMemo(String memo) {
this.memo = memo;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "UserInfo [userId=" + userId + ", userName=" + userName + ", passwd=" + passwd + ", telNo=" + telNo
+ ", email=" + email + ", gender=" + gender + ", memo=" + memo + "]";
}
}
4.2 创建MybatisHelloworld类,执行sql语句,在该类中用Junit进行测试,在myBatisInit()中生成SqlSessionFactory,并生成SqlSession。在测试方法中通过SqlSession执行Sql语句。
package com.xt.mybatis.hi.user;
import java.io.IOException;
import java.util.List;
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 org.junit.Before;
import org.junit.Test;
import com.xt.mybatis.hi.user.entity.UserInfo;
public class MybatisHelloworld {
//SqlSessionFactory sqlSessionFactory = null;
SqlSession ss = null;
@Before
public void myBatisInit(){
try {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis/mybatis-config.xml"));
ss = sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void sayHello(){
//创建SqlsessionFactory通过资源加载器加载配置文件
UserInfo ui = ss.selectOne("com.xt.mybatis.queryUserInfoById", 201708244);
System.out.println("------------------->" + ui);
}
@Test
public void queryUserInfo(){
List<UserInfo> uiList = ss.selectList("com.xt.mybatis.queryUserInfo", "admin");
System.out.println("uiList-------------->" + uiList);
}
@Test
public void insertUserInfo(){
UserInfo ui = new UserInfo();
ui.setUserId(201710290);
ui.setUserName("小张");
ui.setPasswd("123456");
ui.setGender("男");
ui.setEmail("test@zzxtit.com");
ui.setTelNo("0371-55255350");
ui.setMemo("hello mybatis");
int affectedRowNo = ss.insert("com.xt.mybatis.insertUserInfo", ui);
ss.commit();
System.out.println("---------------->" + affectedRowNo);
}
@Test
public void deleteUserInfoById(){
int affectedRowNo = ss.delete("com.xt.mybatis.deleteUserInfoById", 201710290);
System.out.println("---------------->" + affectedRowNo);
ss.commit();
}
@Test
public void updateUserInfo(){
UserInfo ui = new UserInfo();
ui.setUserId(201710290);
ui.setUserName("嚣张");
ui.setPasswd("123456");
ui.setGender("M");
ui.setEmail("test@zzxtit.com");
ui.setTelNo("0371-55255350");
ui.setMemo("hello mybatis");
int affectedRowNo = ss.update("com.xt.mybatis.updateUserInfo", ui);
System.out.println("---------------->" + affectedRowNo);
ss.commit();
}
}