MyBatis---代理Dao方式的CRUD、MyBatis参数详解、MyBatis的配置文件
目录
第一章:代理Dao方式的CRUD操作
1. 代理Dao方式的增删改查
1.创建maven的java项目
2.UserMapper接口代码
3.UserTest的代码
4.UserMapper.xml的配置文件代码
5.模糊查询符号使用的区别
第二章:MyBatis参数详解
1. parameterType
2. resultType
第三章:SqlMapConfig.xml配置文件
1.在项目中定义jdbc.properties属性文件,存储数据库的相关的信息,统一管理。
2. 类型别名定义
第一章:代理Dao方式的CRUD操作
1. 代理Dao方式的增删改查
1.创建maven的java项目
2.UserMapper接口代码
package com.qcby.mapper;
import com.qcby.domain.User;
import java.util.List;
public interface UserMapper {
/**
* 查询所有
* @return
*/
public List<User> findAll();
/**
* 通过id更新数据
* @param userId
* @return
*/
public User findById(Integer userId);
/**
* 添加数据
* @param user
*/
public void insert(User user);
/**
* 通过id更新数据
* @param user
*/
public void update(User user);
/**
* 通过id删除数据
* @param userId
*/
public void delete(Integer userId);
/**
* 通过名称来模糊查找
* @param username
* @return
*/
public List<User> findByName(String username);
/**
* 统计总数据个数
* @return
*/
public Integer findByCount();
}
3.UserTest的代码
package com.qcby.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import com.qcby.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.omg.CORBA.PUBLIC_MEMBER;
public class UserTest {
private InputStream in;
private SqlSession session;
private UserMapper mapper;
@Before
public void init() throws Exception{
//加载配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 创建Session对象
session = factory.openSession();
// 获取到代理对象
mapper = session.getMapper(UserMapper.class);
}
@After
public void destory() throws IOException {
in.close();
session.close();
}
/**
* 测试查询所有的方法
* @throws Exception
*/
@Test
public void testFindAll() throws Exception{
List<User> list = mapper.findAll();
//遍历
for (User user : list) {
System.out.println(user);
}
in.close();
}
/**
* 添加
* @throws Exception
*/
@Test
public void testInsert() throws Exception{
User user = new User();
user.setUsername("美美");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("保定");
mapper.insert(user);
session.commit();
System.out.println(user.getId());
}
/**
*通过id查找数据并更新数据 使用了两个sql语句
* @throws Exception
*/
@Test
public void testUpdate() throws Exception {
User user = mapper.findById(4);
user.setUsername("小凤");
mapper.update(user);
session.commit();
}
/**
* 通过id删除数据
* @throws Exception
*/
@Test
public void testDelete() throws Exception {
mapper.delete(5);
session.commit();
}
/**
* 模糊查找
* @throws Exception
*/
// 第一种
@Test
public void testFindByName() throws Exception{
List<User> list = mapper.findByName("%王%");
for(User user:list){
System.out.println(user);
}
}
// 第二种
/*@Test
public void testFindByName() throws Exception{
List<User> list = mapper.findByName("王");
for(User user:list){
System.out.println(user);
}
}*/
/**
* 统计总数据个数
* @throws Exception
*/
@Test
public void testFindByCount() throws Exception {
Integer count = mapper.findByCount();
System.out.println("总记录数:"+count);
}
}
4.UserMapper.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="com.qcby.mapper.UserMapper">
<!--
namespace 叫做名称空间,表明以后查找UserMapper接口中的findAll的方法
-->
<!--
select id="findAll" 中的id属性编写为UserMapper接口方法的名称
resultType 表示findAll方法的返回值类型
-->
<select id="findAll" resultType="com.qcby.domain.User">
select * from user;
</select>
<!--
通过id查询
SQL语句使用#{占位符的名称,名称可以任意},仅限于基本数据类型和String类型
-->
<select id="findById" resultType="com.qcby.domain.User" parameterType="int">
select * from user where id = #{id};
</select>
<!-- 保存操作 -->
<insert id="insert" parameterType="com.qcby.domain.User">
/*
keyProperty表示要返回的属性名称
order取值AFTER表示插入数据后的行为
resultType表示返回值的类型
*/
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id();
</selectKey>
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 通过id来修改 -->
<update id="update" parameterType="com.qcby.domain.User">
update user set username = #{username},birthday = #{birthday},sex = #{sex},address= #{address} where id= #{id}
</update>
<!-- 删除 -->
<delete id="delete" parameterType="Integer">
delete from user where id = #{id}
</delete>
<!-- 模糊查询 -->
<select id="findByName" resultType="com.qcby.domain.User" parameterType="string">
<!-- 第一种方式的SQL语句 -->
select * from user where username like #{username}
<!-- 第二章SQL语句的编写 强调:'%${value}%'不能修改,固定写法(不推荐使用)
select * from user where username like '%${value}%'
-->
</select>
<!-- 具体函数的查询 -->
<select id="findByCount" resultType="int">
select count(*) from user
</select>
</mapper>
<!-- 保存操作 -->
<insert id="insert" parameterType="com.qcby.domain.User">
/*
keyProperty表示要返回的属性名称
order取值AFTER表示插入数据后的行为
resultType表示返回值的类型
*/
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id();
</selectKey>
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
保存操作解释
<selectKey>标签用于在插入数据后获取自增主键的值
比如在一个数据库中,我新添加了一条数据,如果想知道新添加的数据的id,有两种方法
1.传统方法 再写一条查询id的sql语句,但是如果数据足够多,且有重复部分,如通过名称查询,相同名称的数据有很多条(不建议)
2.通过<selectKey>标签并使用select last_insert_id() 在执行完插入数据的sql语句后获取插入的记录的主键ID
/*
keyProperty表示要返回的属性名称
order取值AFTER表示插入数据后的行为
resultType表示返回值的类型
*/
5.模糊查询符号使用的区别
#{}:通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}:通过$可以将传入的内容拼接在中且不进行类型转换,${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
第二章:MyBatis参数详解
1. parameterType
用于指定映射 SQL 语句时,传入参数的类型
parameterType 的常见值
- 简单类型:如 String, Integer, int, long, double, boolean 等。
- Java 对象:如 com.example.User 或其他 Java 类。
- Map:如果你需要传递多个参数,可以使用 Map 或 @Param 注解。
- 集合类型:如 List 或 Array,可以用来传递多个相同类型的参数。简单数据类型
1.简单数据类型
int double类型 String类型 long
简单的写法:java.lang.Integer --> int integer Int Integer 都可以,框架提供简写的方式。
//简单数据类型查询
User findById(int id);
<!-- 使用简单数据类型int查询-->
<!--<select id="findById" resultType="com.qcby.domain.User" parameterType="int">
select * from user where id = #{id};
</select>-->
<select id="findById" resultType="com.qcby.domain.User" parameterType="java.lang.Integer">
select * from user where id = #{id};
</select>
测试
/**
* 使用简单数据类型int作为参数
* @throws Exception
*/
@Test
public void findByIdTest() throws Exception{
User user = mapper.findById(1);
System.out.println(user);
}
2.POJO(JavaBean实体类)对象类型,默认是不能简写,可以配置。
User对象
//通过对象查询用户id
Integer findIdByUser(User user);
select id="findIdByUser" parameterType="com.qcby.domain.User" resultType="java.lang.Integer">
select id from user where username = #{username} and sex = #{sex}
</select>
@Test
public void findIdByUserTest() throws Exception{
User user = new User();
user.setUsername("熊大");
user.setSex("女");
Integer idByUser = mapper.findIdByUser(user);
System.out.println("User id:"+idByUser);
}
3.POJO包装对象类型
包含更多的实体类
package com.qcby.domain;
import javax.management.relation.Role;
import java.io.Serializable;
public class QueryVo implements Serializable{
/**
* 自己属性
*/
private String name;
/**
* user属性
*/
private User user;
/**
* role属性
*/
private Role role;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
包装类查询方法
//包装类查询
List<User> findByVo(QueryVo vo);
<!-- resultType 表示findByVo方法的返回值类型 -->
<!-- 包装类测试查询 -->
<select id="findByVo" parameterType="com.qcby.domain.QueryVo" resultType="com.qcby.domain.User">
select * from user where username = #{user.username}
</select>
测试
package com.qcby.mapper;
import com.qcby.domain.QueryVo;
import com.qcby.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private InputStream in;
private SqlSession session;
private UserMapper mapper;
@Before
public void init() throws Exception{
//加载配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 创建Session对象
session = factory.openSession();
// 获取到代理对象
mapper = session.getMapper(UserMapper.class);
}
@After
public void destory() throws IOException {
//关闭资源
in.close();
session.close();
}
@Test
public void findByVoTest() throws Exception {
// 创建 QueryVo 对象
QueryVo vo = new QueryVo();
User user = new User();
user.setUsername("老王"); // 设置查询条件
vo.setUser(user);
// 执行查询
List<User> list = mapper.findByVo(vo);
for (User u : list) {
System.out.println(u);
}
}
2. resultType
- 返回简单数据类型
int double long String
- 返回POJO数据类型
返回User对象类型
- resultMap结果类型
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
- resultMap 用于定义数据库字段与Java实体类属性之间的映射关系。
- id="userMap" 是映射的唯一标识,方便后续复用。
- 每个<result>标签将数据库表字段映射到对应的 Java 属性。
//使用resultMap映射,查询所有用户
List<User> findUsers();
<!-- 演示resultMap配置 -->
<select id="findUsers" resultMap="userMap">
select id as _id,username as _username,birthday as _birthday,sex as _sex,address as _address from user
</select>
<!--
配置resultMap,用来进行数据封装
id="唯一的名称,用来被引用的"
type="进行封装数据的类型"
-->
<resultMap id="userMap" type="com.qcby.domain.User">
<!--
property="JavaBean中的属性"
column="表中的字段"
-->
<result property="id" column="_id"/>
<result property="username" column="_username"/>
<result property="birthday" column="_birthday"/>
<result property="sex" column="_sex"/>
<result property="address" column="_address"/>
</resultMap>
property 和 column:
- property:对应 Java 类中的属性。
- column:对应数据库表中的字段。
SQL查询:
- 使用别名(AS)重命名数据库字段,使其与 resultMap 的 column 配置一致。
- 查询的字段 id, username, birthday, sex, address 分别重命名为 _id, _username, _birthday, _sex, _address。
测试
@Test
public void findUsersTest() throws Exception{
//查询所有用户信息
List<User> users = mapper.findUsers();
for(User user : users){
System.out.println(user);
}
}
第三章:SqlMapConfig.xml配置文件
1.在项目中定义jdbc.properties属性文件,存储数据库的相关的信息,统一管理。
<?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 resource="jdbc.properties"></properties>读取外部的配置文件
resource="文件的相对路径写法"。例如:jdbc.properties 或者 com/qcby/xxx/jdbc.properties
-->
<properties resource="jdbc.properties"></properties>
<!-- 定义别名 -->
<typeAliases>
<!--
把com.qcby.domain.User使用user别名来显示,别名user User USER 都可以,默认是忽略大写的
<typeAlias type="com.qcby.domain.User" alias="user"/>
-->
<!-- 针对com.qcby.domain包下所有的类,都可以使用当前的类名做为别名 -->
<package name="com.qcby.domain"/>
</typeAliases>
<!--<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis_db"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="2020"/>
</properties>-->
<!--
配置连接数据库的环境
environments:可以配置多个连接数据库的环境
属性:default:设置默认使用的环境的id
-->
<environments default="mysql">
<!--
environment:用来配置莫格具体的环境
属性:id,表示连接数据库的环境的唯一表示,不能重复
-->
<environment id="mysql">
<!--
transactionManager:设置事务管理方式
属性:type:"JDBC|MANAGED"
JDBC:表示当前环境中,执行sql时,使用的是JDBC中原生的事务管理方法
事务的提交或回滚需要手动处理
MANAGED:被管理,例如Spring
-->
<transactionManager type="JDBC"/>
<!--
dataSource:配置数据源
属性type:“POOLED|UNPOOLED|JNDI”
POOLED:表示使用数据库连接池缓存数据库的连接
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
-->
<!-- 配置是否需要使用连接池,POOLED使用,UNPOOLED不使用,这里使用的是mybatis自带的数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射的配置文件 -->
<mappers>
<mapper resource="com/qcby/mapper/UserMapper.xml"/>
<!--<package name="com.qcby.mapper"/>-->
</mappers>
</configuration>
jdbc.properties属性文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db
jdbc.username=root
jdbc.password=2020
2. 类型别名定义
- MyBatis自已有类型别名的注册类,咱们编写int或者integer通过注册可以找到java.lang.Integer
- 咱们自己也可以进行别名的注册
SqlMapConfig.xml的配置文件
<!-- 定义别名 -->
<typeAliases>
<!--
把com.qcby.domain.User使用user别名来显示,别名user User USER 都可以,默认是忽略大写的
<typeAlias type="com.qcby.domain.User" alias="user"/>
-->
<!-- 针对com.qcby.domain包下所有的类,都可以使用当前的类名做为别名 -->
<package name="com.qcby.domain"/>
</typeAliases>
UserMapper.xml的配置文件使用别名
<!--
resultType="com.qcby.domain.User"原来是全路径
resultType="user" 现在使用的是别名的方式
-->
<select id="findAll" resultType="user">
select * from user
</select>