文章目录
SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎。
1)持久层:dao层(mapper)层
作用:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。
2)业务层:Service层
作用:Service层主要负责业务模块的逻辑应用设计。
3)表现层:Controller层(Handler层)
作用:负责具体的业务模块流程的控制。
4)View层
作用:主要和控制层紧密结合,主要负责前台jsp页面的表示。
各层之间的联系
这里是引用
DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势,Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。
Spring里面的IOC容器和AOP是我们平时使用最多的。
1)IOC(控制反转)
它可以装载bean,也是一种降低对象之间耦合关系的设计思想。(比如租房子。以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个房屋中介,把你需要的房型告诉中介,就可以直接选到需要的房子,中介就相当于spring容器。)
2)AOP(面向切面)
是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求,如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。
1.横切关注点:从每个方法中抽取出来的同一类非核心业务代码。
2.切面:封装横切信息点的类,每个关注点体现为一个通知方法。
3.通知:切面必须要完成的各个具体工作,也就是切面里的一个个方法。
4.目标:被通知的对象,也就是被通知方法所作用的对象。
5.代理:像目标对象应用通知之后所创建的代理对象。
6.连接点:横切关注点在程序代码中的具体体现,对应用程序执行的某个特定位置。(通俗来讲就是一个个的方法)
7.切入点:切入点就是定位连接点的方式。每个通知上的切入点表达式找到对应的连接点,执行通知之后连接点也就变成了切入点。
<复杂版>
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
<简单版>
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
1)创建maven工程
2)创建目录

3)配置工程

5)配置依赖
pom.xml加入依赖,一个是Mybatis的,一个是MySQL的。
代码如下(示例):
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>

1)设计数据库

1)创建实体类
在entity下new一个名为person的class
代码如下(示例):
public class Person {
private Integer Id;
private String name;
private String nickname;
private Integer age;
public Integer getId() {
return Id;
}
public void setId(Integer id) {
this.Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"Id=" + Id +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
'}';
}
}
2)Mapper接口
定义方法(实体名+Mapper)
在mapper下创建一个名为PersonMapper的interface
public interface PersonMapper {
//定义查询记录方法数
public Integer findCount();
}
3)resources包
//头文件:
<?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">
//查询映射标签(select):
<mapper namespace="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
</select>
</mapper>
(1)mapper叫根节点,根节点有个属性是namespace=""、namespace=""、的作用是映射我们mapper的全路径,在以后的使用中会自动映射成我们mapper的实现类
(2)select里面的Id=“”一般和我们PersonMapper里面的方法名保持一致
(3)返回值这里有一个专门的属性叫resultType="java.lang.Integer"
(4)方法名和返回值都对应之后看有无参数,如果有要加上parameterType=""
4)写sql语句`
<mapper namespace="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>
</mapper>
5)配置主配置文件mybatis-config.xml`
在resources里新建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
//根节点:爷爷
<configuration>
//子节点:爸爸
<environments default="development">
//爸爸天生有很多的孙子(这里可以配置很多个数据库,比如development1,development2等等)
<environment id="development">
<transactionManager type="JDBC" /> </transactionManager>//事务里面有一个类型type,可以配JDBC(JDBC利用的机制是数据库它的一个数据源的一个事务JDBC。可以允许不用数据库的事务)
<dataSource type="POOLED"></dataSource>//(dataSource属性,代表数据源,链接数据库。“POOLED”这里的连接池根据需要可以更改。)
</environment>
//development2(一般企业里配一个开发环境,一个测试环境)
// <environment id="development2">
// <transactionManager type="" /> </transactionManager>
// <dataSource type=""></dataSource>
// </environment>
// </environments>
</configuration>
mybatis-config.xml完整代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!--jdbc.properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--setttings:控制mybatis全局配置行为-->
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--环境配置:数据库的连接信息-->
<!--default:中配置的值需要和某个environment配置的id相同,
通知mybatis使用具体哪一个数据库的连接信息,即具体访问对应的数据库-->
<environments default="development">
<!--environment:一个数据库信息的配置,环境-->
<!--id属性:一个唯一值,自定义,表示环境的名称-->
<environment id="development">
<!--transactionManager属性:mybatis的事务类型-->
<transactionManager type="JDBC" />
<!--dataSoure属性:代表数据源,连接数据库-->
<!--type属性:JDBC 表示使用的是使用连接池的数据源-->
<dataSource type="POOLED">
<!--配置驱动-->
<property name="driver" value="${driver}"/>
<!--配置连接数据库的url字符串-->
<property name="url" value="${url}"/>
<!--配置连接数据库的用户名-->
<property name="username" value="${username}"/>
<!--配置连接数据库的密码-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--sql映射文件标签-->
<mappers>
<!--reource:从类路径开始的路径信息:target/clasess(类路径)-->
<mapper resource="cn/kgc/mapper/PersonMapper.xml"/>
</mappers>
</configuration>
5)测试`
在test——Java包下新建一个名为TestMybatis的测试类
测试用例怎么写:测一个对象sqlSession,需要通过sqlSessionFactor()对象才能创建sqlSession。sqlSessionFactor()需要通过sqlSessionFactor()Builder()来创建出来。

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
public class TestMybatis {
@Test
public void testHelloWorld() throws IOException {
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//5.调用接口的方法
Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
//6.输出对应的返回值count
System.out.println("count:" + count);
//7.关闭 SqlSession
sqlSession.close();
}
}
PersionMapper
public interface PersonMapper {
//定义查询记录方法数
public Integer findCount();
//增加
public Integer addPerson(Person person);
}
PersonMapper.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="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>
<insert id="addPerson" parameterType="cn.kgc.entity.Person">
insert into t_user(name,nickname,age) values(#{name},#{nickname},#{age})
</insert>
</mapper>
测试类
@Test
public void testInsert() throws Exception {
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//5.调用接口的方法
Person p = new Person();
p.setName("李四");
p.setNickname("一个人的夜晚上");
p.setAge(22);
sqlSession.getMapper(PersonMapper.class).addPerson(p);
//6.提交实物,该行代码必须放在关闭sqlsession之前
sqlSession.commit();
sqlSession.close();
}
完整工程代码
Person类
package cn.kgc.entity;
public class Person {
private Integer Id;
private String name;
private String nickname;
private Integer age;
public Integer getId() {
return Id;
}
public void setId(Integer id) {
this.Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"Id=" + Id +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
'}';
}
}
PersonMapper类
package cn.kgc.mapper;
import cn.kgc.entity.Person;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface PersonMapper {
//定义查询记录方法数
public Integer findCount();
//增加
public Integer addPerson(Person person);
//修改功能
public Integer updatePerson(Person person);
//删除功能
public Integer delById(Integer Id);
//删除功能2
public Integer delById2(Person person);
//查询对象
public Person findById(Integer Id);
//查询集合
public List<Person> findAll();
//模糊查询
public List<Person> findByName(String name);
//通过用户名和昵称 绝对查询
public List<Person> findByPerson(Person person);
//通过用户名和昵称 绝对查询2
public List<Person> findByPerson2(@Param("name")String name,@Param("nickname")String nickname);
//测试¥(不安全)符号和#(安全)的作用
public List<Person> findColList(@Param("colname")String colname);
}
MybatisUtil类
package cn.kgc.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MytabisUtil {
private static SqlSessionFactory factory = null;
static {
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
}catch (IOException e){
e.printStackTrace();
}
}
//获取SqlSession对象
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if(factory!=null){
sqlSession = factory.openSession();
}
return sqlSession;
}
}
PersonMapper.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="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>
<insert id="addPerson" parameterType="cn.kgc.entity.Person">
insert into t_user(name,nickname,age) values(#{name},#{nickname},#{age})
</insert>
<update id="updatePerson" parameterType="cn.kgc.entity.Person">
update t_user set name=#{name},nickname=#{nickname},age=#{age} where Id = #{Id}
</update>
<delete id="delById" parameterType="cn.kgc.entity.Person" >
delete from t_user where id = #{Id}
</delete>
<delete id="delById2" parameterType="cn.kgc.entity.Person">
delete from t_user where id = #{Id}
</delete>
<select id="findById" resultType="cn.kgc.entity.Person" parameterType="java.lang.Integer">
select * from t_user where id = #{Id}
</select>
<select id="findAll" resultType="cn.kgc.entity.Person">
select * from t_user
</select>
<select id="findByName" resultType="cn.kgc.entity.Person" parameterType="java.lang.String">
select * from t_user where `name` like concat('%',#{name},'%')
</select>
<select id="findByPerson" parameterType="cn.kgc.entity.Person" resultType="cn.kgc.entity.Person">
select * from t_user where `name` = #{name} and nickname = #{nickname}
</select>
<select id="findByPerson2" parameterType="cn.kgc.entity.Person" resultType="cn.kgc.entity.Person">
select * from t_user where `name` = #{name} and nickname = #{nickname}
</select>
<select id="findColList" resultType="cn.kgc.entity.Person">
select * from t_user order by ${colname}
</select>
</mapper>
jdbc.properties(配置文件)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_202125
username=root
password=123
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!--jdbc.properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--setttings:控制mybatis全局配置行为-->
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--环境配置:数据库的连接信息-->
<!--default:中配置的值需要和某个environment配置的id相同,
通知mybatis使用具体哪一个数据库的连接信息,即具体访问对应的数据库-->
<environments default="development">
<!--environment:一个数据库信息的配置,环境-->
<!--id属性:一个唯一值,自定义,表示环境的名称-->
<environment id="development">
<!--transactionManager属性:mybatis的事务类型-->
<transactionManager type="JDBC" />
<!--dataSoure属性:代表数据源,连接数据库-->
<!--type属性:JDBC 表示使用的是使用连接池的数据源-->
<dataSource type="POOLED">
<!--配置驱动-->
<property name="driver" value="${driver}"/>
<!--配置连接数据库的url字符串-->
<property name="url" value="${url}"/>
<!--配置连接数据库的用户名-->
<property name="username" value="${username}"/>
<!--配置连接数据库的密码-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--sql映射文件标签-->
<mappers>
<!--reource:从类路径开始的路径信息:target/clasess(类路径)-->
<mapper resource="cn/kgc/mapper/PersonMapper.xml"/>
</mappers>
</configuration>
TestMybatis类
import cn.kgc.entity.Person;
import cn.kgc.mapper.PersonMapper;
import cn.kgc.util.MytabisUtil;
import jdk.internal.util.xml.impl.Input;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
@Test
public void testHelloWorld() throws IOException {
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//5.调用接口的方法
Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
//6.输出对应的返回值count
System.out.println("count:" + count);
//7.关闭 SqlSession
sqlSession.close();
}
@Test
public void testInsert() throws Exception {
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//5.调用接口的方法
Person p = new Person();
p.setName("李四");
p.setNickname("一个人的夜晚上");
p.setAge(22);
sqlSession.getMapper(PersonMapper.class).addPerson(p);
//6.提交实物,该行代码必须放在关闭sqlsession之前
sqlSession.commit();
sqlSession.close();
}
@Test
public void testupdate() throws Exception {
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
Person p2 = new Person();
p2.setId(2);
p2.setName("赵四");
p2.setNickname("来啊,造作啊");
p2.setAge(23);
sqlSession.getMapper(PersonMapper.class).updatePerson(p2);
//6.提交实物,该行代码必须放在关闭sqlsession之前
sqlSession.commit();
sqlSession.close();
}
@Test
public void testdel() throws Exception{
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
sqlSession.getMapper(PersonMapper.class).delById(2);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testdel2 () throws Exception{
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
Person person = new Person();
person.setId(2);
sqlSession.getMapper(PersonMapper.class).delById2(person);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testfindById () throws Exception{
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
Person person = sqlSession.getMapper(PersonMapper.class).findById(1);
System.out.println("id"+ person.getId()+"name"+ person.getName()+"nickname"+ person.getNickname()+"age"+ person.getAge());
sqlSession.close();
}
@Test
public void testfindAll () throws IOException{
String str ="mybatis-config.xml";
InputStream in =Resources.getResourceAsStream(str);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
List<Person> all = sqlSession.getMapper(PersonMapper.class).findAll();
for(Person p:all){
System.out.println(p);
}
sqlSession.close();
}
@Test
public void testfindByName () throws IOException{
String str ="mybatis-config.xml";
InputStream in =Resources.getResourceAsStream(str);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
List<Person> list = sqlSession.getMapper(PersonMapper.class).findByName("wqz");
for(Person p:list){
System.out.println(p);
}
sqlSession.close();
}
@Test
public void testfindByPerson () throws IOException{
String str ="mybatis-config.xml";
InputStream in =Resources.getResourceAsStream(str);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
Person person = new Person();
List<Person> list = sqlSession.getMapper(PersonMapper.class).findByPerson(person);
for(Person p:list){
System.out.println(p);
}
sqlSession.close();
}
@Test
public void findByPerson2 () throws Exception {
//1.通过流的机制获取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用builder对象的builder()方法,获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//4.调用factory对象的openSession()方法,获取SqlSession对象
SqlSession sqlSession = factory.openSession();
String name = "王五";
String nickname = "123";
List<Person> list = sqlSession.getMapper(PersonMapper.class).findByPerson2(name,nickname);
for(Person p:list){
System.out.println("name:"+p.getName()+"nickname"+p.getNickname());
}
sqlSession.close();
}
@Test
public void testfindCount(){
SqlSession sqlSession = MytabisUtil.getSqlSession();
Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
System.out.println(count);
}
@Test
public void findColList(){
SqlSession sqlSession = MytabisUtil.getSqlSession();
List<Person> colList = sqlSession.getMapper(PersonMapper.class).findColList("Id");
for (Person p:colList){
System.out.println(p);
}
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ -->
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>20211125</name>
<groupId>org.example</groupId>
<artifactId>20211125</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8888</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
<contextPath>/</contextPath>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--dependency>
<groupId>org.example</groupId>
<artifactId>[the artifact id of the block to be mounted]</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency-->
</dependencies>
</project>
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion我希望能够将模板化的YARD文档样式注释插入到我现有的Rails遗留应用程序中。目前它的评论很少。我想要具有指定参数的类header和方法header(通过从我假定的方法签名中提取)和返回值的占位符。在PHP代码中,我有一些工具可以检查代码并在适当的位置创建插入到代码中的文档header注释。在带有Ducktyping等的Ruby中,我确信诸如@params等类型之类
我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有