ssm整合——Mybatis配置(1)
程序员文章站
2024-01-15 22:43:40
...
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文件一致
- 具体参考:https://blog.csdn.net/lmy86263/article/details/53428417
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方法需要进行修改
欢迎关注我的公众号,了解一个学设计却做了运营最后成了数据分析师并努力成为大数据工程师的女程序员的成长之路。
上一篇: C#知识拾遗
下一篇: 第五批游戏版号公布:共95款游戏通过审批