参考:https://how2j.cn/k/servlet/servlet-eclipse/558.html?p=136471
1.JDBC
JDBC:Java DataBase Connectivity 可以为多种关系型数据库DBMS 提供统一的访问方式
具体是通过以下类/接口实现:
- DriverManager : 管理jdbc驱动
- Connection: 连接(通过DriverManager产生)
- Statement(PreparedStatement) :增删改查 (通过Connection产生 )
- ResultSet :返回的结果集 (上面的Statement产生 )
Connection产生操作数据库的对象:
- Statement对象:createStatement()
- PreparedStatement对象:prepareStatement()
推荐使用PreparedStatement:- 编码更加简便(避免了字符串的拼接)
- 提高性能(因为 有预编译操作,预编译只需要执行一次)
- 安全(可以有效防止sql注入)
Statement操作数据库:
- 增删改:executeUpdate()
- 查询:executeQuery();
ResultSet 保存结果集 select * from xxx
- next():光标下移,判断是否有下一条数据;true/false
- previous(): true/false
- getXxx(字段名|位置):获取具体的字段值 ,位置从1开始计数
jdbc访问数据库的具体步骤:
- a.导入驱动,加载具体的驱动类
- b.与数据库建立连接
- c.发送sql,执行
- d.处理结果集 (查询)
2.示例
DAO层:使用ORM技术实现具体的数据库操作,比如查询某个id的数据,插入1条数据等
使用时只要new一个对象然后调用对应的方法即可
public class HeroDAO {
// 构造方法中导入jar包:mysql驱动
public HeroDAO(){
try{
Class.forName("com.mysql.jdbc.Driver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
// 该方法返回管理jdbc驱动的对象
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student_sys?characterEncoding=UTF-8",
"kzzf","123456");
}
// 获取所有数据的方法
public List<Hero> list(){
List<Hero> heros = new ArrayList<>();
String sql = "select * from hero";
// 建立连接,创建执行sql语句的对象
try(Connection c = getConnection();Statement s = c.createStatement()){
ResultSet rs = s.executeQuery(sql); // 执行查询语句,获取ResultSet对象
while (rs.next()){
Hero h = new Hero(); // 创建一个Hero对象接收数据,数字代表第几列
h.id = rs.getInt(1);
h.name = rs.getString(2);
h.hp = rs.getFloat(3);
h.damage = rs.getInt(4);
heros.add(h);
}
}catch (SQLException e){
e.printStackTrace();
}
return heros;
}
public void add(Hero hero){
String sql = "insert into hero values(?,?,?,?)";
// 使用PreparedStatement对象执行sql语句,该方法是预编译的,所以可以预防sql注入
// 推荐使用PreparedStatement对象,可以用类似格式化的方法插入数据
try(Connection c = getConnection();PreparedStatement ps = c.prepareStatement(sql)){
ps.setInt(1,hero.id);
ps.setString(2,hero.name);
ps.setFloat(3,hero.hp);
ps.setInt(4,hero.damage);
ps.execute();
}catch (SQLException e){
e.printStackTrace();
}
}
}
3.控制层
public class HeroAddServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException {
request.setCharacterEncoding("UTF-8");
Hero hero = new Hero();
// 获取前端传递的数据,并转为指定类型
hero.setName(request.getParameter("name"));
hero.setHp(Float.parseFloat(request.getParameter("hp")));
hero.setDamage(Integer.parseInt(request.getParameter("damage")));
new HeroDAO().add(hero); // 调用dao层中的方法插入数据
response.sendRedirect("/heros");
}
}
4.接收前端传递的json格式参数
public class SubmitServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
String data = request.getParameter("data"); //获取前端提交的字符串参数
JSONObject json = JSONObject.fromObject(data); // 转json对象
Hero hero = (Hero) JSONObject.toBean(json,Hero.class); // 转java对象
}
}
5.返回json格式参数
public class GetHeros extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
List<Hero> heros = new ArrayList<>();
for(int i=0;i<10;i++){
Hero h = new Hero();
h.setName("盖伦");
h.setHp(500);
heros.add(h);
}
// 先序列化为json对象,再转字符串
String result = JSONSerializer.toJSON(heros).toString();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println(result);
}
}
6.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>HeroAddServlet</servlet-name>
<servlet-class>HeroAddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HeroAddServlet</servlet-name>
<url-pattern>/addHero</url-pattern>
</servlet-mapping>
</web-app>