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. 十、CSR8670的DFU功能[补充]

    前一篇转载的博文很清楚,全面的介绍了DFU功能的实现步骤.关于DFU功能,你还需要知道以下信息: 一.image.fs,firmware,loader,psr之间的关系 图1-1 image.fs示意 ...

  2. Java 数据持久化系列之JDBC

    前段时间小冰在工作中遇到了一系列关于数据持久化的问题,在排查问题时发现自己对 Java 后端的数据持久化框架的原理都不太了解,只有不断试错,因此走了很多弯路.于是下定决心,集中精力学习了持久化相关框架 ...

  3. 2018092609-2 选题 Scrum立会报告+燃尽图 02

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8683] 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名 ...

  4. react -Route exact Redirect

     exact是Route下的一个属性,react路由会匹配到所有能匹配到的路由组件,exact能够使得路由的匹配更严格一些(exact的值为bool型).   <Route path='/' c ...

  5. 2019-10-30,Hack The Box 获取邀请码

    一.快速获取邀请码方法 1,使用curl请求下面的地址curl -X POST https://www.hackthebox.eu/api/invite/generate 2,在返回结果的code部分 ...

  6. 数据库求闭包,求最小函数依赖集,求候选码,判断模式分解是否为无损连接,3NF,BCNF

    1.说白话一点:闭包就是由一个属性直接或间接推导出的所有属性的集合. 例(1):   设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→E,BI→E,CD→I,E→C} ...

  7. /etc/security/limits.conf 详解与配置

    目录 一. /etc/security/limits.conf 详解 /etc/security/limits.conf 配置解析 /etc/security/limits.d/ 目录 二. ulim ...

  8. 5. 彤哥说netty系列之Java NIO核心组件之Channel

    你好,我是彤哥,本篇是netty系列的第五篇. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一--Channel. 思维转变 首先, ...

  9. Linux目录结构-上部

    第1章 目录结构 1.1 目录结构特点 倒挂的树状结构一切从根开始一切皆文件 1.2 目录结构 /bin            二进制文件  命令 /sbin           超级命令只有root ...

  10. redis centos 6.x 启动关闭脚本

    #!/bin/sh #Configurations injected by install_server below.... EXEC=/usr/local/bin/redis-server CLIE ...