Mybatis的快速入门配置,以及其中的配置理解
1.快速入门案例(未使用mapper代理方式)
(1).新建数据库,以及相关的表
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8
实体类
package pojo;
public class User {
Integer id;
String username;
String password;
public String getUsername() {
return username;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(2).创建maven项目,在pom文件中导入相关依赖坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MybatisTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="src/main" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
(3).在资源目录创建mybatis核心配置文件,修改其中的信息,比如自己电脑中数据库的端口,密码之类(通过mybatis官网)
<?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://127.0.0.1:3307/loaduser?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql的映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
(4).创建mapper.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">
<mapper namespace="dddd">
<select id="selectall" resultType="User">
select * from tb_user
</select>
</mapper>
(5).在main函数中,使用Resources(ibatis包内的).getResourceAsStream读取核心配置文件
public static void main(String[] args) throws IOException {
String resource = "mybatis.xml";
InputStream str = Resources.getResourceAsStream(resource);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(str);
SqlSession sqlSession = build.openSession();
List<User> k=sqlSession.selectList("dddd.selectall");
System.out.println(k);
}
(6)显示结果
2.使用mapper代理的方式
(1)定义与sql映射文件同名的Mapper接口,并将Mapper接口与sql映射文件置于同一目录下.
创建mapper包,设置结构
修改核心配置类中sql映射文件的路径
(2)设置sql映射文件中的namespace属性为Mapper接口全限定名
(3)在Mapper接口中定义方法,方法名即是sql映射文件中sql语句的id,并保持参数类型和返回值类型一致
创建UserMapper接口
(4).编码.
1.通过sqlsession的getmapper方法获取Mapper接口的代理对象
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
List<User> k=usermapper.selectall();
System.out.println(k);
2.调用对应方法完成sql的执行
![image-20221207163140082](mybatis%E7%9A%84%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E9%85%8D%E7%BD%AE,%E4%BB%A5%E5%8F%8A%E5%85%B6%E4%B8%AD%E7%9A%84%E9%85%8D%E7%BD%AE%E8%AE%B2%E8%A7%A3.assets/image-20221207163140082.png)
3.Mybatis核心配置文件
<?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>
<!--properties标签
username 和 password 将会由 properties 元素中设置的相应值来替换。
driver 和 url 属性将会由 datasouceconfig.properties 文件中对应的值来替换。
这样就为配置提供了诸多灵活选择。
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
首先读取在 properties 元素体内指定的属性。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
-->
<properties resource="datasouceconfig.properties">
<property name="username" value="username"/>
<property name="password" value="password"/>
</properties>
<typeAliases>
<!--
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
也可以指定一个包名
MyBatis 会在包名下面搜索需要的 Java Bean
每一个在包 pojo 中的 Java Bean.
1.在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
比如 pojo.User 的别名为 user;
2.若有注解,则别名为其注解值。
@Alias("user")其别名就是user
-->
<package name="pojo"/>
</typeAliases>
<environments default="development">
<!-- MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中,-->
<environment id="development">
<!-- 默认使用的环境 ID(比如:default="development")。
每个 environment 元素定义的环境 ID(比如:id="development")。
事务管理器的配置(比如:type="JDBC")。
数据源的配置(比如:type="POOLED")。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3307/loaduser?useSSL=false"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
<!--这些配置会告诉 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了-->
</configuration>
(具体可看https://mybatis.net.cn/configuration.html)
4.实体类中属性名称与数据库中字段名不对应
当然都是在select标签属性中设置
注意:我这里表中字段名和实体类中属性名一致,以下只是模拟展示一下使用方法
第一种方法:起别名
<?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="mapper.UserMapper">
<select id="selectall" resultType="user">
<!--给表中字段起别名-->
select id as id,username as username,password as password from tb_user;
</select>
</mapper>
第二种方法:定义sql片段,其实也是起别名,不过提高了复用性
<?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="mapper.UserMapper">
<sql id="user_column">
id as id,username as username, password
</sql>
<select id="selectall" resultType="user">
select
<include refid="user_column"></include>
from tb_user;
</select>
</mapper>
第三种:使用resultMap做映射
resultMap
元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBCResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份resultMap
能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。resultMap
期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。- 更多请看XML 映射器_MyBatis中文网
<?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="mapper.UserMapper">
<!-- id是唯一表识,type是映射的类型,支持别名-->
<resultMap id="Userresult" type="User">
<!-- id标签完成主键的映射
column 表中的列名
property 实体类的属性名
result完成一般字段的映射
-->
<id column="id" property="id" ></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
</resultMap>
<select id="selectall" resultMap="Userresult">
select * from tb_user;
</select>
</mapper>
使用方法
(1)定义resultMap标签
(2)在select标签中使用resultMap属性替换resultType属性
5.参数传递
Mybatis框架中使用条件查询可能需要接收参数,有三种接收参数的方式:
1.散装参数: 如果方法中有多个参数,需使用@Param("SQL参数占位符名称")接收
2.对象参数:对象的属性名称要和参数占位符名称一致
3.Map集合参数
实例可在条件查询中多条件查询
Mybatis提供了ParamNameResolver类来进行参数封装
1.单个参数(POJO,Map集合,Collection,List,Array,其它类型)
POJO:直接使用.属性名 和 参数占位符名称一致
Map集合:直接使用,键名 和 参数占位符名称一致
Collection:封装为Map集合
map.put("arg0",collection集合);
map.put("collection",collection集合);
List:封装为Map集合
map.put("arg0",list集合);
map.put("collection",list集合);
map.put("list",list集合);
Array:封装为Map集合
map.put("arg0",数组);
map.put("array",数组);
2.多个参数
Mybatis将接收到的参数封装成Map集合,并设置默认的键值,可使用@Param来替换默认的键值
map.put("arg0",参数值1);
map.put("param1",参数值1);
map.put("param2",参数值2);
map.put("arg1",参数值2);
如需更加深入,可看Mybatis源码
6.查询功能
(1)查询所有
sql映射文件中相应代码
<mapper namespace="mapper.UserMapper">
<!-- id是唯一表识,type是映射的类型,支持别名-->
<resultMap id="Userresult" type="User">
<id column="id" property="id" ></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
</resultMap>
<select id="selectall" resultMap="Userresult">
select * from tb_user
</select>
</mapper>
对应接口
public interface UserMapper {
List<User> selectall();
}
(2)查看详情
主函数中相关代码
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User k = mapper.selectone(32);
System.out.println(k);
sql映射文件中相关代码
<!--
*参数占位符
1.${}:拼接sql,会存在sql注入问题
2.#{}:会将其替换为?,为了防止sql注入问题
3.使用时机:
* 参数传递时:#{}
* 表名或者列名不固定的情况下:${},会存在sql注入问题
*参数类型:parameterType可不写,省略
-->
<select id="selectone" parameterType="int" resultMap="Userresult">
select * from tb_user where id = #{id};
</select>
UserMapper接口中相关方法
User selectone(int id);
运行结果如下:
(3)条件查询
1.非动态多条件查询
[1]散装参数:
需求 :根据用户输入的username与password在数据库中查找相关信息
主函数中代码
//模拟接收参数
String username="ad";
String password="7";
//对参数进行处理,毕竟是模糊查询
username="%"+username+"%";
password="%"+password+"%";
List<User> k = mapper.selectcondition(username, password);
System.out.println(k);
UserMapper接口中相关方法代码
//此处@Param()括号中对应sql映射文件中的#{}括起来的字段名
List<User> selectcondition(@Param("myname")String username,@Param("myword") String user);
Sql映射文件UserMapper.xml文件中相关代码
<select id="selectcondition" resultMap="Userresult">
select *
from tb_user where
username like #{myname} and
password like #{myword};
</select>
运行结果
[2]对象参数
需求 :根据传入的User对象在数据库中查找相应信息
主函数中相关代码
//模拟传入对象
User test=new User();
test.setId(33);
test.setUsername("1223");
test.setPassword("1223");
//调用方法
User k = mapper.selectcondition1(test);
System.out.println(k);
UserMapper接口
User selectcondition1(User one);
sql映射文件UserMapper.xml相关的代码
<select id="selectcondition1" resultMap="Userresult" >
select *
from tb_user where
id = #{id} and
username = #{username} and
password = #{password};
</select>
运行结果
[3]map集合参数
主函数中相关代码
//模拟传入map对象
Map <String,Object> map=new HashMap<>();
map.put("id",2);
map.put("username","lisi");
map.put("password","234");
//调用方法获取查询的对象
User k=mapper.selectcondition1(map);
System.out.println(k);
sql映射文件中相关代码与[2]中一样,并未修改
在UserMapper接口中新增方法
User selectcondition1(Map map);
运行结果
2.动态多条件查询
问题:用户查询不一定全部把条件输入,可能输一两个,也可能一个都不输入,这个时候就需要使用动态sql了.
主函数
//模拟传入对象
User test=new User();
// test.setId(2);
test.setUsername("lisi");
test.setPassword("234");
//调用方法
User k = mapper.selectcondition1(test);
System.out.println(k);
接口方法
User selectcondition1(User one);
sql映射文件
<!-- *if标签: 条件判断
*test:逻辑表达式
产生的问题如何解决
*恒等式
*<where>
-->
<select id="selectcondition1" resultMap="Userresult" >
select *
from tb_user where 1 = 1
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != '' ">
and username = #{username}
</if>
<if test="password != null and password != '' ">
and password = #{password};
</if>
</select>
运行结果
使用
<select id="selectcondition1" resultMap="Userresult" >
select *
from tb_user
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != '' ">
and username = #{username}
</if>
<if test="password != null and password != '' ">
and password = #{password};
</if>
</where>
</select>
3.单条件的动态查询
问题:下拉框有多个选择.从多个选择中选择一个.
choose、when、otherwise
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
主函数中代码
//模拟传入对象
User test=new User();
test.setId(1);
test.setUsername("lisi");
test.setPassword("1223");
//调用方法
User k = mapper.selectconditionbyone(test);
System.out.println(k);
UserMapper接口中相关代码
User selectconditionbyone(User one);
UserMapper.xml映射文件中相关代码
<!-- choose标签相当于java里面的switch -->
<!-- when标签相当于java中switch里面的case-->
<!-- otherwise标签相当于java中switch里面的default
1 = 1防止用户什么都不输入报错
-->
<select id="selectconditionbyone" resultType="pojo.User">
select *
from tb_user where
<choose>
<when test="id != null">
id = #{id};
</when>
<when test="username != null and username != ''">
username = #{username};
</when>
<when test="password != null and password != '' ">
password = #{password};
</when>
<otherwise>
1 = 1;
</otherwise>
</choose>
</select>
7.添加修改
首先需要设置自动提交或者手动提交事务
手动提交 : sqlsession.commit();
自动提交 : sqlsessionfactory.opensession(true);
insert、delete、update操作默认返回一个int类型的整数,将增删改的接口改成int或者void即可。
1.添加
1.基础添加
主函数中相关代码
//模拟传入对象
User test=new User();
test.setUsername("lisddi");
test.setPassword("1223dd");
//调用方法
mapper.addbase(test);
sqlSession.commit();
System.out.println(mapper.selectall());
UserMapper接口中相关代码
void addbase(User one);
Sql映射文件中代码
<insert id="addbase">
insert into tb_user (username,password) values (#{username},#{password});
</insert>
运行结果
2.主键返回添加
只需在基础的添加之上设置两个标签的值,以及更改接口的返回类型即可
主函数相关代码
//模拟传入对象
User test=new User();
test.setUsername("lisdfdddi");
test.setPassword("1sdf23dd");
//调用方法
mapper.addreturn(test);
sqlSession.commit();
System.out.println(test.getId());
接口方法相关代码
void addreturn(User one);
sql映射文件
<insert id="addreturn" useGeneratedKeys="true" keyProperty="id">
insert into tb_user (username,password) values (#{username},#{password});
</insert>
运行结果
2.修改
问题:修改数据
1.修改全部字段
主函数相关代码
//模拟传入对象
User test=new User();
test.setId(34);
test.setUsername("lwew");
test.setPassword("1111");
//调用方法
mapper.updateall(test);
sqlSession.commit();
System.out.println(test.getId());
接口
void updateall(User one);
sql映射文件
<update id="updateall">
update tb_user
set
username = #{username},
password = #{password}
where
id = #{id};
</update>
程序运行结果
2.修改动态字段
主函数相关代码
//模拟传入对象
User test=new User();
test.setId(34);
test.setPassword("2222");
//调用方法
mapper.updateooo(test);
sqlSession.commit();
UserMapper接口相关方法
void updateooo(User one);
sql映射文件相关代码
<update id="updateooo">
update tb_user
<set>
<if test="username != null and username != '' ">
username = #{username},
</if>
<if test="password != null and password != '' ">
password = #{password}
</if>
</set>
where id = #{id};
</update>
运行结果
8.删除功能
1.删除一个
主函数相关代码
//模拟传入对象
User test=new User();
// test.setId(34);
test.setPassword("2222");
//调用方法
mapper.deleteById(test);
sqlSession.commit();
UserMapper接口相关方法
void deleteById(User one);
sql映射文件相关代码
<delete id="deleteById">
delete
from tb_user
where id = #{id};
</delete>
运行结果
2.删除多个
传入id数组,删除多个数据
主函数相关代码
//模拟传入对象
List a= new ArrayList<>();
a.add(36);
a.add(40);
//调用方法
mapper.deleteids(a);
sqlSession.commit();
UserMapper接口相关方法
// 为什么要加@Param注解?
// mybatis会将数组参数,封装为一个Map集合.
// 默认:array = 数组
// 也可以使用@Param注解改变Map集合默认的key的名称
void deleteids(@Param("ids") List<Integer> ids);
sql映射文件相关代码
<!-- delete from 表名 where id in (?,?,?,?)
这里使用动态sql
collection对应遍历数组的名字
-->
<delete id="deleteids">
delete
from tb_user
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
程序运行结果
9.特殊字符处理
在sql映射文件中编写条件判断的时候使用 <,>之类的符号idea报错
特殊字符处理方法
1.转义字符:
2.CDATA区
使用将需要使用的符号包裹起来,以下是实际的例子使用
<select id="selectone" parameterType="int" resultMap="Userresult">
select * from tb_user where id <![CDATA[
<
]]> 78;
</select>
10.注解开发
使用注解开发方式会比配置文件开发更加方便快捷,但不适合写一些比较复杂的sql语句
以下举个例子:
@Select("select *from tb_user where id = #{id}")
public User selectok(int id);
查询 | @Select |
---|---|
添加 | @Insert |
修改 | @Update |
删除 | @Delete |
本篇笔记只是对自己学习Mybatis框架时的记录,一些知识点可能并不透彻,若要详细学习,还请移步MyBatis中文网或者查看Mybatis源码
谢谢观看!
标签:username,入门,配置,test,User,sql,mybatis,password,id From: https://www.cnblogs.com/lixubing/p/16992529.html