Mybatis的介绍
Mybatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装使开发者只需要关注SQL本身,不再需要花费精力去处理例如注册驱动connection ,创建statement,手动设置参数,结果集检索等jdbc繁杂的过程代码。
Mybatis的架构图
Mybatis的入门程序
首先导入mybatis的相关jar包及数据库驱动
创建数据库表
为该数据库表,创建一个javaBean,用于存储数据
package pojo;
import java.util.*;
public class user {
private String Uname;
private int Idcard;
private String Usex;
private Date Birthday;
private String phone;
private String state;
private String cardid;
public String getUname() {
return Uname;
}
public void setUname(String uname) {
Uname = uname;
}
public int getIdcard() {
return Idcard;
}
public void setIdcard(int idcard) {
Idcard = idcard;
}
public String getUsex() {
return Usex;
}
public void setUsex(String usex) {
Usex = usex;
}
public Date getBirthday() {
return Birthday;
}
public void setBirthday(Date birthday) {
Birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCardid() {
return cardid;
}
public void setCardid(String cardid) {
this.cardid = cardid;
}
@Override
public String toString() {
return "user [Uname=" + Uname + ", Idcard=" + Idcard + ", Usex=" + Usex + ", Birthday=" + Birthday + ", phone="
+ phone + ", state=" + state + ", cardid=" + cardid + "]";
}
}
根据架构图可知,首先需要的是sqlMapConfig.xml(Mybatis核心配置配置文件)还有各种映射文件
sqlMapConfig.xml的主要是拿来实现各种配置,可以拿来配置数据库连接,指定mapper位置,引入外部文件,起别名等等
<?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>
<!--用于引入外部文件
比如:将数据库连接的配置信息放在db.properties
通过properties标签进行引入
再用el表达式从该引入文件里面取值
-->
<properties resource="db.properties" />
<!--
<typeAliases>
<!--
用于取别名,将pojo.user取名为user
比如入参类型为pojo.user,引入这个标签后,就可以直接写user
-->
<typeAlias type="pojo.user" alias="user"/>
<!--
它会扫描pojo包及其子包
比如入参类型为pojo.user,而如果我们写成user是找不到的
但是如果引入这个标签,它就会去pojo包下扫描找到user
-->
<package name="pojo" /> //扫描包
</typeAliases>
-->
<!--1.1配置环境 ,默认的环境id为mysql -->
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!--数据库连接池 默认使用Mybatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="${jdbc.driver}" />
<!-- 连接数据库的url -->
<property name="url" value="${jdbc.url}" />
<!-- 连接数据库的用户名 -->
<property name="username" value="${jdbc.username}" />
<!-- 连接数据库的密码 -->
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
<mapper resource="map/user.xml" />
</mappers>
</configuration>
而各个映射文件的作用主要是拿来写SQL语句,来对表进行相关的增删改查操作,由于我用的是user表,所以我就将这个映射文件取名为user.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">
——————————————————
写SQL语句
- 入门级增删改查
user.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">
<!--
parameterType:输入参数类型
resultType:输出参数类型
#{}:占位符,自带引号
select * from users where id = 1 当条件是一个数字时,加引号跟不加引号就没什么区别
select * from users where name = 'zp',当条件是一个字符串时,不加引号就会报错。
所以加上引号便能实现通用的效果
如果传入的参数是基本数据类型,那么占位符可以任意写,可以写#{v},也可以写#{a},#{b}
如果传入的参数是pojo类型或者QueryVo等复杂数据类型,那么传入参数就必须是属性名
模糊查询的写法是"%"#{}"%"
${}:占位符,不带引号
如果传入的参数是基本数据类型,那么占位符必须写成${value}
如果传入的参数是pojo类型或者QueryVo等复杂数据类型,那么传入参数就必须是属性名
模糊查询的写法是'%${value}%'
-->
<
<!--
命名空间:主要是用来区别不同的mapper,比如在另外一个xml中,也有findUserById那么没有命名空
间就很难去区分他们,但是有了命名空间,我们可以通过test.findUserById进行区分
-->
<mapper namespace="test">
<!-- 根据id查询用户 -->
<select id="findUserById" parameterType="Integer" resultType="pojo.user">
select * from users where Idcard = #{v}
</select>
<!-- 根据姓名模糊查询用户 -->
<select id="findUserByUsername" parameterType="String" resultType="pojo.user">
select * from users where Uname like "%"#{v}"%"
</select>
<!-- 增加用户 -->
<insert id="insertUser" parameterType="pojo.user">
<!-- mysql提供的,在用户id自增的情况下,在增加用户后,需要获取用户id -->
<selectKey keyProperty="Idcard" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into users(Uname,Usex,Birthday,phone,state,cardid)
values(#{Uname},#{Usex},#{Birthday},#{phone},#{state},#{cardid})
</insert>
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="pojo.user">
update users
set Uname = #{Uname},Usex=#{Usex}
where Idcard = #{Idcard}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="Integer">
delete from users
where Idcard = #{v}
</delete>
</mapper>
由于现在只是单独使用Mybatis,所以只能通过单元测试来进行调用,新建一个测试类MybatisTest.java
public class MybatisFirstTest {
//根据id查询用户
public void testMybatis() throws Exception{
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建Sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql
user user1 = sqlSession.selectOne("test.findUserById",5555562);
System.out.print(user1);
}
//根据姓名模糊用户
public void testfindUserByUsername() throws Exception{
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建Sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql
List<user> selectList = sqlSession.selectList("findUserByUsername","z");
for(user user1 :selectList){
System.out.println(user1.getCardid());
}
}
//增加用户
public void testInsertUser() throws Exception{
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建Sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql
user user = new user();
user.setUname("qwe");
user.setCardid("445121199806284533");
user.setBirthday(new Date());
user.setPhone("Aaa");
user.setUsex("男");
int insert = sqlSession.insert("test.insertUser", user);
sqlSession.commit();
System.out.println(user.getIdcard());
}
//更新用户
public void updateUser() throws Exception{
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建Sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql
user user = new user();
user.setUname("曾琪");
user.setCardid("445121199806284533");
user.setBirthday(new Date());
user.setPhone("Aaa");
user.setUsex("男");
user.setIdcard(5555561);
int insert = sqlSession.update("test.updateUser", user);
sqlSession.commit();
}
//删除用户
public void deleteUser() throws Exception{
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建Sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql
int insert = sqlSession.delete("test.deleteUser", 5555561);
sqlSession.commit();
}
}
- Mapper实现动态代理
创建一个UserMapper接口
public interface UserMapper {
//遵循四个原则
//接口 方法名 = user.xml中的id
//返回值类型 与 Mapper.xml文件中返回值类型要一致
//方法的入参类型与Mapper.xml中的入参类型要一致
public user findUserById(Integer id);
}
修改user.xml的命名空间,实现user.xml与UserMapper之间的一一对应
<mapper namespace="map.UserMapper"></mapper>
再新建一个测试类进行测试
public class MybatisMapperTest {
public void testMapper() throws Exception{
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建Sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我生成一个实现类(给接口),得到一个代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
user user = mapper.findUserById(5555557);
System.out.print(user.getBirthday()+user.getPhone());
}
}
Mybatis的优点
- 在sqlMapConfig.xml中配置数据连接池,使用数据池管理数据库链接,避免频繁的创建和释放连接
- mapper.xml文件与java代码分离,有利于后期的维护
- Mybatis自动将java对象映射至sql语句,也就是将java对象作为输入参数类型(原生jdbc只能一个一个参数输入)
- Mybatis自动将sql执行结果映射到java对象,也就是将java对象或者java对象集合作为输出参数类型(原生jdbc只能一个一个参数输出)