一.MyBatis简介
MyBatis就是一个持久层的框架,它让程序员只关注sql本身,而不需要关注连接的创建,statement的创建,MyBatis将输入参数,输出结果进行映射
二.MyBatis的原理(执行流程)
三.MyBatis操作流程
1.最基本的查询
从上面原理可以看出,首先我们要写配置文件
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>
<!--引入database配置文件 -->
<properties resource="db.properties">
</properties>
<!--配置mybatis的环境,如果和spring结合,则由spring管理 -->
<environments default="development">
<environment id="development">
<!-- 事物管理,配置JDBC表示 -->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,采用mybatis连接池,使用POOLED方式 -->
<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>
<!-- 映射XMl文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
从上面可以看出,我们引入了database配置文件,也可以不引入,直接在value中写值
db.properties文件如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
username=root
password=123
pojo类:
public class User implements Serializable{
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//订单信息
private List<Orders> orders;
public List<Orders> getOrders() {
return orders;
}
public void setOrders(List<Orders> orders) {
this.orders = orders;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
映射文件:
<?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="test">
<!--
select:表示一个MappedStatement对象
id:Statement的唯一标示
parameterType:传入参数的java类型,parameterType只能有一个,所以入参只能有一个
resultType:输出结果所映射的java类型
#{}:表示一个占位符
#{id}:里面的参数表示输入的参数名称,如果是基本类型,则参数名称任意,如果是其它类型,则必须写对应的参数名
-->
<select id="findByUserId" parameterType="int" resultType="com.study.mpo.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>
测试代码:
@Test
public void test1() throws IOException{
String resource="SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessionFactory
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session=sqlSessionFactory.openSession();
//调用session的增删改查
User customer=session.selectOne("test.findByUserId", 1);
System.out.println(customer.getUsername());
}
2.模糊查询或者排序时,使用${}连接符
<!--
模糊查询
${} :表示一个sql的连接符,即参数传递什么,它就会显示什么
使用该链接符有sql注入风险,但是有些必须使用该链接符,比如${}
-->
<select id="findLikeByUser" parameterType="java.lang.String" resultType="com.study.mpo.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
测试代码:
@Test
public void test2() throws IOException{
String resource="SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立sqlsessionFactory
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session=sqlSessionFactory.openSession();
//调用session的增删改查
List<User> customerList=session.selectList("test.findLikeByUser", "小");
session.close();
System.out.println(customerList.toString());
}
3.添加用户
<!-- 添加用户
value的值根据ONGL表达式来查询
-->
<insert id="insertUser" parameterType="com.study.mpo.User">
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
测试代码:
@Test
public void insertUserTest() throws Exception{
//读取配置文件
//全局配置文件的路径
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("xsa");
user.setAddress("xsaxasx");
//调用SqlSession的增删改查方法
//第一个参数:表示statement的唯一标示
sqlSession.insert("test.insertUser", user);
System.out.println(user.getId());
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
项目中有时候再插入数据的时候,要得到它的id,怎么实现了
3.1自增主键返回ID
<!-- 添加用户 -->
<!-- selectKey:查询主键,在标签内需要输入查询主键的sql -->
<!-- order:指定查询主键的sql和insert语句的执行顺序,相当于insert语句来说 -->
<!-- LAST_INSERT_ID:该函数是mysql的函数,获取自增主键的ID,它必须配合insert语句一起使用 -->
<insert id="insertUser" parameterType="com.study.mpo.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
3.2自增主键之UUID
<insert id="insertUser2" parameterType="com.study.mpo.User">
<selectKey keyProperty="id" resultType="string" order="BEFORE">
SELECT UUID()
</selectKey>
INSERT INTO USER
(id,username,birthday,sex,address)
VALUES(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
四.mapper代理开发
前面我们所看到的都是dao的开发方式,MyBatis提供了Mapper代理的开发方式
使用Mapper代理的开发规范:
1、 mapper接口的全限定名要和mapper映射文件的namespace值一致。
2、 mapper接口的方法名称要和mapper映射文件的statement的id一致。
3、 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
4、 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
mapper接口:
public interface UserMapper {
// 1、 根据用户ID查询用户信息
public User findUserById(int id) throws Exception;
}
mapper映射文件
<?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必须和mapper接口的全限定名一致-->
<mapper namespace="com.study.mybatis.mapper.UserMapper">
<!-- 根据用户ID查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="User">
SELECT
* FROM USER WHERE id =#{id}
</select>
</mapper>
测试:
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 由mybatis通过sqlsession来创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user);
sqlSession.close();