目录

3 基于代理Dao实现CRUD操作

使用要求:

1、持久层接口和持久层接口的映射配置必须在相同的包下。

2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名。

3、SQL 语句的配置标签<select>,<insert>,<delete>,<update>的 id 属性必须和持久层接口的方法名相同。

3.1 根据id查询

3.1.1 在持久层接口中添加findById方法

/**
* 根据id查询用户
* @param userId
* @return
*/
User findById(Integer userId);

3.1.2 在用户的映射配置文件中配置

    <!--查询用户-->
<select id="findById" parameterType="int" resultType="com.zjw.domain.User">
select * from user where id = #{userId} ;
</select>

resultType属性: 用于指定结果集的类型

parameterType属性:用于指定传入参数的类型

sql语句中使用#{}字符

它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。

具体的数据是由#{}里面的内容决定的。

#{}中内容的写法

由于数据类型是基本类型,所以此处可以随意写。

3.1.3 在测试类添加测试

package com.zjw.test;

import com.zjw.dao.IUserDao;
import com.zjw.domain.QueryVo;
import com.zjw.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.Date;
import java.util.List; public class TestDao { private InputStream in ;
private SqlSessionFactoryBuilder builder;
private SqlSessionFactory factory ;
private SqlSession session ;
private IUserDao userDao ; @Before
public void init() throws Exception{
//读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
//使用工厂生成SqlSession对象
session = factory.openSession();
//使用SqlSession穿过将Dao接口的代理对象
userDao = session.getMapper(IUserDao.class);
} @After
public void destory() throws Exception{
session.close();
in.close();
} /**
* 测试查询用户
*/
@Test
public void testfindById(){
User user = userDao.findById(50);
System.out.println(user);
} }

3.2 保存操作

3.2.1 在持久层接口中添加新增方法

    /**
* 保存用户
* @param user
*/
void saveUser(User user);

3.2.2 在用户䣌映射配置文件中配置

<!--保存用户-->
<insert id="saveUser" parameterType="com.zjw.domain.User">
insert into user(username,address,birthday,sex) values (#{userName},#{userAddress},#{userBirthday},#{userSex}) ;
</insert>

细节:

parameterType 属性:

代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

sql 语句中使用#{}字符:

它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。

具体的数据是由#{}里面的内容决定的。

#{}中内容的写法:

由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。

它用的是 ognl 表达式。

ognl 表达式

它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言

它是按照一定的语法格式来获取数据的。

语法格式就是使用 #{对象.对象}的方式

#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.而直接写 username。

3.2.3 在测试类中的测试方法

    /**
* 测试保存操作
* @throws IOException
*/
@Test
public void testSaveUser(){ User user = new User();
user.setUserName("朱俊伟1231231232");
user.setUserAddress("河南");
user.setUserBirthday(new Date());
user.setUserSex("男"); userDao.saveUser(user);
}

打开 Mysql 数据库发现并没有添加任何记录,原因是什么?

这一点和 jdbc 是一样的,我们在实现增删改时一定要去控制事务的提交,那么在 mybatis 中如何控制事务提交呢?

可以使用:session.commit();来实现事务提交。加入事务提交后的代码如下:

    @After
public void destory() throws Exception{
session.commit();
session.close();
in.close();
}

3.2.4 问题扩展:新增用户id的返回值

新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。

    <!--保存用户后返回id-->
<insert id="saveUserReturnId" parameterType="com.zjw.domain.User">
<selectKey keyProperty="userId" keyColumn="id" order="AFTER" resultType="int">
select LAST_INSERT_ID();
</selectKey>
insert into user(username,address,birthday,sex) values (#{userName},#{userAddress},#{userBirthday},#{userSex}) ;
</insert>
     /**
* 测试保存返回id操作
* @throws IOException
*/
@Test
public void testSaveUserReturnId(){ User user = new User();
user.setUserName("testInsert id");
user.setUserAddress("河南");
user.setUserBirthday(new Date());
user.setUserSex("男"); System.out.println(user);//插入前打印无id
userDao.saveUserReturnId(user);
System.out.println(user);//插入后打印有id
}

3.3 用户更新

3.3.1 在持久层接口中添加更新方法

     /**
* 更新用户
* @param user
*/
void updateUser(User user);

3.3.2 在用户的映射配置文件中配置

    <!--更新用户-->
<update id="updateUser" parameterType="com.zjw.domain.User">
update user set username=#{userName},address=#{userAddress},birthday=#{userBirthday},sex=#{userSex} where id=#{userId};
</update>

3.3.3 加入更新的测试方法

     /**
* 测试更新操作
*/
@Test
public void testUpdateUser(){ User user = new User();
user.setUserId(50);
user.setUserName("王二");
user.setUserAddress("河南11111111");
user.setUserBirthday(new Date());
user.setUserSex("男"); userDao.updateUser(user);
}

3.4 用户删除

3.4.1 在持久层接口中添加删除方法

    /**
* 删除用户
* @param userId
*/
void deleteUser(Integer userId);

3.4.2 在用户的映射配置文件中配置

    <!--删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{userId};
</delete>

3.4.3 加入删除的测试方法


/**
* 测试删除操作
*/
@Test
public void testDeleteUser(){
userDao.deleteUser(48);
}

3.5 用户模糊查询

3.5.1 在持久层接口最终添加模糊查询方法

    /**
* 根据名字模糊查询用户
* @param userName
* @return
*/
List<User> findByName(String userName);

3.5.2 在用户的映射配置文件中配置

    <!--根据名字模糊查询用户-->
<select id="findByName" parameterType="String" resultType="com.zjw.domain.User">
<!--使用的占位符,推荐使用,不过参数要加上%-->
<!-- select * from user where username like #{userName};--> <!--使用的是字符串拼接,参数不用加%,但是会有sql注入问题-->
select * from user where username like '%${value}%';
</select>

3.5.3 加入模糊查询的测试方法

    /**
* 测试根据名字模糊查询用户
*/
@Test
public void testFindByName(){
//使用#{} , 需要加%
// List<User> userList = userDao.findByName("%王%");
//使用${} , 不用加%
List<User> userList = userDao.findByName("王");
for (User user : userList) {
System.out.println(user);
}
}

3.5.4 #{}和${}的区别

#{}表示一个占位符号

通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。

${}表示拼接 sql 串

通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,${}可以接收简

单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

3.6 查询使用聚合函数

3.6.1在持久层接口中添加模糊查询方法

    /**
* 查询用户的所有记录数
* @return
*/
int findTotal();

3.6.2 在用户的映射配置文件中配置

    <select id="findTotal" resultType="int" >
select count(*) from user;
</select>

3.6.3 加入聚合查询的测试方法

    /**
* 查询用户的条数
*/
@Test
public void testFindTotal(){
int total = userDao.findTotal();
System.out.println(total);
}

3.7 Mybatis与JDBC编程的比较

1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:

在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

解决:

将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。

3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。

解决:

Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。

4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。

解决:

Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型

4 Mybatis的参数深入

4.1 parameterType配置参数

4.1.1 使用说明

我们在上一章节中已经介绍了 SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。

4.1.2 注意事项

基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang.String。

实体类类型,目前我们只能使用全限定类名。

究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。在今天课程的最后一个章节中将讲解如何注册实体类的别名。

在 mybatis 的官方文档的说明(https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases)

这些都是支持的默认别名。我们也可以从源码角度来看它们分别都是如何定义出来的。

可以参考 TypeAliasRegistery.class 的源码。

4.2 传递pojo包装对象

开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

Pojo 类中包含 pojo。

需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。

4.2.1 编写QueryVo

package com.zjw.domain;

public class QueryVo {

    private User user;

    public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}

4.2.2 编写持久层接口

    /**
* 根据queryVo中的条件查询用户
*/
List<User> findUserByVo(QueryVo queryVo);

4.2.3 持久层接口的映射文件

    <!--根据queryVo的添加查询用户-->
<select id="findUserByVo" parameterType="com.zjw.domain.QueryVo" resultType="com.zjw.domain.User">
<!--ognl表达式:
user:QueryVo类中的属性
-->
select * from user where username like #{user.userName};
</select>

4.2.4 测试包装类作为参数

    /**
* 测试QueryVo查询用户
*/
@Test
public void testFindUserByVo(){
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUserName("%王%");
queryVo.setUser(user); List<User> userList = userDao.findUserByVo(queryVo);
for (User u : userList) {
System.out.println(u);
}
}

5 Mybatis的输出结果封装

5.1 resultType配置结果类型

 resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。

  我们在前面的 CRUD 案例中已经对此属性进行过应用了。

  需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名(今天最后一个章节会讲解如何配置实体类的别名)

  同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。

5.1.1 特殊情况(属性名和列名不一致)

5.1.1.1 数据库,User类

5.1.1.2 Dao接口

    /**
* 查询所有用户
* @return
*/
List<User> findAll();

5.1.1.3 映射配置

    <!--查询所有-->
<select id="findAll" resultType="com.zjw.domain.User">
select * from user;
</select>

5.1.1.4 测试查询结果

    /**
* 测试查询操作
* @throws IOException
*/
@Test
public void testFindAll() throws IOException { //使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
User{userId=null, userName='老王', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='小二王', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='小二王', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='传智播客', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='老王', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='testInsert id', userAddress='null', userSex='null', userBirthday=null}
User{userId=null, userName='mybatis annotation', userAddress='null', userSex='null', userBirthday=null}

发现名称有值,因为windows系统不区分大小写。其他值均为null.

可以通过给列名取别名实现封装。也可以使用resultMap结果类型。

5.1.1.5 修改映射配置

    <select id="findAll"  resultType="com.zjw.domain.User">
select id as userId,
username as userName,
birthday as userBirthday,
sex as userSex,
address as userAddress
from user;
</select>

通过给列名取别名可以实现封装,但是太麻烦!

5.2 resultMap结果类型

 resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。

 在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。

5.2.1 定义resultMap


<resultMap id="userMap" type="User">
<id property="userId" column="id"/>
<result property="userName" column="username"/>
<result property="userAddress" column="address"/>
<result property="userBirthday" column="birthday"/>
<result property="userSex" column="sex"/>
</resultMap>

id 标签:用于指定主键字段

result 标签:用于指定非主键字段

column 属性:用于指定数据库列名

property 属性:用于指定实体类属性名称

5.2.2 映射配置

    <!--查询所有-->
<select id="findAll" resultMap="userMap">
select * from user;
</select>

使用resultMap属性指定我们定义的id

6 Mybatis传统Dao层开发[了解]

使用 Mybatis 开发 Dao,通常有两个方法,即原始 Dao 开发方式和 Mapper 接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。我们的课程讲解也主要以接口代理开发方式为主。在第二章节已经给大家介绍了基于代理方式的 dao 开发,现在给大家介绍一下基于传统编写 Dao 实现类的开发方式。

6.1 Mybatis实现Dao的传统开发方式

6.1.1 持久层Dao接口

package com.zjw.dao;

import com.zjw.domain.User;

import java.util.List;

/**
* 用户的持久层接口
*/
public interface IUserDao { /**
* 查询所有用户
* @return
*/
List<User> findAll(); /**
* 保存用户
* @param user
*/
void saveUser(User user); void saveUserReturnId(User user); /**
* 更新用户
* @param user
*/
void updateUser(User user); /**
* 删除用户
* @param userId
*/
void deleteUser(Integer userId); /**
* 根据id查询用户
* @param userId
* @return
*/
User findById(Integer userId); /**
* 根据名字模糊查询用户
* @param userName
* @return
*/
List<User> findByName(String userName); /**
* 查询用户的所有记录数
* @return
*/
int findTotal();
}

6.1.2 持久层Dao实现类

package com.zjw.dao.impl;

import com.zjw.dao.IUserDao;
import com.zjw.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import java.util.List; public class UserDaoImpl implements IUserDao { private SqlSessionFactory factory ; public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory ;
} public List<User> findAll() {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现查询列表
List<User> users = session.selectList("com.zjw.dao.IUserDao.findAll");//参数就是能获取配置信息的key(namespace+id)
//3、释放资源
session.close();
return users;
} public void saveUser(User user) {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现保存用户操作
session.insert("com.zjw.dao.IUserDao.saveUser",user);//参数就是能获取配置信息的key(namespace+id),要操作的对象
//3、释放资源
session.commit();
session.close();
} public void saveUserReturnId(User user) { } public void updateUser(User user) {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现保存用户操作
session.update("com.zjw.dao.IUserDao.updateUser",user);//参数就是能获取配置信息的key(namespace+id)
//3、释放资源
session.commit();
session.close();
} public void deleteUser(Integer userId) {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现保存用户操作
session.delete("com.zjw.dao.IUserDao.deleteUser",userId);//参数就是能获取配置信息的key(namespace+id)
//3、释放资源
session.commit();
session.close();
} public User findById(Integer userId) {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现保存用户操作
User user = session.selectOne("com.zjw.dao.IUserDao.findById", userId);//参数就是能获取配置信息的key(namespace+id)
//3、释放资源
session.close();
return user ;
} public List<User> findByName(String userName) {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现保存用户操作
List<User> users = session.selectList("com.zjw.dao.IUserDao.findByName", userName);//参数就是能获取配置信息的key(namespace+id)
//3、释放资源
session.close();
return users ;
} public int findTotal() {
//1、获取SqlSession对象
SqlSession session = factory.openSession();
//2、调用SqlSession中的方法,实现保存用户操作
int count = session.selectOne("com.zjw.dao.IUserDao.findTotal");//参数就是能获取配置信息的key(namespace+id)
//3、释放资源
session.close();
return count ;
}
}

6.1.3 持久层映射配置

<?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.zjw.dao.IUserDao"> <!--查询所有-->
<select id="findAll" resultType="com.zjw.domain.User" >
select * from user;
</select> <!--保存用户-->
<insert id="saveUser" parameterType="com.zjw.domain.User">
insert into user(username,address,birthday,sex) values (#{username},#{address},#{birthday},#{sex}) ;
</insert> <!--保存用户后返回id-->
<insert id="saveUserReturnId" parameterType="com.zjw.domain.User">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select LAST_INSERT_ID();
</selectKey>
insert into user(username,address,birthday,sex) values (#{username},#{address},#{birthday},#{sex}) ;
</insert> <!--更新用户-->
<update id="updateUser" parameterType="com.zjw.domain.User">
update user set username=#{username},address=#{address},birthday=#{birthday},sex=#{sex} where id=#{id};
</update> <!--删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{userId};
</delete> <!--查询用户-->
<select id="findById" parameterType="INTEGER" resultType="com.zjw.domain.User">
select * from user where id = #{userId} ;
</select> <!--根据名字模糊查询用户-->
<select id="findByName" parameterType="String" resultType="com.zjw.domain.User">
<!--使用的占位符,推荐使用,不过参数要加上%-->
select * from user where username like #{userName}; <!--使用的是字符串拼接,参数不用加%,但是会有sql注入问题-->
<!-- select * from user where username like '%${value}%';-->
</select> <select id="findTotal" resultType="int" >
select count(*) from user;
</select>
</mapper>

6.1.4 测试类

package com.zjw.test;

import com.zjw.dao.IUserDao;
import com.zjw.dao.impl.UserDaoImpl;
import com.zjw.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.Date;
import java.util.List; public class TestDao { private InputStream in ;
private SqlSessionFactoryBuilder builder;
private SqlSessionFactory factory ;
private SqlSession session ;
private IUserDao userDao ; @Before
public void init() throws Exception{
//读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
//使用工厂生成dao对象
userDao = new UserDaoImpl(factory);
} @After
public void destory() throws Exception{
//释放资源
in.close();
} /**
* 测试查询操作
* @throws IOException
*/
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
} /**
* 测试保存操作
* @throws IOException
*/
@Test
public void testSaveUser(){ User user = new User();
user.setUsername("testInsert user...");
user.setAddress("河南");
user.setBirthday(new Date());
user.setSex("男"); userDao.saveUser(user);
} /**
* 测试保存返回id操作
* @throws IOException
*/
@Test
public void testSaveUserReturnId(){ User user = new User();
user.setUsername("testInsert user...");
user.setAddress("河南");
user.setBirthday(new Date());
user.setSex("男"); userDao.saveUser(user);
} /**
* 测试更新操作
*/
@Test
public void testUpdateUser(){ User user = new User();
user.setId(50);
user.setUsername("朱俊伟111");
user.setAddress("河南11111111");
user.setBirthday(new Date());
user.setSex("男"); userDao.updateUser(user);
} /**
* 测试删除操作
*/
@Test
public void testDeleteUser(){
userDao.deleteUser(53);
} /**
* 测试查询用户
*/
@Test
public void testfindById(){
User user = userDao.findById(50);
System.out.println(user);
} /**
* 测试根据名字模糊查询用户
*/
@Test
public void testFindByName(){
//使用#{} , 需要加%
List<User> userList = userDao.findByName("%王%");
//使用${} , 不用加%
// List<User> userList = userDao.findByName("王");
for (User user : userList) {
System.out.println(user);
}
} /**
* 查询用户的条数
*/
@Test
public void testFindTotal(){
int total = userDao.findTotal();
System.out.println(total);
}
}

7 SqlMapConfig.xml配置文件

7.1 配置内容

7.1.1 SqlMapConfig.xml中配置的内容和顺序

-properties(属性)
--property
-settings(全局配置参数)
--setting
-typeAliases(类型别名)
--typeAliase
--package
-typeHandlers(类型处理器)
-objectFactory(对象工厂)
-plugins(插件)
-environments(环境集合属性对象)
--environment(环境子属性对象)
---transactionManager(事务管理)
---dataSource(数据源)
-mappers(映射器)
--mapper
--package

7.2 properties(属性)

在使用properties配置标签时,我们可以采用两种方式指定属性配置。

7.2.1 第一种

<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="1234"/>
</properties>

7.2.2 第二种

7.2.2.1 在classpath下定义properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy?serviceTimezone=Asia/Shanghai&useSSL=false
jdbc.username=root
jdbc.password=123456

7.2.2.2 properties标签配置


<!--<properties url="file:///E:\code\IdeaProjects\mybatis\day02_eesy_01mybatisCRUD\src\main\resources\jdbcConfig.properties"/>-->
<properties resource="jdbcConfig.properties"/>

7.2.3 此时我们的dataSource标签就编程了引用上面的配置

<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>

7.3 typeAliases(类型别名)

在前面我们讲的 Mybatis 支持的默认别名,我们也可以采用自定义别名方式来开发

7.3.1 自定义别名

    <!--  使用typeAliases配置别名,它只能配置domain中的类的别名  -->
<typeAliases>
<!-- typeiAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就再区分大小写 -->
<!-- <typeAlias type="com.zjw.domain.User" alias="user"></typeAlias>-->
<!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写 -->
<package name="com.zjw.domain"/>
</typeAliases>

7.4 mappers(映射器)

7.4.1 resource

使用相对于类路径的资源

如:

<mapper resource="com/zjw/dao/IUserDao.xml" />

7.4.2 class

使用mapper接口类路径

如:

<mapper class="com.zjw.dao.UserDao"/>

注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

7.4.3 package

注册指定包下的所有mapper接口

如:

<package name="com.zjw.dao"/>

注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

Mybatis 框架课程第二天的更多相关文章

  1. MyBatis框架 课程笔记

    MyBatis框架 课程笔记   第1章 MyBatis简介 1.1 MyBatis历史 1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Softw ...

  2. mybatis框架的第二天

    一.mybatis的基础crud的操作 先在接口中,写对应的方法名称,返回类型,访问符. 之后在映射配置文件中,写具体的实现 二.mybati中crud的细节 1.模糊查询 这是接口中 这是xml中 ...

  3. MyBatis框架之第二篇

    1.高级参数映射和返回值映射(重点) a)Pojo包装pojo的参数映射 b)当结果集列名与pojo属性名不一致的返回值映射 2.动态sql(重点) 3.关联查询结果(重点) a)一对一关联结果 b) ...

  4. Mybatis框架Day01(上)

    框架课程 1 课程计划 第一天: 1.mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开 ...

  5. 01 mybatis框架整体概况(2018.7.10)-

    01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...

  6. MyBatis框架之第一篇

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...

  7. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  8. Hibernate框架与Mybatis框架的对比

    学习了Hibernate和Mybatis,但是一直不太清楚他们两者的区别的联系,今天在网上翻了翻,就做了一下总结,希望对大家有帮助! 原文:http://blog.csdn.net/firejuly/ ...

  9. MyBatis框架

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的xml或者注解用于 ...

  10. MyBatis 框架笔记

    Mybatis 框架笔记   ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1       Mybatis入门 1.1     单独使用jdbc编程问题总结 1.1.1  jd ...

随机推荐

  1. 使用-数据湖Iceberg和现有hive数仓打通并使用

    一.集群配置 1.版本使用 技术 版本 iceberg 1.3.1 flink 1.16.1 spark 3.2.1 hive 2.3.7 dlc-presto 待定 2.集群配置调整 (1)使用hi ...

  2. Atcoder ABC342D Square Pair 题解 [ 绿 ] [ 数论 ] [ 唯一分解定理 ]

    Square Pair:唯一分解定理好题. 引理 若 \(x=y^2\times z\),且 \(x\) 是完全平方数,那么 \(z\) 也一定是完全平方数. 证明可以用唯一分解定理证,每次把偶数次幂 ...

  3. 库卡KUKA机器人KRC2示教器维修常见方法

    库卡KUKA机器人以稳定性而备受赞誉.作为其重要组成部分,KRC2示教器在机器人的编程.监控和调试过程中发挥着至关重要的作用.然而,就像其他任何电子设备一样,KRC2示教器在长期使用过程中也可能会遇到 ...

  4. 【质点弹簧实现】Unity 版示例

    [质点弹簧实现]Unity 版示例 急速搭建的 Unity 版本的质点弹簧 Demo,不要在意帧率,这个 Demo 没有做任何优化.整个 Demo 就一个文件,直接在 Unity 创建里创建一个名为& ...

  5. 八米云-N1盒子、S905系列机顶盒等设备-小白保姆式超详细刷机教程

    线刷准备 这里以魔百盒CM211-1为例,本次刷机用到的零碎工具比较多,不过都是常见刚需设备,大家可以按照清单核对一下. 目前只支持S905 L3.L3a.L2 系列的各种盒子 机顶盒本体 电脑一台 ...

  6. vue - [02] 安装部署

    Vue.js 是一个流行的前端JavaScript框架,用于构建用户界面. 001 || 通过CND快速开始 只需要在HTML文件中引入VUE的CDN链接即可 (1)创建HTML文件 <!DOC ...

  7. 不止排名,Google SEO 10 大核心心得分享

    原博客:https://bysocket.com/seo-tips-2025/ 在过去的一年中,我深入实践了 Google SEO,积累了自己一些经验和看法.以下是我的实操心得,希望对大家有所帮助. ...

  8. 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

    在 AI 编程领域国内外有一堆能叫的上号的应用: Cursor Windsurf Trae 阿里的「通义灵码」 百度的「文心快码」 字节跳动的「MarsCode」 科大讯飞的「iFlyCode」 Gi ...

  9. HTTP Runner 运行提示执行后提示找不到有效的测试用例怎么解决?

    确保yaml文件编写正确 2.yaml文件名称test_xxx.yaml test开头 3.更改httprunner 版本号 pip install httprunner==1.4.2

  10. linux shell用expect实现在scp时自动输入密码

    文章目录 linux shell用expect自动输入密码 按行读取文件 expect 其他 linux shell用expect自动输入密码 最近有东西需要部署到很多服务器上去,一个服务器一个服务器 ...