posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

官方文档:https://mybatis.org/mybatis-3/zh/getting-started.html
视频:https://www.bilibili.com/video/BV1NE411Q7Nx?p=7
1、WMS_dao\pom.xml,要在哪个项目中使用就在哪个pom文件中加配置

复制代码
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.tld</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
复制代码

2、添加mybatis核心配置文件WMS_dao\src\main\resources\mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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://192.168.2.39:3306/saasDb?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/jay/dao/SysUserMapper.xml"/>
    </mappers>
</configuration>

3、WMS_dao\src\main\java\com\jay\utils\MybatisUtils类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.jay.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;
 
//sqlSessionFactory>sqlSession
public class MybatisUtils {
    private  static  SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

4、编写实体类,和数据库表对应,实体类放在WMS_dao\src\main\java\com\jay\pojo中;
编写接口WMS_dao\src\main\java\com\jay\dao\SysUserMapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.jay.dao;
 
import com.jay.pojo.sys_user;
 
import java.util.List;
import java.util.Map;
 
public interface SysUserMapper {
    sys_user selectUser(int id);
    List<sys_user> selectUserList();
    List<sys_user> selectUserListByNickName(String name);
    void updateNickName(Map<String,Object> map);
    void addUser(Map<String,Object> map);
    void deleteUser(int id);
}

5、编写实现WMS_dao\src\main\java\com\jay\dao\SysUserMapper.xml,xml中使用 mapper中的namespace指定映射的接口类。

mapper下节点类型select/update/insert/delete
这个xml文件需要在mybatis-config.xml中映射 mappers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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="com.jay.dao.SysUserMapper">
    <!-- 只有一个参数可以直接写,参数名字需要和接口中的名字一致 -->
    <select id="selectUser" resultType="com.jay.pojo.sys_user">
    select * from sys_user where user_id = #{id}
    </select>
    <!-- 返回类型如果是List泛型集合,resultType写泛型类型 -->
    <select id="selectUserList" resultType="com.jay.pojo.sys_user">
    select * from sys_user
    </select>
    <select id="selectUserListByNickName" parameterType="string" resultType="com.jay.pojo.sys_user">
    select * from sys_user where nick_name like #{name}
    </select>
    <!-- update语句中的参数name/id就是参数map中的key -->
    <update id="updateNickName" parameterType="map">
        update sys_user set nick_name=#{nick_name} where user_id=#{user_id}
    </update>
    <insert id="addUser" parameterType="map">
        insert into sys_user(user_name,nick_name)values(#{user_name},#{nick_name})
    </insert>
    <delete id="deleteUser" parameterType="int">
        delete from sys_user where user_id=#{id}
    </delete>
</mapper>

  测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.jay;
 
import static org.junit.Assert.assertTrue;
 
import com.jay.dao.SysUserMapper;
import com.jay.pojo.sys_user;
import com.jay.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * Unit test for simple App.
 */
public class AppTest {
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue() {
        assertTrue(true);
    }
    @Test
    public void testSelectUser() {
        try(SqlSession session = MybatisUtils.getSqlSession()) {
            SysUserMapper userMapper = session.getMapper(SysUserMapper.class);
            sys_user sysu = userMapper.selectUser(1);
            System.out.println(sysu);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    @Test
    public void testSelectUserList() {
        try(SqlSession session = MybatisUtils.getSqlSession()) {
            SysUserMapper userMapper = session.getMapper(SysUserMapper.class);
            List<sys_user> sys_users = userMapper.selectUserList();
            for (sys_user item :sys_users) {
                System.out.println(item);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    @Test
    public void testSelectUserListByNickName()
    {
        try(SqlSession session = MybatisUtils.getSqlSession()) {
            SysUserMapper userMapper = session.getMapper(SysUserMapper.class);
            List<sys_user> sys_users = userMapper.selectUserListByNickName("%jay%");
            System.out.println(sys_users);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    @Test
    public void testUpdateNickName()
    {
        try(SqlSession session = MybatisUtils.getSqlSession()) {
            SysUserMapper userMapper = session.getMapper(SysUserMapper.class);
            Map<String,Object> map = new HashMap<>();
            map.put("user_id",1);
            map.put("nick_name","luna");
            userMapper.updateNickName(map);
            session.commit();//增、删、改都需要commit()提交事务
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    @Test
    public void testAddUser()
    {
        try(SqlSession session = MybatisUtils.getSqlSession()) {
            SysUserMapper userMapper = session.getMapper(SysUserMapper.class);
            Map<String,Object> map = new HashMap<>();
            map.put("user_name","jack");
            map.put("nick_name","jack");
            userMapper.addUser(map);
            session.commit();//增、删、改都需要commit()提交事务
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    @Test
    public void testDeleteUser()
    {
        try(SqlSession session = MybatisUtils.getSqlSession()) {
            SysUserMapper userMapper = session.getMapper(SysUserMapper.class);
            userMapper.deleteUser(5);
            session.commit();//增、删、改都需要commit()提交事务
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

6、mybatis-config.xml引入db.properties
WMS_dao\src\main\resources\db.properties

1
2
3
4
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://192.168.2.39:3306/testdb?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

在mybatis-config.xml中加入配置properties,这个要放在configuration下,配置节是有顺序的settings。
<properties resource="db.properties" />
然后mybatis-config.xml中就可以修改为:参数名字要和db.properties中key一样。

1
2
3
4
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>

 也可以在<properties></properties>中间加入配置,如果key相同,优先使用db.properties中的配置。

1
2
3
<properties resource="db.properties">
      <property name="username" value="admin"/>
</properties>

 类型别名,mybatis-config.xml加配置:

1
2
3
4
5
6
<typeAliases>
        <!-- 为实体类指定别名 -->
        <!--<typeAlias type="com.jay.pojo.sys_user" alias="SysUser"></typeAlias>-->
        <!-- 为com.jay包下的所有实体类指定默认别名,骆驼命名 SysUser=>sysUser -->
        <package name="com.jay"/>
    </typeAliases>

 然后在SysUserMapper.xml中的resultType就不用写完全限定名,使用别名就好:resultType="SysUser"或者resultType="sys_user"
还可以在实体类上面使用注解别名:@Alias("sys_user")。如果返回的是基本数据类型,要在基本类型前加下划线resultType="_int"。

7、映射器mappers,在核心配置文件中mybatis-config.xml需要注册接口和实现xml的映射关系。
 方式一,通过相对路径绑定Mapper(推荐)

1
2
3
<mappers>
<mapper resource="com/jay/dao/SysUserMapper.xml"/>
</mappers>

 方式二,使用class文件绑定映射,注意:对应的Mapper文件必须要再同级目录下且名字要一样。

1
2
3
<mappers>
<mapper class="com.jay.dao.SysUserMapper"></mapper>
</mappers>

 方式三,使用扫描包来绑定映射,注意:对应的Mapper文件必须要再同级目录下且名字要一样。

1
2
3
<mappers>
<package name="com.jay.dao"/>
</mappers>

生命周期和作用域,错误使用会导致严重的并发问题。<dataSource type="POOLED">

8、结果集映射,把resultType改成resultMap,新建一个resultMap配置,解决实体字段名称和sql返回字段不一致问题,只需要把不一样的字段配置好就行,一样的会自动映射。
参考:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps
<select id="selectBlogDetails" resultMap="detailedBlogResultMap">sql语句</select>

//autoMapping:如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。
<resultMap id="detailedBlogResultMap" type="Blog" autoMapping="unset">
<constructor>
  <idArg column="blog_id" javaType="int"/>
</constructor>
<!-- property是Blog中的属性名称,column是sql查询的字段名 -->
<id property="id" column="user_id"/>
<result property="username" column="author_username"/>
<!-- Blog类包含Author类 -->
<association property="author" javaType="Author">
  <id property="id" column="author_id"/>
  <result property="username" column="author_username"/>
</association>
<!-- Blog类中包含posts属性,posts属性是List<Post>集合 -->
<collection property="posts" ofType="Post">
  <id property="id" column="post_id"/>
  <result property="subject" column="post_subject"/>
</collection>
<discriminator javaType="int" column="draft">
  <case value="1" resultType="DraftPost"/>
</discriminator>
</resultMap>

结果映射(resultMap)
constructor - 用于在实例化类时,注入结果到构造方法中
  idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
  arg - 将被注入到构造方法的一个普通结果
id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果
association – 一个复杂类型的关联;许多结果将包装成这种类型
  嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
collection – 一个复杂类型的集合
  嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
discriminator – 使用结果值来决定使用哪个 resultMap
  case – 基于某些值的结果映射
    嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射

9、日志工厂:https://mybatis.org/mybatis-3/zh/logging.html
使用Log4j,mybatis-config.xml配置settings,不能拼错。
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
新建配置文件WMS_dao\src\main\resources\log4j.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
log4j.rootLogger=DEBUG,console,file
 
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
 
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
 
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 pom.xml中加入引用

1
2
3
4
5
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

 使用,引入:import org.apache.log4j.Logger;,在类中声明:static Logger logger = Logger.getLogger(SysUserMapper.class);输出日志:logger.error("测试ERROR");
在控制台和log/kuang.log中就可以看到结果。
分页查询

1
2
3
<select id="selectUserPages" parameterType="map" resultType="sys_user">
    select * from sys_user limit #{startIndex},#{pageSize}
</select>

动态Sql:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
10、插入数据库主键自增和主键不自增,需要返回主键,sql
自增:<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="java.lang.Integer">SELECT LAST_INSERT_ID()</selectKey>
不自增,在插入前给主键参数id赋值,对应属性名id,对应列名id:<selectKey keyProperty="id" keyColumn="id" order="BEFORE" resultType="java.lang.String">select replace(UUID(),'-','')</selectKey>
11、Mybatis动态SQL:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
12、sql注入:like查询的时候不要用 like '%${param}%' 这种方式,有sql注入风险,用like #{param} 然后传入的param中拼接%,例如:param="%水果%",或者使用CONCAT('%',#{param},'%')

posted on   邢帅杰  阅读(562)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示