/* 这段时间刚开始学习MyBatis,学习过程中有许多不理解和犯错的地方,希望能借助博客记录下来。 */
MyBatis是一款优秀的开源框架,用于持久层的设计开发中,MyBatis支持开发者编写特定的SQL语句,支持存储化过程(?)与高级映射(?)。MyBatis几乎避免了所有的JDBC代码和手动设置参数以及获取结果集。MyBatis通过XML设置配置和映射原生信息,将接口和POJOS映射成数据库中的记录。
注:一下所有内容在Java WebApplication中完成,没有涉及到Maven
(一)相关jar包导入
MyBatis的支持jar包:
相关工程架构:
(二)mybatis.cfg.xml与mysql.properties
在mysql.properties配置文件中,配置我们需要的数据库信息,在这里我使用的是mySql数据库
在mybatis.cfg.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="mysql.properties"/>
<!-- 配置mybatis运行环境 -->
<environments default="cybatis">
<environment id="cybatis">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC" />
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<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>
</configuration>
配置完毕后,为了后续的操作,先在Mysql中新建一个数据表为t_user
(三)持久类与其Maper接口,映射文件
与数据库字段所对应,我们新建一个持久类
package ouc;
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public User(){
}
public User(int id,String name,int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
为了管理方便,我们把maper类相关的类与文件都放在一个包下面,我们再创建UserMaper接口:
package maper;
import ouc.User;
public interface UserMaper {
public int insertUser(User user) throws Exception;
public void updateUser(User user,int id) throws Exception;
public User findUser(int id) throws Exception;
}
最后创建持久类的映射配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="maper.UserMaper"> <!-- 不要忘记maper标签中的namespace属性!该属性是Maper接口! -->
<resultMap id="userMap" type="User"> <!-- 自定义返回集 id属性为返回集名称,type属性为返回集的原生对象-->
<id property="id" column="id" javaType="int"/> <!-- 主键 -->
<result property="name" column="name" javaType="String"/> <!-- 属性名与数据表字段名对应 -->
<result property="age" column="age" javaType="int"/>
</resultMap> <!-- id对应的名称必须要是唯一的 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> <!-- 与Maper接口中的方法名对应 -->
insert into t_user (id,username,age) values(#{id},#{name},#{age}) <!-- useGeneratedKeys:设置是否使用JDBC的useGeneratedKeys方法获取主键,并生成到keyProperty对应的字段中 -->
</insert> <!-- #{}占位符 -->
<update id="updateUser">
update t_user set username=#{username},age=#{age} where id=#{id}
</update>
<select id="findUser" parameterType="int" resultMap="userMap"> <!-- parameterType 参数类型 -->
select * from t_user where id=#{id}
</select>
</mapper>
在完成以上配置后,在mybatis.cfg.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="mysql.properties"/>
<typeAliases>
<package name="ouc"/> <!--自动扫描-->
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="cybatis">
<environment id="cybatis">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC" />
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/practice1" />
<property name="username" value="root" />
<property name="password" value="330324" />
</dataSource>
</environment>
</environments>
<mappers>
<package name="maper"/> <!--自动扫描-->
</mappers>
</configuration>
(四)测试
在测试前,我们先写一个工具类,与hibernate相同,如果每次映射都要创建工厂的话,是非常非常消耗资源的,所以写这个类帮助我们减少资源的消耗。
package Tools;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.tools.ant.types.Resource;
import java.io.IOException;
import java.io.Reader;
public class DBtools {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
最后就是我们的测试了!
package Test;
import Tools.DBtools;
import maper.ClassMaper;
import maper.StudentMaper;
import maper.UserMaper;
import org.apache.ibatis.session.SqlSession;
import ouc.Class;
import ouc.Student;
import ouc.User;
public class test {
public static void main(String agrs[]){
User user = new User(10,"Lucy",18);
SqlSession session = DBtools.getSession();
UserMaper maper = session.getMapper(UserMaper.class);
try {
maper.insertUser(user);
User Lucy = maper.findUser(10);
System.out.print(Lucy);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
}
}
让我们看下结果吧~
我这里只写了增与查,并没有写改与删,以及返回所有User的方法,但是原理是一样的。