一、传统Mybatis Dao的开发模式
开发步骤
项目结构如下图:
- 1.使用原有的use.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">
<!--namespace命名空间,用于隔离sql语句,后续有重要作用 -->
<mapper namespace="user">
<!--id是sql语句的唯一标志 parameterType入参的数据类型 resultType是返回的数据类型 -->
<select id="getUserById" parameterType="int"
resultType="mybatis.pojo.User">
select*from user where id=#{id}
<!-- #{}:占位符,相当于在JDBC中的? -->
</select>
<select id="getUserByUserName" parameterType="String"
resultType="mybatis.pojo.User">
select*from user where username LIKE '%${value}%'
<!--${} :是字符串拼接指令,如果入参是普通类型,{}内部只写value -->
</select>
<!--插入用户的操作 -->
<!--
useGeneratedKeys:主键自增
keyProperty:主键是哪个
-->
<insert id="insertUser" parameterType="mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!--
selectKey:主键返回
keyProperty:user中主键的属性
resultType:主键的数据类型
order:指定selectKey何时执行,after在插入数据后进行执行
-->
<!--
<selectKey keyProperty="id" resultType="int" order="AFTER" >
select last_insert_id()
</selectKey>
-->
insert into `user`(`username`,`birthday`,`sex`,`address`)
values(#{username},#{birthday},#{sex},#{address})
</insert>
<!--更新用户 -->
<update id="updateUser" parameterType="mybatis.pojo.User" >
update `user` set `username`=#{username} where `id`=#{id}
</update>
<!--删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from `user` where `id`=#{id}
</delete>
</mapper>
- 2.新建个UserDao接口
package mybatis.dao;
import java.util.List;
import mybatis.pojo.User;
//用户持久化接口
public interface UserDao {
//根据用户ID来查询用户信息
User getUserById(Integer id);
//根据用户名查找
List<User> getUserByUserName(String userName);
// 添加用户
void insertUser(User user);
}
- 3.新建一个实现UserDao接口的实现类UserDaoImpl
package mybatis.daoImpl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import mybatis.dao.UserDao;
import mybatis.pojo.User;
import mybatis.utils.SqlSessionFactoryUtils;
//用户持久化实现
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user = sqlSession.selectOne("user.getUserById", id);
sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String userName) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> list = sqlSession.selectList("user.getUserByUserName", userName);
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
sqlSession.insert("user.insertUser", user);
//在open Session中设置true则不需要下面
//sqlSession.commit();
sqlSession.close();
}
}
- 4.编写测试类
package mybatis.test;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import mybatis.dao.UserDao;
import mybatis.daoImpl.UserDaoImpl;
import mybatis.pojo.User;
public class UserDaoTest {
@Test
public void testGetUserById() {
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserById(27);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
UserDao userDao = new UserDaoImpl();
List<User> userName = userDao.getUserByUserName("张");
for (User user : userName) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
UserDao userDao = new UserDaoImpl();
//new 一个User对象,并向其中存入一条数据
User user = new User();
user.setUsername("张飞66");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("上海体育学院");
// 插入方法insert
userDao.insertUser(user);
}
}
二、接口动态代理模式DAO开发模式
1.映射文件中开发规则:
- 1.namespace必须是接口的全路径名
- 2.接口的方法名必须与映射文件中sql-id一致
- 3.接口的输入参数类型与映射文件中parameterType类型一致
- 4.接口的返回值类型必须与映射文件中resultType类型一致
2.动态代理开发步骤
- 1.创建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">
<!--
动态代理开发规则
1.namespace必须是接口的全路径名
2.接口的方法名必须与sql中id一致
3.接口的入参与parameterType类型一致
4.返回值类型必须与resultType类型一致
-->
<mapper namespace="mybatis.mapper.UserMapper">
<!-- 查询ID -->
<!--id是sql语句的唯一标志 parameterType入参的数据类型 resultType是返回的数据类型 -->
<select id="getUserById" parameterType="int" resultType="mybatis.pojo.User">
select*from user where id=#{id}
</select>
<!-- 查询用户名 -->
<select id="getUserByUserName" parameterType="String" resultType="mybatis.pojo.User">
select*from user where username LIKE '%${value}%'
</select>
<!--插入用户的操作 -->
<insert id="insertUser" parameterType="mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into `user`(`username`,`birthday`,`sex`,`address`)
values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
- 2.创建UserMapper接口
package mybatis.mapper;
import java.util.List;
import mybatis.pojo.User;
public interface UserMapper {
//根据用户ID来查询用户信息
User getUserById(Integer id);
//根据用户名查找
List<User> getUserByUserName(String userName);
// 添加用户
void insertUser(User user);
}
- 3.在SqlMapConfig.xml中映射UserMapper.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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis/user.xml"></mapper>
<mapper resource="mybatis/userMapper.xml"></mapper>
</mappers>
</configuration>
- 4.加载UserMapper.xml
package mybatis.test;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import mybatis.mapper.UserMapper;
import mybatis.pojo.User;
import mybatis.utils.SqlSessionFactoryUtils;
public class UserMapperTest {
@Test
public void testGetUserById() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(30);
System.out.println(user);
sqlSession.close();
}
@Test
public void testGetUserByUserName() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.getUserByUserName("张");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("赵强");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("上海体育学院");
userMapper.insertUser(user);
sqlSession.commit();
sqlSession.close();
}
}
SqlMapConf.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>
<!--先加载内部标签,再加载外部文件,名称一致时,会替换内容 -->
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root" />
<property name="jdbc.password" value="123" />
</properties>
<!--单个别名定义,别名的使用,不区分大小写 -->
<typeAliases>
<typeAlias type="mybatis.pojo.User" alias="user" />
<!-- 别名包扫描,不区分大小写,推荐使用 -->
<package name="mybatis.pojo" />
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<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="mybatis/user.xml"></mapper>
<mapper resource="mybatis/userMapper.xml"/>
<!-- 映射文件,class扫描器: 1.接口文件必须与映射文件在同一目录 2.接口文件必须与映射文件名称一致 -->
<!-- <mapper class="mybatis.mapper.UserMapper" /> -->
<!--映射文件包扫描 1.接口文件必须与映射文件在同一目录 2.接口文件名称必须与映射文件的名称一致 -->
<!-- <package name="mybatis.mapper"/> -->
</mappers>
</configuration>
jdbc中的属性配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123