1
servlset实现您好:
再maven中添加java ee的相关依赖,mybatis依赖,mysql驱动依赖:
<?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</groupId>
<artifactId>lmj</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>lmj Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<!-- mybatis核心包 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
<build>
<finalName>lmj</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/Java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.* </include>
</includes>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
新建JdbcServlet类:
@WebServlet("/hello")
public class JdbcServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
out.write("你好,世界");
}
}
界面打印出:你好,世界
注意:如果resp.setContentType(“text / html的;字符集= UTF-8”);中写成的HTML /文本,则会流文件的形式向本地传输文本文件。
2.开始JDBC:修改上述代码:
@WebServlet("/hello")
public class JdbcServlet extends HttpServlet {
String URL="jdbc:mysql://127.0.0.1:3306/ssm?autoReconnect=true&useUnicode=true&characterEncoding=utf8";
String USER="root";
String PASSWORD="root";
public JdbcServlet() throws SQLException {
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
// out.write("你好,世界");
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过(java.sql下的)驱动管理类获取数据库连接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
//3.通过Connection对象创建Statement对象(Statement:用于执行SQL语句的对象,通过COnnection的createStatement()方法来获取)
Statement st=conn.createStatement();
//4.通过Statement执行SQL语句:
/*实际运行中:应该是
定义sql语句,?表示占位符。
String sql="select * from book where name=?"
PreparedStatement preparedStatement=conn.createStatement(sql)
preparedStatement.setString(1,"java程序设计")
ResultSet rs=preparedStatement.executeQuery*/
ResultSet rs=st.executeQuery("select * from book");
//5.处理(操作)数据库的返回结果(结果集ResultSet)
while(rs.next()){
out.write(rs.getString("name")+" "
+rs.getString("number")+"<br>");
}
//6.释放(关闭)资源
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
即可在页面看到从数据库查询出来的信息。
3.下面是MyBatis登场:
MyBatis的config.xml中:mybatis.xml的全局配置文件,配置了数据源(一般由第三方提供),事务(弹簧提供)等的MyBatis的运行环境,配置了(映射文件)SQL语句
的SqlSessionFactory对象中对象中对象中(会话工厂,创建的SqlSession的),的一个的SqlSession的,操作数据库(发出增删改查)(它是面向对象的v接口),执行器(执行器)(也是一个接口,基本和缓存执行(),SqlSession的内部通过执行器操作数据库.mapped statement(底层封装对象),对sql语句,输入参数,输出结果类型进行封装
MyBatis的开发流程:
1.配置文件创建工厂,2。工厂生成会话,3。会话调用执行器,4。(执行器执行映射器映射文件里的SQL语句)进而操作数据库。
的MyBatis的运行环境的配置(不引用第三方连接池)
<environmetns default =“development”>
<environmetns id =“development”>
//使用JDBC事务管理
<transactionManager type =“JDBC”>
//数据库连接池,池(集合,共用的)
<dataSource type =“POOLED”>
<property name =“driver”value =“com.mysql.Driver”> ...... <... url,.....> <... username .....> <...密码.....>
</数据源>
汇集类型请看图:
MyBatis数据源的创建过程稍微有些曲折:
从SqlSessionFactoryBuilder对象开始追溯数据源的创建.SqlSessionFactoryBuilder中9个构造方法,其中字符流4个构造方法一一对应字节流4个构造方法,都是将MyBatis的config .XML的配置文件解析成配置对象,最终导向构建(配置配置)进行小号qlSessionFactory的构造例如会在数据源中配置:最大连接数,连接时长,....先做好万事俱备,做好应对各种突发强况的准备措施,增加程序的强壮型,不至于程序很脆弱,一运行就崩的情况。
映射器映射文件:
<select id =“”> --------这里的id称为statementid,将sql语句封装到语句对象中
下面进行代码演示:
首先给出的文件结构:
全局配置的MyBatis的-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
//这里是bookmapper.xml文件的相对路径
<mapper resource="mapper/BookMapper.xml"/>
</mappers>
</configuration>
SQL映射文件如下:bookmapper.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="test">
<select id="findBookById" parameterType="int" resultType="com.lmj.ssm.Book">
select * from book where book_id=#{id}
</select>
</mapper>
实体类的书:
public class Book {
private long bookId;// 图书ID
private String name;// 图书名称
private int number;// 馆藏数量
public Book() {
}
public Book(long bookId, String name, int number) {
this.bookId = bookId;
this.name = name;
this.number = number;
}
//getter,setter方法略。。。
}
下面新建JdbcServlet,完成的servlet +的MyBatis实现对数据库的访问:
@WebServlet("/book/*")
public class JdbcServlet extends HttpServlet {
String URL="jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&characterEncoding=utf-8";
String USER="root";
String PASSWORD="root";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取方法名字
String servletPath = req.getPathInfo();// /xxxxxx.do
// 去掉斜杠和.do
// replaceAll()方法实际是采用正则表达式的规则去匹配的。在regex中"\\"表示一个"\",在java中一个"\"也要用"\\"表示。这样,前一个"\\"代表regex中的"\",后一个"\\"代表java中的"\",所以字符串转义一次,正则转义一次,那么一个斜扛要写4个。
String[] methodName1 =servletPath.substring(1,servletPath.length()).split("/");
String methodName=methodName1[0];
// String methodName = servletPath.replaceAll( "\\/", "");// xxxxxx
try {
// 利用反射获取方法
Method method = getClass().getDeclaredMethod(methodName,
HttpServletRequest.class, HttpServletResponse.class);
// 执行相应的方法
method.invoke(this, req, resp);
} catch (Exception e) {
// TODO: handle exception
}
}
public void mybatisQuery(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
String resource="mybatis-config.xml";
//Resources是在org.apache.ibatis.io.Resources包下,它是mybatis架包里
//添加依赖(<dependency><groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId>
// <version>3.4.6</version></dependency>)即可
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
Book book=sqlSession.selectOne("test.findBookById",1000);
// System.out.println(book);
out.write(String.valueOf(book));
sqlSession.close();
}
public void jdbcQuery(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
// out.write("你好,世界");
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过(java.sql下的)驱动管理类获取数据库连接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
//3.通过Connection对象创建Statement对象(Statement:用于执行SQL语句的对象,通过COnnection的createStatement()方法来获取)
Statement st=conn.createStatement();
//4.通过Statement执行SQL语句:
/*实际运行中:应该是
定义sql语句,?表示占位符。
String sql="select * from book where name=?"
PreparedStatement preparedStatement=conn.createStatement(sql)
preparedStatement.setString(1,"java程序设计")
ResultSet rs=preparedStatement.executeQuery*/
ResultSet rs=st.executeQuery("select * from book");
//5.处理(操作)数据库的返回结果(结果集ResultSet)
while(rs.next()){
out.write(rs.getString("name")+" "
+rs.getString("number")+"<br>");
}
//6.释放(关闭)资源
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
浏览器输入http:// localhost:8080 / book / jdbcQuery或者,http:// localhost:8080 / book / mybatisQuery就能看到测试结果
也可通过JUnit的测试,在测试文件下新建测试类即可:
public class Test {
@org.junit.Test
public void findUaerByIdTest() throws Exception{
String resource="mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
Book book=sqlSession.selectOne("test.findBookById",1000);
System.out.println(book);
sqlSession.close();
}
}
贴图如下:
最后注意一下:
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="com.lmj.ssm.Book">
需要与jdbcServlet中的对应:
Book book=sqlSession.selectOne("test.findBookById",1000);