用idea学习持久层框架Mybatis第一天

Mybatis

环境:
JDK1.8
Mysql5.7
Maven3.6.1
IDEA

2、第一个mybatis程序

2.1搭建环境

搭建数据库

Create database `mybatis`;
Use `mybatis`;
Create table `user`(
`id` int (20) not null primary key,
`name` varchar(30) default null,
`pwd` varchar(30) default null
)enging=ingodb default charset=utf8;

Insert into `user` (`id`,`name`,`pwd`)values
(1,`狂神`,`123456`),
(2,`张三`,`1234567`),
(3,`李四`,`1234568`)

新建项目
1.新建一个普通的maven项目Mybatis-Study
2.删除src目录
3.导入maven依赖

<!--父工程-->
<groupId>com.muzi</groupId>
<artifactId>Mybatis-Study</artifactId>
<version>1.0-SNAPSHOT</version>

<!--导入依赖-->
<dependencies>
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
<!--在build中配置resource,来防止我们资源导出失败的问题-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

2.2创建一个模块(注意这是再在工程下建子模块maven项目mybatis01)

刚刚的依赖全是在父工程的pom.xml中配置,于是子工程也能使用并且不用重复导入,此时的子工程也是一个模块。
编写mybatis的核心配置文件pom.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>
    <!--配置环境-->
    <environments default="development">
        <environment id="development">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUcode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

此时应该点击
在这里插入图片描述
在这里插入图片描述
填写
在这里插入图片描述
然后测试
测试成功后,在这里点击所创建的数据库。在这里插入图片描述
一切顺利的话就会有它
在这里插入图片描述
编写mybatis工具类MybatisUtils

封装了连接数据库的内容

package com.muzi.utils;
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 java.io.IOException;
import java.io.InputStream;
/**
 * @author muzi
 * @create 2020-03-02 13:27
 */
//sqlSessionFactory  -->sqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            //获取sqlSessionFactory对象
            String resource="mybatis-config.xml";//获取核心配置文件,成为一个资源
            InputStream inputStream=Resources.getResourceAsStream(resource);//把这种资源包装成输入流
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);//工程建造器对象利用输入流建造工厂
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //既然有了SqlSessionFactory,顾名思义,我们就可以从中获得SqlSession的实例了。
    //SqlSession完全包含了面向数据库执行SQL命令所需的所有方法。
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();//工厂来打开连接,返回一个数据库连接
    }
}

2.3、编写代码

实体类User

package com.muzi.pojo;

/**
 * @author muzi
 * @create 2020-03-02 13:45
 */
//实体类
public class User {
    private int id;
    private  String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

Dao接口UserDao

package com.muzi.dao;

import com.muzi.pojo.User;

import java.util.List;

/**
 * @author muzi
 * @create 2020-03-02 13:47
 */
public interface UserDao {
    List<User> getUserList();
}

接口实现类由原来的UserDaoImpl转换为一个Mapper配置文件UserMapper.xml

扫描二维码关注公众号,回复: 10778858 查看本文章
<?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=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.muzi.dao.UserDao">
    <!-- select查询语句 -->
    <select id="getUserList" resultType="com.muzi.pojo.User">
        SELECT * FROM mybatis.user
    </select>
</mapper>

2.4、测试

package com.muzi.dao;
import com.muzi.pojo.User;
import com.muzi.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
 * @author muzi
 * @create 2020-03-02 14:03
 */
public class UserDaoTest {
    @Test
    public void test(){
        //获取sqlSession对象
        SqlSession sqlSession=MybatisUtils.getSqlSession();//利用工具类获得一个数据库连接
        try {
            UserDao mapper=sqlSession.getMapper(UserDao.class);//利用连接得到关于Dao接口的实现类对象
            List<User> userList = mapper.getUserList();//Dao接口的实现类对象调用得到用户的方法从而得到用户集合
            for(User user:userList){
                System.out.println(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭SqlSession
            sqlSession.close();
        }
    }
}

注意:在父工程,以及子工程的pom.xml文件中要加上

<!--在build中配置resource,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

注意:在子工程的pom.xml中加上

<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
    <mappers>
        <mapper resource="com/muzi/dao/UserMapper.xml"/>
    </mappers>

测试结果:在这里插入图片描述

工程结构:
在这里插入图片描述

3、CRUD

1、Namespace

Namespace中的包名要和Dao/Mapper接口的包名一致!

2、Select

选择,选择语句;
id:就是对应的namespace中的方法名。
resultType:sql语句执行的返回值!
parameterType:参数类型!
(1)编写UserMapper接口

//根据ID查询用户
User getUserById(int id);

(2)编写对应的Mapper中的sql语句

	<select id="getUserById" parameterType="int" 	resultType="com.muzi.pojo.User">
    		SELECT * FROM mybatis.user WHERE id=#{id}
	</select>

(3)测试

public void getUserById(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    try {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(2);
        System.out.println(userById);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        sqlSession.close();
    }
}

3.Insert

(1)编写UserMapper接口

//insert一个用户
int addUser(User user);

(2)编写对应的Mapper中的sql语句

<insert id="addUser" parameterType="com.muzi.pojo.User">
	INSERT into mybatis.user(id,name,pwd) VALUES (#{id},#{name},#{pwd});
</insert>

(3)测试

@Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res=mapper.addUser(new User(4,"王五","123456789"));

        if(res>0){
            System.out.println("插入成功");
        }
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

4.Update

(1)编写UserMapper接口

//修改用户
int updateUser(User user);

(2)编写对应的Mapper中的sql语句

<update id="updateUser" parameterType="com.muzi.pojo.User">
        update mybatis.user SET name=#{name},pwd=#{pwd} WHERE  id=#{id};
</update>

(3)测试

	@Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res = mapper.updateUser(new User(1, "肖晓冉", "5211314"));
        if(res>0){
            System.out.println("修改成功");
        }
        sqlSession.commit();
        sqlSession.close();
    }

5.Delete

(1)编写UserMapper接口

//删除用户
int deleteUser(int id);

(2)编写对应的Mapper中的sql语句

<delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id};
</delete>

(3)测试

@Test
public void deleteUser(){
	SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.deleteUser(4);
    if(i>0){
    	System.out.println("删除成功");
    }
    sqlSession.commit();
    sqlSession.close();
}

注意点:
增删改需要提交事务

6.分析错误

标签不要匹配错
Resource绑定mapper,需要使用路径!
程序配置文件不许符合规范
Nullpointexception,没有注册到资源。
输出的xml文件中存在乱码问题。
Maven资源没有导出问题。

7.万能的map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

User getUserById2(Map<String,Object> map);
<select id="getUserById2" parameterType="map" resultType="com.muzi.pojo.User">
        SELECT * FROM mybatis.user WHERE id=#{id} OR name=#{NAME};
</select>
@Test
    public void getUserById2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("id",1);
            User userById2 = mapper.getUserById2(map);
            System.out.println(userById2);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }

Map传递参数,直接在sql中取出key即可!
对象传递参数,直接在sql中取对象的属性即可。
只有一个基本类型参数的情况下,可以直接在sql中取到。
多个参数用map,或者注解

8.思考题

(1)Java代码执行的时候,传递通配符%%

List<User> userList=mapper.getUserLike(“%李%”);

(2)在sql拼接中使用通配符。

Select * from mybatis user where name like “%”#{value}”%”

4、配置解析

1、核心配置文件

Mybatis-config.xml
MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。
configration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandLers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactonManager(事务管理器)
dataSource(数据源)
dataseIdProvder(数据库厂商标识)
Mappers(映射器)

2、环境配置

MyBatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境
学会使用配置多套运行环境。
Mybatis默认的事务管理器就是JDBC,连接池:POOLED

3、属性(properties)

我们可以通过properties属性来实现引用配置文件。
这些属性都是可外部配置且动态替换的,既可以在典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递。【db.properties】
编写一个配置文件
Db.properties

driver=com.mysql.jdbc.Driver
	url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUcode=true&characterEncoding=UTF-8
	username=root
	password=root

在核心配置文件中引用

<!--引入外部配置文件-->
	<properties resource="db.properties"/>

可以直接引入外部文件
可以在其中增加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的。

4、类型别名(typeAliases)

类型别名是为Java类型设置一个短的名字。
存在的意义仅在于用来减少类完全限定名的冗余。

<!--可以给实体类起别名-->
<typeAliases>
		<typeAlias type="com.muzi.pojo.User" alias="User"/>
</typeAliases>

也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean,比如:
扫描实体类的包,它的默认别名就为这个类的类名,首字母小写。

<typeAliases>
    		<package name="com.muzi.pojo"/>
	</typeAliases>

在实体类比较少的时候,使用第一种方式。
如果实体类十分多,建议使用第二种。
第一种可以diy别名,第二种不行,如果非要改,需要在实体上增加注解

@Alias("user")
	public class User。。。

5、映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件;
方式一:

`<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>    
	<mapper resource="com/muzi/dao/UserMapper.xml"/>
</mappers>`

方式二:使用class文件绑定注册

<mappers>    
   	 <mapper class="com.muzi.dao.UserMapper"/>
</mappers>

注意点:
接口和它的Mapper配置文件必须同名。
接口和它的Mapper配置文件必须在同一个包下。
方式三:使用扫描包进行注入绑定

<mappers>    
    <package name="com.muzi.dao"/>
</mappers>

注意点:
接口和它的Mapper配置文件必须同名。
接口和它的Mapper配置文件必须在同一个包下。

发布了38 篇原创文章 · 获赞 38 · 访问量 2736

猜你喜欢

转载自blog.csdn.net/l13kddd/article/details/104612230