我对mybatis的理解
mybatis是干什么的?
Mybatis是一个框架,对jdbc的数据库操作过程进行封装,开发者不必处理注册驱动、创建Connection等操作,只关注sql即可
我理解的mybatis工作原理
通过xml将要执行的statement配置起来,通过java对象(UserMapper.java)和statement(UserMapper.xml)中的sql进行映射生成最终执行的sql语句,最终由mybatis执行sql,并将结果映射成java对象并返回
mybatis入门程序步骤
创建数据库,建表略
新建java项目,引入jar包,结果如图
在src下新建jdbc.properties文件,配置连接数据库信息,全局配置,方便统一管理
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=111111
在src下新建log4j.properties文件,配置日志打印信息
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在src下新建sqlMapConfig.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>
<!-- 引入jdbc.properties,可以统一管理配置信息 -->
<properties resource="jdbc.properties" />
<!-- 别名 -->
<typeAliases>
<!-- bean对象所在目录,配置过后UserMapper.xml中resultType可只写类名,不必写类的全路径 -->
<package name="com.syw.bean" />
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 如果使用mapper,可以新建一个文件夹,单独放xml文件,通过resource属性引入。
com.syw.mapper里边只放同名的java文件,但是随着mapper文件的增多,mappers会很多行 -->
<!-- <mapper resource="sqlMapper/UserMapper"/> -->
<!-- 可以指定到包目录下,一行代码搞定 -->
<package name="com.syw.mapper" />
</mappers>
</configuration>
创建bean对象
package com.syw.bean;
public class User {
private int id;
private String name;
private int age;
//get set toString方法略
}
创建UserMapper
package com.syw.mapper;
import com.syw.bean.User;
public interface UserMapper {
// 遵循4个原则
// 1.返回类型与UserMapper.xml中一致
// 2.参数类型与UserMapper.xml中一致
// 3.方法名与UserMapper.xml中id一致
// 4.UserMapper.xml中namespace与接口路径一致
public User queryUserById(Integer id);
}
创建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">
<!-- namespace:命名空间,用于隔离sql,当有多个mapper.xml时,可以通过命名空间找到对应的方法 -->
<mapper namespace="com.syw.mapper.UserMapper">
<!-- resultType在sqlMapConfig.xml未配置别名之前,需要写全路径的名称。配置过别名之后,写成类名(不区分大小写) -->
<select id="queryUserById" parameterType="Integer" resultType="User">
select * from user2 where id = #{value}
</select>
<!-- 如果传入的参数是简单数据类型,${}里面必须写value -->
<!-- 可以写#{value} java文件里边写"%王%" -->
<!-- 可以写%${value}% java文件里边写"王" -->
<select id="queryMohuUserById" parameterType="String" resultType="User">
select * from user2 where name LIKE '%${value}%'
</select>
<!-- 新增用户 -->
<insert id="addUser" parameterType="User" >
insert into user2 (name,age) values (#{name},#{age})
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="User" >
update user2 set name=#{name} where id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="Integer">
delete from user2 where id = #{value}
</delete>
</mapper>
使用测试类,测试mapper
package com.syw.test;
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 org.junit.Test;
import com.syw.bean.User;
import com.syw.mapper.UserMapper;
/**
* 测试Mapper的动态代理功能
*
* @author Administrator
*
*/
public class TestMapper {
/**
* 查询单个
*/
@Test
public void selectOneMybatis() throws Exception {
// 基本操作
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// sqlSession获取Mapper
// 要求UserMapper.java和UserMapper.xml必须同名且在同一包内
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.print(user);
}
}
对比未使用mapper方式的查询方法
package com.syw.test;
import java.io.InputStream;
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.Test;
import com.syw.bean.User;
public class TestMybatis {
/**
* 查询单个
* */
@Test
public void selectOneMybatis() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//user.queryUserById中user是UserMapper.xml中命名空间的名字,如果不使用UserMapper.java的方式,可以任意命名,但是如果使用了UserMapper.java的方式,命名空间中的名字必须是UserMapper.java的全路径名字
User user = sqlSession.selectOne("user.queryUserById", 3);
System.out.print(user);
}
/**
* 模糊查询
* */
@Test
public void selectmohuMybatis() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> user = sqlSession.selectList("user.queryMohuUserById", "三");
for(int i=0;i<user.size();i++){
System.out.print(user.get(i).getName());
}
}
/**
* 新增用户
* */
@Test
public void addUserMybatis() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user=new User();
user.setId(6);
user.setAge(30);
user.setName("张三丰");
sqlSession.insert("user.addUser", user);
// 需要进行事务提交
sqlSession.commit();
// 7. 释放资源
sqlSession.close();
}
/**
* 修改用户
* */
@Test
public void updateUserMybatis() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user=new User();
user.setId(6);
user.setAge(20);
user.setName("张四丰");
sqlSession.update("user.updateUser", user);
// 需要进行事务提交
sqlSession.commit();
// 7. 释放资源
sqlSession.close();
}
/**
* 删除用户
* */
@Test
public void deleteUserMybatis() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("user.deleteUser", 6);
// 需要进行事务提交
sqlSession.commit();
// 7. 释放资源
sqlSession.close();
}
}