Mybatis传统DAO层开发和SqlMapConfig.xml配制文件
程序员文章站
2022-06-17 15:34:10
...
Mybatis传统DAO层开发
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在
主流的开发方式是接口代理开发方式,这种方式总体上更加简便。
Mybatis实现DAO的传统开发方式
分析编写dao实现类Mybatis的执行过程:
(1)持久层Dao接口
public interface IUserDao {
//查询所有的用户
List<User> findAll();
//保存方法
void saveUser(User user);
//更新方法
void updateUser(User user);
//删除方法,根据id删除用户
void deleteUser(Integer userId);
//查询方法,根据id进行查询用户信息
User findById(Integer userId);
//根据名称模糊查询用户信息
List<User> findByName(String username);
//查询总用户数
int findTotal();
}
(2)持久层Dao实现类
public class UserDaoImpl implements IUserDao {
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory){
this.factory=factory;
}
//查询多条数据
@Override
public List<User> findAll() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现查询列表
List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");
//3.事务提交并释放资源
session.commit();
session.close();
return users;
}
@Override
public void saveUser(User user) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现查询列表
session.insert("com.itheima.dao.IUserDao.saveUser",user);
//3.提交事务并释放资源
session.commit();
session.close();
}
@Override
public void updateUser(User user) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现更新操作
session.update("com.itheima.dao.IUserDao.updateUser",user);
//3.提交事务并释放资源
session.commit();
session.close();
}
@Override
public void deleteUser(Integer userId) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现更新操作
session.delete("com.itheima.dao.IUserDao.deleteUser",userId);
//3.提交事务并释放资源
session.commit();
session.close();
}
//查询单条数据
@Override
public User findById(Integer userId) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现更新操作
User user = session.selectOne("com.itheima.dao.IUserDao.findById", userId);
//3.释放资源
session.close();
return user;
}
@Override
public List<User> findByName(String username) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现更新操作
List<User> user = session.selectList("com.itheima.dao.IUserDao.findByName",username);
//3.释放资源
session.close();
return user;
}
@Override
public int findTotal() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现更新操作
Integer count = session.selectOne("com.itheima.dao.IUserDao.findTotal");
//3.释放资源
session.close();
return count ;
}
}
(3)持久层映射配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao">
<!--查询所有-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user;
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="com.itheima.domain.User">
insert into user(username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{uid}
</delete>
<!--查询用户-->
<!--这里需要一个返回值类型,因此得写上resultType-->
<select id="findById" parameterType="java.lang.Integer" resultType="com.itheima.domain.User">
select * from user where id=#{uid}
</select>
<!--根据名称模糊查询-->
<select id="findByName" parameterType="java.lang.String" resultType="com.itheima.domain.User">
<!--select * from user where username like #{name}-->
select * from user where username like '%${value}%'
</select>
<!--获取用户的总记录条数-->
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
</mapper>
(4)测试类
public class MybatisTest {
private InputStream resourceAsStream;
private SqlSession sqlSession;
private IUserDao userDao;
@Before
public void init() throws IOException {
//读取配制文件,生成字节输入流
resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
//获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//使用工厂对象,创建dao对象
userDao = new UserDaoImpl(factory);
}
@After
public void destory() throws IOException {
//释放资源
resourceAsStream.close();
}
//测试查询所有
@Test
public void testFindAll() throws IOException {
//执行查询所有方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
//测试保存操作
@Test
public void testSave(){
User user = new User();
user.setUsername("dao impl user");
user.setAddress("西安");
user.setSex("男");
user.setBirthday(new Date());
System.out.println("保存之前:"+user);
//执行保存方法
userDao.saveUser(user);
System.out.println("保存之后:"+user);
}
//测试更新操作
@Test
public void testUpdate(){
User user = new User();
user.setId(41);
user.setUsername("dao impl 更新 ");
user.setAddress("渭南");
user.setSex("男");
user.setBirthday(new Date());
//执行更新操作
userDao.updateUser(user);
System.out.println(user);
}
//测试删除操作
@Test
public void testDelete(){
//执行删除方法
userDao.deleteUser(53);
}
//测试查询方法
@Test
public void testFindOne(){
//执行查询方法
User user = userDao.findById(41);
System.out.println(user);
}
//测试模糊查询操作
@Test
public void testFindByName(){
//执行查询方法
List<User> users = userDao.findByName("%杨%");
for (User user : users) {
System.out.println(user);
}
}
//测试查询总记录条数
@Test
public void testFindTotal(){
//执行查询总记录条数的方法
int count = userDao.findTotal();
System.out.println(count);
}
}
SqlMapConfig.xml配制文件
(1)配置内容
SqlMapConfig.xml中配置的内容和顺序
properties(属性)
property
settings(全局配置参数)
setting
typeAliases(类型别名)
typeAliase
package
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
mapper
package
(2)properties属性
在使用properties标签配置时,我们可以采用两种方式指定属性配置。
第一种
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/database1"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</properties>
第二种
在classpath下定义jdbcConfig.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database1
jdbc.username=root
jdbc.password=1234
properties标签配置
<!--配置properties标签
可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息
resource属性:常用的一个属性
用于指定配制文件的位置,是按照类路径的写法来写的,并且必须存在于类路径下。
url属性:
是要求按照url的写法来写地址
URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。
它的写法:
http://localhost:8080/mybatisserver/demo1Servlet
协议 主机 端口 URI
URI:Uniform Resource Identifier 统一资源标识符,它是在应用中可以唯一定位一个资源的标识符
-->
<properties url="file:///C:/Users/ASUS/Desktop/jdbcConfig.properties">
<!--<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/database1"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>-->
</properties>
此时我们的dataSource标签就变成了引用上面的配置
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
(3)typeAliases(类型别名)
之前我们说Mybatis支持的默认别名,我们也可以采用自定义别名方式来开发。
自定义别名
<typeAliases>
<!--typeAlias用于配置别名,type属性指定的是实体类全限定类名,alias属性指定别名,当指定了别名再区分大小写-->
<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>
<!--用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写。-->
<package name="com.itheima.domain"></package>
</typeAliases>
mappers(映射器)
mapper resource=" "/
<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
mapper class=" "/
使用 mapper 接口类路径
如:<mapper class="com.itheima.dao.UserDao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
package name=" "/
注册指定包下的所有mapper接口
<package name="com.itheima.dao"></package>la
package标签是用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource或者class了。
注意:这种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
上一篇: 项目接入jenkins
下一篇: jenkins自动化搭建测试环境