概述
mybatis环境搭建
第一步:创建 maven 工程
第二步:导入坐标
第三步:编写必要代码(实体类和持久层接口)
第四步:编写 SqlMapConfig.xml
第五步:编写映射配置文件
第六步:编写测试类
目录结构
pop.xml
<?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>com.hegong</groupId>
<artifactId>mybatistest4</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
IUser.dao
public interface IUserDao {
/**
* 查询所有操作
* @return
*/
List<User> findAll();
}
user表中的结构
User.java
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + ''' +
", birthday=" + birthday +
", sex='" + sex + ''' +
", address='" + address + ''' +
'}';
}
}
SqlMapConfig.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">
<!--mybatis的主配置文件-->
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatistest"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/hegong/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
IUserDao.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.hegong.dao.IUserDao">
<!-- 配置查询所有的方法的一些东西 -->
<select id="findAll" resultType="com.hegong.domain.User" >
select * from user
</select>
</mapper>
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %mn
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %mn
MybatisTest.java
public class MybatisTest {
@Test
public void test1() throws Exception{
// 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建一个SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
// 使用动态代理SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
// 使用代理对象职系那个方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 释放资源
session.close();
in.close();
}
}
数据库所包含信息
一、向数据库中存入一个user对象
第一步在IUserDao中添加一个抽象方法
第二步在IUserDao.xml文件中添加保存方法有关的映射信息
第三步在MybatisTest.java中编写测试方法
执行结果如下
然后发现单元测试通过,然后我们查询数据库是否多出这条信息
发现并没有我们插入的信息,,这是为什么呢?
这是我们需要仔细观察执行代码后控制台返回的信息
这里说明了,它关闭了自动提交事务,然后采取手动提交事务,但是我们并没有开启事务,所以它自己进行了事务回滚,虽然我们在执行单元测试的时候,没有提示任何异常但是我们依然存储失败。
我们进行手动开启事务
这时候我们查看数据库信息发现成功插入
并且发现id为51,这是因为我们执行添加方法它回滚了数据但是保存了id自增长的记录(因为我当时执行了两次没有开启事务的这个方法,所以id从51开始)
注意
- 这里我们使用
<insert> </insert>
这对标签来编写insert的sql语句
我们以前在写jdbc的时候,如果要插入一条新的数据,那么我们会使用?(问好)这个占位符来进行占位,但是我们在使用mybatis来插入数据的时候sql语句中不能使用占位符,这里我们使用
#{domain实体类中的属性}
的方式来起到原先我们使用占位符的效果,但是我们需要注意在使用之前,我们的insert标签一定要有一个属性,
parameterType="domain实体类的全限定类名"
最后我们在执行的时候记得一定要使用
SqlSession的对象.commit()
来提交事务,不然会出现事务回滚
还有一点,我们在保存数据的时候,id是自增长的,但是如果我们想要获取,到我们保存后自增长的id的话,可以使用一个语句select last_insert_id()
,这个语句是在我们插入语句的后面写的
举例说明
得到的这个结果就是我们插入一条数据之后自增长的id值
举例示范
dao接口中保存数据的方法依旧没变
但是配置文件中的内容如下
这个keyProperty是我们对应实体类中的属性(这里表示的是com.hegong.domain.User里边的id属性),keyColumn里面的id是数据库中的id列名,resultType是返回的数据类型,表示的是先执行这个标签还是后执行这个标签
打印添加的user对象得到
二、更新数据的方法
第一步在IUserDao中添加更新数据的抽象方法
第二步在IUserDao.xml中添加映射信息
第三步在MybatisTest中添加单元测试的方法
查询数据库发现
更改成功
注意:
- 这里我们使用
<update> </update>
这对标签来编写update的sql语句 - 我们在update标签中依旧需要指定传入参数的类的全限定类名给parameterType这个属性
- 我们也依旧使用
#{domain实体类中的属性}
的格式来代替问好这个占位符 - 我们也同样使用
SqlSession的对象.commit()
来提交事务
三、根据id删除数据库中的某一行数据
第一步添加接口中的抽象方法
第二部添加对应接口的配置文件中的映射信息
第三步添加新的单元测试
查询数据库发现删除成功
注意
- 这里我们使用
<update> </update>
这对标签来编写update的sql语句 - 我们在update标签中设置parameterType这个属性时,里面可以填写int、integer、INTEGERE、INT、java.lang.Integer
- 我们也依旧使用
#{随意填写}
的格式来代替问好这个占位符,因为这里我们传入的参数时一个int类型所以,这里我们的占位符可以随意填写 - 我们也同样使用
SqlSession的对象.commit()
来提交事务
四、根据id查询条信息
第一步填写接口中的抽象方法
第二部配置对应接口的映射文件中的sql语句
第三步编写单元测试
得到结果为
问好是由于没有编码不同意导致的中文乱码,这里暂不解决
注意
- 对应文件的配置sql的标签使用
<select> </select>
- 该标签中需要传入两个属性:第一个参数类型,因为是根据id查询,所以需要让mybatis明确参数id的类型;第二个参数是返回值类型,需要指定对应的想要封装的类
五、模糊查询
第一步添加接口中的模糊查询的方法
第二步设置对应配置文件中的sql语句
第三步编写单元测试代码
执行成功
注意
- 我们在写配置文件中的sql语句的时候没写百分号%所以我们在传入参数的时候需要自己写百分号
模糊查询我们还可以这样子写
但是如果我们这样子写的话,里面的
'#${value)%'
的写法就是固定得了,而且这样子属于拼接字符串的形式来进行查询
可以看到控制台输出的是Preparing语句没有占位符,而是直接拼接的,所以我们一般不使用这种方式进行查询,一定注意必须写成value
六、执行聚合函数查询总用户数
最后
以上就是笑点低小天鹅为你收集整理的mybatis基于代理dao实现CRUD操作的全部内容,希望文章能够帮你解决mybatis基于代理dao实现CRUD操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复