一.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"/>
- <!--如果xml文件是放在某个文件夹下,如果是你跟映射类放在同一个下,而且同名,则用package方法,不是的话,
- <mapper resource="com/hpe/mapper/impl/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映射文件
- <span style="color:#000000;"><?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></span>
- <span style="color:#000000;">// 创建UserMapper对象
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 由mybatis通过sqlsession来创建代理对象
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- User user = mapper.findUserById(1);
- System.out.println(user);
- sqlSession.close();</span>