mybatis搭建-基于注解

1. 环境准备

1.1 新建maven的webapp项目

1.2 新建必要的目录和文件

1.3 文件配置

  • pom.xml
  • junit默认创建是4.11,手动改成4.12
<dependency>
<!-- 单元测试,这里将原先的4.11版本改为了4.12-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<!-- mysql驱动包用于建立数据库连接-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<!-- mybatisjar包-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<!-- 用于日志记录-->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>


  • 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 - %m\n # LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# 可修改log文件的位置
log4j.appender.LOGFILE.File=G:\\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 - %m\n


  • SqlMapConifg.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>
<!-- 配置 mybatis 的环境 -->
<environments default="mysql">
<!-- 配置 mysql 的环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:用的是数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatistest?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置,,映射配置文件指的是每个dao的配置文件 -->
<mappers>
<!-- 使用xml文件配置sql语句时
<mapper resource="com/ow/dao/IUserDao.xml"/>-->
<!-- 使用注解配置sql语句时 -->
<mapper class="com.ow.dao.IUserDao"></mapper>
</mappers>
</configuration>
 

2. 编写程序

2.1 User.java

基于注解配置需要保持domain类的字段名称和数据库的字段名称相同

  • 省略get,set方法,以及toString方法
public class User {
private Integer id;
private String name;
private Float money;
 

2.2 IUserDao.java

public interface IUserDao {

    //插入用户,这里的id是自增键
@Update("insert into account(name,money) values (#{name},#{money})")
void saveUser(User user); //删除一个用户
@Update("delete from account where id = #{uid}")
void deleteUser(Integer uid); //更新用户
@Update("update account set name=#{name},money=#{money} where id=#{id}")
void updateUser(User user); //查询所有用户
@Select("select * from account")
List<User> findAll(); //查询单个用户
@Select("select * from account where id = #{uid}")
User findOne(Integer uid);
}


2.3 测试程序

  • mybatis默认不是事务自动提交,因此需设置自动提交(factory.openSession(true)),
  • 或者设置手动提交:session.commit()
public class MybatisTest1 {

    private InputStream in;
private SqlSession session;
private IUserDao userDao; @Before
public void init() throws Exception{
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConifg.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
session = factory.openSession();
//SqlSession session = factory.openSession(true);//设置事务自动提交,或者在完成之后手动提交
//5.使用 SqlSession 创建 dao 接口的代理对象
userDao = session.getMapper(IUserDao.class);
} @After
public void destory()throws Exception{
session.commit();//设置事务手动提交
//释放资源
session.close();
in.close();
} //测试查询所有用户
@Test
public void run1()throws Exception{
//6.使用代理对象执行相应的方法
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
}
//测试按照id查询用户
@Test
public void run2()throws Exception{
User user = userDao.findOne(3);
System.out.println(user);
}
//测试按照id更新用户
@Test
public void run3()throws Exception{
User user=new User();
user.setName("ttt");
user.setMoney(500f);
user.setId(7);
userDao.updateUser(user); } //测试根据id删除用户
@Test
public void run4()throws Exception{
userDao.deleteUser(8);
} //测试插入用户
@Test
public void run5()throws Exception{
User user=new User();
user.setName("ppp");
user.setMoney(500f);
userDao.saveUser(user);
}
}


mybatis搭建-基于配置

1. 环境准备

1.1 新建maven的webapp项目

1.2 新建必要的目录和文件

  • 这里相比较注解只是多了一个IUserDao.xml的配置文件
  • 基于配置文件配置时,配置文件的位置影响到具体的设置,这里将配置文件放在resources目录下,并且保持包路径和文件名和dao文件一致
  • 具体参考:blog.csdn.net/lmy86263/ar…

1.3 文件配置

  • pom.xml 同上

  • log4j.properties 同上

  • SqlMapConifg.xml

  • 通过“”配置了具体dao的位置

  • 也可以通过 ”“ 配置具体dao所在的包

  • 还可以通过typeAliases为domain下的类配置别名

<!-- 使用typeAliases配置别名,它只能配置domain中类的别名 -->
<typeAliases>
<!-- typeAlias用于配置别名:type属性指定的是实体类全限定类名;alias属性指定别名,当指定了别名就不再区分大小写
<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>--> <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="com.ow.domain"></package>
</typeAliases>
复制代码
<?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>
<!-- 配置 mybatis 的环境,这里没有配置别名 -->
<environments default="mysql">
<!-- 配置 mysql 的环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:用的是数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatistest?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置,,映射配置文件指的是每个dao的配置文件 -->
<mappers>
<!-- 使用xml文件配置sql语句时
<mapper resource="com/ow/dao/IUserDao.xml"/>-->
<!-- 使用注解配置sql语句时 -->
<mapper class="com.ow.dao.IUserDao"></mapper>
</mappers>
</configuration>
 

2.1 编写程序-类和表字段一致

2.1 User.java

  • 这里仍然保持domain的类和数据库表字段名称一致,若不一致,需要在IUserDao.xml中做另外的配置
  • 省略get,set方法,以及toString方法
public class User {
private Integer id;
private String name;
private Float money;
复制代码
2.2 IUserDao.java
这里新增了几个方法
public interface IUserDao { //插入用户,这里的id是自增键
void saveUser(User user); //删除一个用户
void deleteUser(Integer uid); //更新用户
void updateUser(User user); //查询所有用户
List<User> findAll(); //查询单个用户
User findOne(Integer uid); //根据名称模糊查询用户信息
List<User> findByName(String usename); //查询总用户数
int findTotal(); }
 

2.3 IUserDao.xml

  • 这里是类属性和表字段一致的配置
<mapper namespace="com.ow.dao.IUserDao"><!-- 配置接口 -->

    <!-- 1. 插入用户 -->
<!-- last_insert_id()用于获取表中自增字段的当前值,
id为dao中的方法名,parameterType为参数的类型
order为after,可省略,
keyProperty表示返回的id值应该返回给user类中的哪一个属性,
keyColumn用于指明数据表中的自增字段,可省略
resultType表示返回结果的类型,不可省略 -->
<insert id="saveUser" parameterType="com.ow.domain.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into account(name,money) values (#{name},#{money});
</insert> <!-- 2. 删除用户 -->
<!-- 这里的uid即为方法中的参数 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from account where id = #{uid}
</delete> <!-- 3. 更新用户 -->
<delete id="updateUser" parameterType="com.ow.domain.User">
update account set name=#{name},money=#{money} where id=#{id}
</delete> <!-- 4. 查询所有用户 -->
<select id="findAll" resultType="com.ow.domain.User">
select * from account
</select> <!-- 5. 查询单个用户 -->
<select id="findOne" resultType="com.ow.domain.User" parameterType="java.lang.Integer">
select * from account where id = #{uid}
</select> <!-- 6. 根据名称模糊查询用户信息 -->
<select id="findByName" resultType="com.ow.domain.User" parameterType="java.lang.String">
select * from account where name like #{usename}
</select> <!-- 7. 查询总用户数,返回值的类型需和方法对应 -->
<select id="findTotal" resultType="int" >
select count(id) from account
</select> <!-- 8. 根据对象条件查询 -->
<select id="findByQv" parameterType="com.ow.domain.QueryEp" resultType="com.ow.domain.User">
select * from account where name = #{user.name}
</select> </mapper>
 

2.3 测试程序

public class MybatisTest1 {

    private InputStream in;
private SqlSession session;
private IUserDao userDao; @Before
public void init() throws Exception{
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConifg.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
session = factory.openSession();
//SqlSession session = factory.openSession(true);//设置事务自动提交,或者在完成之后手动提交
//5.使用 SqlSession 创建 dao 接口的代理对象
userDao = session.getMapper(IUserDao.class);
} @After
public void destory()throws Exception{
session.commit();//设置事务手动提交
//释放资源
session.close();
in.close();
} // 1. 测试插入用户
@Test
public void run1()throws Exception{
User user=new User();
user.setName("ppp");
user.setMoney(500f);
System.out.println("保存之前:"+user);
userDao.saveUser(user);
System.out.println("保存之后:"+user);
} // 2. 测试根据id删除用户
@Test
public void run2()throws Exception{
userDao.deleteUser(18);
} // 3. 测试按照id更新用户
@Test
public void run3()throws Exception{
User user=new User();
user.setName("ttt");
user.setMoney(500f);
user.setId(20);
userDao.updateUser(user); } // 4. 测试查询所有用户
@Test
public void run4()throws Exception{
//6.使用代理对象执行相应的方法
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
} // 5. 测试按照id查询用户
@Test
public void run5()throws Exception{
User user = userDao.findOne(3);
System.out.println(user);
} // 6. 测试根据名称模糊查询用户
@Test
public void run6()throws Exception{
List<User> users = userDao.findByName("%t%");
for (User user:users){
System.out.println(user);
}
} // 7. 查看总用户数
@Test
public void run7()throws Exception{
int num = userDao.findTotal();
System.out.println(num);
} // 8. 根据条件查询用户
@Test
public void run8()throws Exception{
User user = new User();
user.setName("ppp");
QueryEp ep = new QueryEp();
ep.setUser(user);
List<User> users = userDao.findByQv(ep);
for (User user0:users){
System.out.println(user0);
}
} }
 

2.2 编写程序-类和表字段不一致

2.1 User.java

  • 这里domain类和数据库表字段名称不一样
  • 省略get,set方法,以及toString方法
public class User {
private Integer uid;
private String usename;
private Float rmb;
 

2.2 IUserDao.java

  • 同上

2.3 IUserDao.xml

  • 这里是类属性和表字段不一致时的配置
  • 因此当返回整行数据时,需要配置列和类属性的对应,才可以封装
  • 使用resultMap进行封装返回对象到user类中,返回结果也应该从resulttype改为resultmap
  • 这里为domain包下的类配置了别名
<?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.ow.dao.IUserDao"> <!-- 这里用于配置查询列名和实体类的对应关系,
id为返回结果对象的代称,
type表示返回结果对象类型,这里是指com.ow.domain.User,由于指定了别名,因此可以不计较大小写直接使用
表示若返回结果resultType为id(usermap),指的的type类型的对象,两者的字段对应关系如下-->
<resultMap id="userMap" type="user">
<!-- 主键字段 -->
<id property="uid" column="id"></id>
<!-- 非主键字段 -->
<result property="usename" column="name"></result>
<result property="rmb" column="money"></result>
</resultMap> <!-- 1. 插入用户
这里的user即为com.ow.domain.User-->
<insert id="saveUser" parameterType="user">
<selectKey keyProperty="uid" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into account(name,money) values (#{usename},#{rmb});
</insert> <!-- 2. 删除用户 -->
<!-- 这里的uid为方法中的参数 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from account where id = #{uid}
</delete> <!-- 3. 更新用户 -->
<delete id="updateUser" parameterType="user">
update account set name=#{usename},money=#{rmb} where id=#{uid}
</delete> <!-- 4. 查询所有用户
这里需将返回结果的接收由resultType改为resultMap
这里的usermap即为上面配置的resultMap的id-->
<select id="findAll" resultMap="userMap">
select * from account
</select> <!-- 5. 查询单个用户 -->
<select id="findOne" resultMap="userMap" parameterType="java.lang.Integer">
select * from account where id = #{uid}
</select> <!-- 6. 根据名称模糊查询用户信息 -->
<select id="findByName" resultMap="userMap" parameterType="java.lang.String">
select * from account where name like #{usename}
</select> <!-- 7. 查询总用户数,返回值的类型需和方法对应 -->
<select id="findTotal" resultType="int" >
select count(id) from account
</select> <!-- 8. 根据对象条件查询 -->
<select id="findByQv" parameterType="queryep" resultMap="userMap">
select * from account where name = #{user.usename}
</select> </mapper>


2.3 测试程序

  • 同上,但是set方法需要进行修改

欢迎关注我的公众号,了解一个学设计却做了运营最后成了数据分析师并努力成为大数据工程师的女程序员的成长之路。

ssm整合——Mybatis配置(1)的更多相关文章

  1. SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换

    一.简述 mybatis驼峰式命名规则自动转换: 使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”: 使用好处:省去mapper.xml文件中繁琐编写表字段列表 ...

  2. IDEA环境下SSM整合------环境配置

    声明:本文纯为个人笔记整理,如有不妥之处还望及时指出,欢迎转载! 只为解决操作问题,可以从第二幅图往后看! 一.做不出详细的概念叙述和文本设计,本文主要以实战步骤为主,少量解释为辅助,下面请大家牢记两 ...

  3. 19.SSM整合_配置式开发

    1.定义实体类Student 2.定义Student表 3.定义index页面 4.定义处理器 5.定义Service 6.定义Dao接口 7.定义Dao的Mapper配置文件 8.定义MyBatis ...

  4. SSM整合——spring4.*配置案例

    导入spring4.* 相关的jar包和依赖包即可 1.web.xml <?xml version="1.0" encoding="UTF-8"?> ...

  5. SSM(五)Mybatis配置缓存

    1.在没有配置的情况下,mybatis默认开启一级缓存. Object object=mapper.getXxx(object); Object object2=mapper.getXxx(objec ...

  6. ssm整合——Spring配置(2)

    配置Spring 1. 环境准备 使用之前搭建Mabatis的环境 1.1 新建目录 新建spring的service业务逻辑包 在resources目录下新建spring的配置文件:applicat ...

  7. Spring Boot整合Mybatis配置详解

    首先,你得有个Spring Boot项目. 平时开发常用的repository包在mybatis里被替换成了mapper. 配置: 1.引入依赖: <dependency> <gro ...

  8. 四、SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换

    简述: mybatis驼峰式命名规则自动转换: 使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”:使用好处:省去mapper.xml文件中繁琐编写表字段列表与表 ...

  9. 02-MariaDB主从安装SpringBoot整合MyBatis配置

    关于MariaDB的介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为My ...

随机推荐

  1. Docker从入门到掉坑(三):容器太多,操作好麻烦

    前边的两篇文章里面,我们讲解了基于docker来部署基础的SpringBoot容器,如果阅读本文之前没有相关基础的话,可以回看之前的教程. Docker 从入门到掉坑 Docker从入门到掉坑(二): ...

  2. 关于springboot2.*版本无法加载静态资源

    前言 在学习springboot的过程中,发现无法引用静态资源.我使用的是springboot2.2.1版本. 追溯源码,终于解决.并记录下解决思路. 默认加载路径 首先得知道springboot默认 ...

  3. RxJS入门

    一.RxJS是什么? 官方文档使用了一句话总结RxJS: Think of RxJS as Lodash for events.那么Lodash主要解决了什么问题?Lodash主要集成了一系列关于数组 ...

  4. 封装Ajax和跨域

    目录 引言 封装ajax 案例:使用自封装ajax 案例:动态加载瀑布流 跨域 引言 对于Ajax现在相信大家已经不会陌生了,无论是原生的XMLHttpRequest方式发送还是通过jQuery框架中 ...

  5. 从spring boot发邮件聊到开发的友好性

    前些天帮一个朋友做网站,全站都是静态页面,唯一需要用到后端开发的是他需要一个留言板.传统的留言板一般都是提交后保存到数据库,然后提供一个后台的留言列表给管理人员看,我嫌麻烦,就决定留言提交到后台直接发 ...

  6. CentOS 7 ETCD集群配置大全

    目录 前言 环境准备 安装 静态集群 配置 node01 配置文件 node02 配置文件 node03 配置文件 启动测试 查看集群状态 生成TLS证书 etcd证书创建 安装cfssl工具集 生成 ...

  7. Prometheus PromQL 基础

    目录 时序 4 种类型 Counter Gauge Histogram Summary Histogram vs Summary 操作符 时序 4 种类型 Prometheus 时序数据分为 Coun ...

  8. python拆包

    如果需要把原组A赋值给args  字典B 赋值给kwargs 在调用函数的时候需要给参数 加上星号*

  9. Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

    经过 Spring Boot 的整合封装与自动化配置,在 Spring Boot 中整合Redis 已经变得非常容易了,开发者只需要引入 Spring Data Redis 依赖,然后简单配下 red ...

  10. The requested profile 'prod' could not be activated because it does not exist.

    maven打包时警告:The requested profile 'prod' could not be activated because it does not exist. 需要在pom.xml ...